//--------------------------------------------------------------------------// // Application Header Files. // //--------------------------------------------------------------------------// #include "precomp.h" #include "callto.h" #include "calltoContext.h" #include "calltoDisambiguator.h" //--------------------------------------------------------------------------// // CCalltoDisambiguator::CCalltoDisambiguator. // //--------------------------------------------------------------------------// CCalltoDisambiguator::CCalltoDisambiguator(void): m_registeredDisambiguators( 0 ) { addDisambiguator( &m_gatekeeperDisambiguator ); addDisambiguator( &m_gatewayDisambiguator ); addDisambiguator( &m_computerDisambiguator ); addDisambiguator( &m_ilsDisambiguator ); addDisambiguator( &m_unrecognizedDisambiguator ); } // End of CCalltoDisambiguator::CCalltoDisambiguator. //--------------------------------------------------------------------------// // CCalltoDisambiguator::~CCalltoDisambiguator. // //--------------------------------------------------------------------------// CCalltoDisambiguator::~CCalltoDisambiguator() { } // End of CCalltoDisambiguator::~CCalltoDisambiguator. //--------------------------------------------------------------------------// // CCalltoDisambiguator::disambiguate. // //--------------------------------------------------------------------------// HRESULT CCalltoDisambiguator::disambiguate ( const ICalltoContext * const calltoContext, ICalltoCollection * const resolvedCalltoCollection, CCalltoCollection * const disambiguatedCalltoCollection ){ HRESULT result; if( (calltoContext == NULL) || (resolvedCalltoCollection == NULL) || (disambiguatedCalltoCollection == NULL) ) { result = E_POINTER; } else { result = S_UNDISAMBIGUATED; disambiguatedCalltoCollection->reset(); // Run through "smart" disambiguators... static HRESULT confidenceLevels[] = {S_CONFIDENCE_CERTITUDE, S_CONFIDENCE_HIGH, S_CONFIDENCE_MEDIUM, S_CONFIDENCE_LOW}; const ICallto * resolvedCallto; HRESULT resolveResult = S_OK; for( int level = 0; (level < elementsof( confidenceLevels )) && (resolveResult != S_CONFIDENCE_CERTITUDE); level++ ) { for( resolvedCallto = resolvedCalltoCollection->get_first(); (resolvedCallto != NULL) && (resolveResult != S_CONFIDENCE_CERTITUDE); resolvedCallto = resolvedCalltoCollection->get_next() ) { if( resolvedCallto->get_confidence() == confidenceLevels[ level ] ) { for( int nn = 0; (nn < m_registeredDisambiguators) && (resolveResult != S_CONFIDENCE_CERTITUDE); nn++ ) { resolveResult = m_disambiguators[ nn ]->disambiguate( calltoContext, disambiguatedCalltoCollection, resolvedCallto ); if( FAILED( resolveResult ) && (!FAILED( result )) ) { result = resolveResult; } } } } } } return( result ); } // End of CCalltoDisambiguator::disambiguate. //--------------------------------------------------------------------------// // CCalltoDisambiguator::addDisambiguator. // //--------------------------------------------------------------------------// bool CCalltoDisambiguator::addDisambiguator ( IDisambiguator * const disambiguator ){ //assert( disambiguator != NULL, TEXT( "attempted to add NULL disambiguator\r\n" ) ); //assert( m_registeredDisambiguators < elementsof( m_disambiguators ), TEXT( "attempted to add to many disambiguators: %d\r\n" ), m_registeredDisambiguators ); if( (disambiguator != NULL) && (m_registeredDisambiguators < elementsof( m_disambiguators )) ) { m_disambiguators[ m_registeredDisambiguators++ ] = disambiguator; } return( (disambiguator !=NULL ) && (m_registeredDisambiguators <= elementsof( m_disambiguators )) ); } // End of CCalltoDisambiguator::addDisambiguator. //--------------------------------------------------------------------------// // CGatekeeperDisambiguator::disambiguate. // //--------------------------------------------------------------------------// HRESULT CGatekeeperDisambiguator::disambiguate ( const ICalltoContext * const calltoContext, IMutableCalltoCollection * const calltoCollection, const ICallto * const resolvedCallto ){ const IGatekeeperContext * const gatekeeperContext = calltoContext->get_gatekeeperContext(); HRESULT result = S_UNDISAMBIGUATED; if( gatekeeperContext != NULL ) { ICallto * disambiguatedCallto = calltoCollection->get_nextUnused(); if( disambiguatedCallto != NULL ) { disambiguatedCallto->set_qualifiedName( resolvedCallto->get_qualifiedName() ); disambiguatedCallto->set_destination( gatekeeperContext->get_ipAddress() ); disambiguatedCallto->set_confidence( S_CONFIDENCE_CERTITUDE ); result = S_CONFIDENCE_CERTITUDE; } } return( result ); } // End of CGatekeeperDisambiguator::disambiguate. //--------------------------------------------------------------------------// // CGatewayDisambiguator::disambiguate. // //--------------------------------------------------------------------------// HRESULT CGatewayDisambiguator::disambiguate ( const ICalltoContext * const calltoContext, IMutableCalltoCollection * const calltoCollection, const ICallto * const resolvedCallto ){ HRESULT result = S_UNDISAMBIGUATED; if( lstrcmpi( resolvedCallto->get_type(), TEXT( "phone" ) ) == 0 ) { const TCHAR * const gateway = resolvedCallto->get_gateway(); if( gateway != NULL ) { TCHAR ipAddress[ MAX_PATH ]; result = CCalltoContext::get_ipAddressFromName( gateway, ipAddress, elementsof( ipAddress ) ); if( result == S_OK ) { ICallto * disambiguatedCallto = calltoCollection->get_nextUnused(); if( disambiguatedCallto == NULL ) { result = S_UNDISAMBIGUATED; } else { disambiguatedCallto->set_qualifiedName( resolvedCallto->get_qualifiedName() ); disambiguatedCallto->set_destination( ipAddress ); disambiguatedCallto->set_confidence( S_CONFIDENCE_CERTITUDE ); result = S_CONFIDENCE_CERTITUDE; } } } else { const IGatewayContext * const gatewayContext = calltoContext->get_gatewayContext(); if( gatewayContext != NULL ) { ICallto * disambiguatedCallto = calltoCollection->get_nextUnused(); if( disambiguatedCallto != NULL ) { disambiguatedCallto->set_qualifiedName( resolvedCallto->get_qualifiedName() ); disambiguatedCallto->set_destination( gatewayContext->get_ipAddress() ); disambiguatedCallto->set_confidence( S_CONFIDENCE_CERTITUDE ); result = S_CONFIDENCE_CERTITUDE; } } } } return( result ); } // End of CGatewayDisambiguator::disambiguate. //--------------------------------------------------------------------------// // CComputerDisambiguator::disambiguate. // //--------------------------------------------------------------------------// HRESULT CComputerDisambiguator::disambiguate ( const ICalltoContext * const calltoContext, IMutableCalltoCollection * const calltoCollection, const ICallto * const resolvedCallto ){ bool ip = (lstrcmpi( resolvedCallto->get_type(), TEXT( "ip" ) ) == 0); bool computer = (lstrcmpi( resolvedCallto->get_type(), TEXT( "computer" ) ) == 0); HRESULT result = S_UNDISAMBIGUATED; if( ip || computer ) { TCHAR ipAddress[ 64 ]; result = CCalltoContext::get_ipAddressFromName( resolvedCallto->get_value(), ipAddress, elementsof( ipAddress ) ); if( result != S_OK ) { result = S_UNDISAMBIGUATED; } else { ICallto * disambiguatedCallto = calltoCollection->get_nextUnused(); if( disambiguatedCallto == NULL ) { result = S_UNDISAMBIGUATED; } else { result = S_CONFIDENCE_CERTITUDE; disambiguatedCallto->set_qualifiedName( resolvedCallto->get_qualifiedName() ); disambiguatedCallto->set_destination( ipAddress ); disambiguatedCallto->set_confidence( result ); } } } return( result ); } // End of CComputerDisambiguator::disambiguate. //--------------------------------------------------------------------------// // CILSDisambiguator::disambiguate. // //--------------------------------------------------------------------------// HRESULT CILSDisambiguator::disambiguate ( const ICalltoContext * const calltoContext, IMutableCalltoCollection * const calltoCollection, const ICallto * const resolvedCallto ){ const IILSContext * const ilsContext = calltoContext->get_ilsContext(); const TCHAR * const type = resolvedCallto->get_type(); const TCHAR * ilsServer = resolvedCallto->get_server(); HRESULT result = S_FALSE; TCHAR ipAddress[ MAX_PATH ]; if( (ilsServer == NULL) && (ilsContext != NULL) ) { ilsServer = ilsContext->get_ilsName(); } if( ilsServer != NULL ) { bool ils = (lstrcmpi( type, TEXT( "ils" ) ) == 0); if( ils || (lstrcmpi( type, TEXT( "email" ) ) == 0) ) { result = CCalltoContext::get_ipAddressFromILSEmail( ilsServer, resolvedCallto->get_serverPort(), resolvedCallto->get_value(), ipAddress, elementsof( ipAddress ) ); if( result == S_OK ) { ICallto * disambiguatedCallto = calltoCollection->get_nextUnused(); if( disambiguatedCallto == NULL ) { result = S_UNDISAMBIGUATED; } else { result = (ils)? S_CONFIDENCE_HIGH: S_CONFIDENCE_MEDIUM; disambiguatedCallto->set_qualifiedName( resolvedCallto->get_qualifiedName() ); disambiguatedCallto->set_destination( ipAddress ); disambiguatedCallto->set_confidence( result ); } } } } return( result ); } // End of CILSDisambiguator::disambiguate. //--------------------------------------------------------------------------// // CUnrecognizedDisambiguator::disambiguate. // //--------------------------------------------------------------------------// HRESULT CUnrecognizedDisambiguator::disambiguate ( const ICalltoContext * const calltoContext, IMutableCalltoCollection * const calltoCollection, const ICallto * const resolvedCallto ){ if( calltoCollection->get_count() == 0 ) { const TCHAR * const type = resolvedCallto->get_type(); bool phone = (lstrcmpi( type, TEXT( "phone" ) ) == 0); bool email = (lstrcmpi( type, TEXT( "email" ) ) == 0); bool ip = (lstrcmpi( type, TEXT( "ip" ) ) == 0); bool computer = (lstrcmpi( type, TEXT( "computer" ) ) == 0); bool ils = (lstrcmpi( type, TEXT( "ils" ) ) == 0); bool string = (lstrcmpi( type, TEXT( "string" ) ) == 0); if( string || ((!phone) && (!email) && (!ip) && (!computer) && (!ils)) ) { ICallto * disambiguatedCallto = calltoCollection->get_nextUnused(); if( disambiguatedCallto != NULL ) { disambiguatedCallto->set_qualifiedName( resolvedCallto->get_qualifiedName() ); disambiguatedCallto->set_confidence( S_UNDISAMBIGUATED ); } } } return( S_UNDISAMBIGUATED ); } // End of CUnrecognizedDisambiguator::disambiguate.