348 lines
11 KiB
C++
348 lines
11 KiB
C++
//--------------------------------------------------------------------------//
|
|
// 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.
|