windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/calltocontext.cpp
2020-09-26 16:20:57 +08:00

1036 lines
25 KiB
C++

//--------------------------------------------------------------------------//
// Application Header Files. //
//--------------------------------------------------------------------------//
#include "precomp.h"
#include "call.h"
#include "confPolicies.h"
#include "nmldap.h"
#include "confroom.h"
#include "regentry.h"
//#include "debug.hpp"
#include "callto.h"
#include "calltoContext.h"
#include "dlgAcd.h"
#include "richAddr.h"
//--------------------------------------------------------------------------//
// CUIContext::CUIContext. //
//--------------------------------------------------------------------------//
CUIContext::CUIContext(void):
m_parent( NULL ),
m_callFlags( 0 )
{
} // End of CUIContext::CUIContext.
//--------------------------------------------------------------------------//
// CUIContext::~CUIContext. //
//--------------------------------------------------------------------------//
CUIContext::~CUIContext(void)
{
} // End of CUIContext::~CUIContext.
//--------------------------------------------------------------------------//
// CUIContext::disambiguate. //
//--------------------------------------------------------------------------//
HRESULT
CUIContext::disambiguate
(
ICalltoCollection * const calltoCollection,
ICallto * const ,//emptyCallto,
const ICallto ** const selectedCallto
){
//trace( TEXT( "CUIContext::disambiguate()\r\n" ) );
HRESULT result = S_FALSE;
if( calltoCollection->get_count() > 1 )
{
static HRESULT confidenceLevels[] = {S_CONFIDENCE_CERTITUDE, S_CONFIDENCE_HIGH, S_CONFIDENCE_MEDIUM, S_CONFIDENCE_LOW};
// Just take the first highest confidence one until we have time to do something superior...
for( int level = 0; (level < elementsof( confidenceLevels )) && (result == S_FALSE); level++ )
{
for( *selectedCallto = calltoCollection->get_first();
*selectedCallto != NULL;
*selectedCallto = calltoCollection->get_next() )
{
if( (*selectedCallto)->get_confidence() == confidenceLevels[ level ] )
{
result = S_OK;
break;
}
}
}
}
if( result != S_OK )
{
::MessageBox( m_parent, RES2T( IDS_UNRESOLVED_MESSAGE ), RES2T( IDS_UNRESOLVED_CAPTION ), MB_OK );
*selectedCallto = NULL;
}
return( result );
}; // End of class CUIContext::disambiguate.
//--------------------------------------------------------------------------//
// CUIContext::set_parentWindow. //
//--------------------------------------------------------------------------//
void
CUIContext::set_parentWindow
(
const HWND window
){
//trace( TEXT( "CUIContext::set_parentWindow()\r\n" ) );
m_parent = window;
}; // End of class CUIContext::set_parentWindow.
//--------------------------------------------------------------------------//
// CUIContext::set_callFlags. //
//--------------------------------------------------------------------------//
void
CUIContext::set_callFlags
(
const DWORD callFlags
){
//trace( TEXT( "CUIContext::set_callFlags()\r\n" ) );
m_callFlags = callFlags;
}; // End of class CUIContext::set_callFlags.
//--------------------------------------------------------------------------//
// CGatekeeperContext::CGatekeeperContext. //
//--------------------------------------------------------------------------//
CGatekeeperContext::CGatekeeperContext(void):
m_enabled( false ),
m_ipAddress( NULL )
{
} // End of CGatekeeperContext::CGatekeeperContext.
//--------------------------------------------------------------------------//
// CGatekeeperContext::~CGatekeeperContext. //
//--------------------------------------------------------------------------//
CGatekeeperContext::~CGatekeeperContext(void)
{
delete [] m_ipAddress;
} // End of CGatekeeperContext::~CGatekeeperContext.
//--------------------------------------------------------------------------//
// CGatekeeperContext::isEnabled. //
//--------------------------------------------------------------------------//
bool
CGatekeeperContext::isEnabled(void) const
{
return( m_enabled && (get_ipAddress() != NULL) );
} // End of CGatekeeperContext::isEnabled.
//--------------------------------------------------------------------------//
// CGatekeeperContext::get_ipAddress. //
//--------------------------------------------------------------------------//
const TCHAR *
CGatekeeperContext::get_ipAddress(void) const
{
return( m_ipAddress );
} // End of CGatekeeperContext::get_ipAddress.
//--------------------------------------------------------------------------//
// CGatekeeperContext::set_enabled. //
//--------------------------------------------------------------------------//
void
CGatekeeperContext::set_enabled
(
const bool enabled
){
m_enabled = enabled;
} // End of CGatekeeperContext::set_enabled.
//--------------------------------------------------------------------------//
// CGatekeeperContext::set_gatekeeperName. //
//--------------------------------------------------------------------------//
HRESULT
CGatekeeperContext::set_gatekeeperName
(
const TCHAR * const gatekeeperName
){
TCHAR ipAddress[ MAX_PATH ];
HRESULT result = CCalltoContext::get_ipAddressFromName( gatekeeperName, ipAddress, elementsof( ipAddress ) );
if( result == S_OK )
{
result = set_ipAddress( ipAddress );
}
return( result );
} // End of CGatekeeperContext::set_gatekeeperName.
//--------------------------------------------------------------------------//
// CGatekeeperContext::set_ipAddress. //
//--------------------------------------------------------------------------//
HRESULT
CGatekeeperContext::set_ipAddress
(
const TCHAR * const ipAddress
){
HRESULT result = S_FALSE;
if( m_ipAddress != NULL )
{
delete [] m_ipAddress;
m_ipAddress = NULL;
}
if( ipAddress != NULL )
{
if( (m_ipAddress = new TCHAR [ lstrlen( ipAddress ) + 1 ]) == NULL )
{
result = E_OUTOFMEMORY;
}
else
{
lstrcpy( m_ipAddress, ipAddress );
result = S_OK;
}
}
return( result );
} // End of CGatekeeperContext::set_ipAddress.
//--------------------------------------------------------------------------//
// CGatewayContext::CGatewayContext. //
//--------------------------------------------------------------------------//
CGatewayContext::CGatewayContext(void):
m_enabled( false ),
m_ipAddress( NULL )
{
} // End of CGatewayContext::CGatewayContext.
//--------------------------------------------------------------------------//
// CGatewayContext::~CGatewayContext. //
//--------------------------------------------------------------------------//
CGatewayContext::~CGatewayContext(void)
{
delete [] m_ipAddress;
} // End of CGatewayContext::~CGatewayContext.
//--------------------------------------------------------------------------//
// CGatewayContext::isEnabled. //
//--------------------------------------------------------------------------//
bool
CGatewayContext::isEnabled(void) const
{
return( m_enabled && (get_ipAddress() != NULL) );
} // End of CGatewayContext::isEnabled.
//--------------------------------------------------------------------------//
// CGatewayContext::get_ipAddress. //
//--------------------------------------------------------------------------//
const TCHAR *
CGatewayContext::get_ipAddress(void) const
{
return( m_ipAddress );
} // End of CGatewayContext::get_ipAddress.
//--------------------------------------------------------------------------//
// CGatewayContext::set_enabled. //
//--------------------------------------------------------------------------//
void
CGatewayContext::set_enabled
(
const bool enabled
){
m_enabled = enabled;
} // End of CGatewayContext::set_enabled.
//--------------------------------------------------------------------------//
// CGatewayContext::set_gatewayName. //
//--------------------------------------------------------------------------//
HRESULT
CGatewayContext::set_gatewayName
(
const TCHAR * const gatewayName
){
TCHAR ipAddress[ MAX_PATH ];
HRESULT result = CCalltoContext::get_ipAddressFromName( gatewayName, ipAddress, elementsof( ipAddress ) );
if( result == S_OK )
{
result = set_ipAddress( ipAddress );
}
return( result );
} // End of CGatewayContext::set_gatewayName.
//--------------------------------------------------------------------------//
// CGatewayContext::set_ipAddress. //
//--------------------------------------------------------------------------//
HRESULT
CGatewayContext::set_ipAddress
(
const TCHAR * const ipAddress
){
HRESULT result = S_FALSE;
if( m_ipAddress != NULL )
{
delete [] m_ipAddress;
m_ipAddress = NULL;
}
if( ipAddress != NULL )
{
if( (m_ipAddress = new TCHAR [ lstrlen( ipAddress ) + 1 ]) == NULL )
{
result = E_OUTOFMEMORY;
}
else
{
lstrcpy( m_ipAddress, ipAddress );
result = S_OK;
}
}
return( result );
} // End of CGatewayContext::set_ipAddress.
//--------------------------------------------------------------------------//
// CILSContext::CILSContext. //
//--------------------------------------------------------------------------//
CILSContext::CILSContext
(
const TCHAR * const ilsServer
):
m_enabled( false ),
m_ipAddress( NULL ),
m_ilsName( NULL )
{
} // End of CILSContext::CILSContext.
//--------------------------------------------------------------------------//
// CILSContext::~CILSContext. //
//--------------------------------------------------------------------------//
CILSContext::~CILSContext(void)
{
delete [] m_ipAddress;
delete [] m_ilsName;
} // End of CILSContext::~CILSContext.
//--------------------------------------------------------------------------//
// CILSContext::isEnabled. //
//--------------------------------------------------------------------------//
bool
CILSContext::isEnabled(void) const
{
return( (g_pLDAP != NULL) && (ConfPolicies::GetCallingMode() == ConfPolicies::CallingMode_Direct) );
} // End of CILSContext::isEnabled.
//--------------------------------------------------------------------------//
// CILSContext::get_ipAddress. //
//--------------------------------------------------------------------------//
const TCHAR *
CILSContext::get_ipAddress(void) const
{
return( m_ipAddress );
} // End of CILSContext::get_ipAddress.
//--------------------------------------------------------------------------//
// CILSContext::get_ilsName. //
//--------------------------------------------------------------------------//
const TCHAR * const
CILSContext::get_ilsName(void) const
{
return( m_ilsName );
} // End of CILSContext::get_ilsName.
//--------------------------------------------------------------------------//
// CILSContext::set_enabled. //
//--------------------------------------------------------------------------//
void
CILSContext::set_enabled
(
const bool enabled
){
m_enabled = enabled;
} // End of CILSContext::set_enabled.
//--------------------------------------------------------------------------//
// CILSContext::set_ilsName. //
//--------------------------------------------------------------------------//
HRESULT
CILSContext::set_ilsName
(
const TCHAR * const ilsName
){
HRESULT result;
if( m_ilsName && lstrcmpi( ilsName, m_ilsName ) == 0 )
{
result = S_OK;
}
else
{
result = E_FAIL;
if( m_ilsName != NULL )
{
delete [] m_ilsName;
m_ilsName = NULL;
}
if( ilsName != NULL )
{
if( (m_ilsName = new TCHAR [ lstrlen( ilsName ) + 1 ]) == NULL )
{
result = E_OUTOFMEMORY;
}
else
{
TCHAR ipAddress[ MAX_PATH ];
if( (result = CCalltoContext::get_ipAddressFromName( ilsName, ipAddress, elementsof( ipAddress ) )) == S_OK )
{
if( (result = set_ipAddress( ipAddress )) == S_OK )
{
lstrcpy( m_ilsName, ilsName );
}
}
}
}
}
return( result );
} // End of CILSContext::set_ilsName.
//--------------------------------------------------------------------------//
// CILSContext::set_ipAddress. //
//--------------------------------------------------------------------------//
HRESULT
CILSContext::set_ipAddress
(
const TCHAR * const ipAddress
){
HRESULT result = S_FALSE;
if( m_ipAddress != NULL )
{
delete [] m_ipAddress;
m_ipAddress = NULL;
}
if( ipAddress != NULL )
{
if( (m_ipAddress = new TCHAR [ lstrlen( ipAddress ) + 1 ]) == NULL )
{
result = E_OUTOFMEMORY;
}
else
{
lstrcpy( m_ipAddress, ipAddress );
result = S_OK;
}
}
return( result );
} // End of CILSContext::set_ipAddress.
//--------------------------------------------------------------------------//
// CCalltoContext::CCalltoContext. //
//--------------------------------------------------------------------------//
CCalltoContext::CCalltoContext()
{
} // End of CCalltoContext::CCalltoContext.
//--------------------------------------------------------------------------//
// CCalltoContext::~CCalltoContext. //
//--------------------------------------------------------------------------//
CCalltoContext::~CCalltoContext()
{
} // End of CCalltoContext::~CCalltoContext.
//--------------------------------------------------------------------------//
// CCalltoContext::callto. //
//--------------------------------------------------------------------------//
HRESULT
CCalltoContext::callto
(
const ICalltoProperties * const calltoProperties,
INmCall** ppInternalCall
){
HRESULT result = CRPlaceCall( calltoProperties, this, ppInternalCall );
if( FAILED( result ) )
{
DisplayCallError( result, calltoProperties->get_displayName() );
}
return( result );
} // End of CCalltoContext::callto.
//--------------------------------------------------------------------------//
// CCalltoContext::get_gatekeeperContext. //
//--------------------------------------------------------------------------//
const IGatekeeperContext * const
CCalltoContext::get_gatekeeperContext(void) const
{
return( (CGatekeeperContext::isEnabled())? this: NULL );
} // End of CCalltoContext::get_gatekeeperContext.
//--------------------------------------------------------------------------//
// CCalltoContext::get_gatewayContext. //
//--------------------------------------------------------------------------//
const IGatewayContext * const
CCalltoContext::get_gatewayContext(void) const
{
return( (CGatewayContext::isEnabled())? this: NULL );
} // End of CCalltoContext::get_gatewayContext.
//--------------------------------------------------------------------------//
// CCalltoContext::get_ilsContext. //
//--------------------------------------------------------------------------//
const IILSContext * const
CCalltoContext::get_ilsContext(void) const
{
return( (CILSContext::isEnabled())? this: NULL );
} // End of CCalltoContext::get_ilsContext.
//--------------------------------------------------------------------------//
// CCalltoContext::get_mutableUIContext. //
//--------------------------------------------------------------------------//
IMutableUIContext * const
CCalltoContext::get_mutableUIContext(void) const
{
return( (IMutableUIContext * const) this );
} // End of CCalltoContext::get_mutableUIContext.
//--------------------------------------------------------------------------//
// CCalltoContext::get_mutableGatekeeperContext. //
//--------------------------------------------------------------------------//
IMutableGatekeeperContext * const
CCalltoContext::get_mutableGatekeeperContext(void) const
{
return( (IMutableGatekeeperContext * const) this );
} // End of CCalltoContext::get_mutableGatekeeperContext.
//--------------------------------------------------------------------------//
// CCalltoContext::get_mutableGatewayContext. //
//--------------------------------------------------------------------------//
IMutableGatewayContext * const
CCalltoContext::get_mutableGatewayContext(void) const
{
return( (IMutableGatewayContext * const) this );
} // End of CCalltoContext::get_mutableGatewayContext.
//--------------------------------------------------------------------------//
// CCalltoContext::get_mutableIlsContext. //
//--------------------------------------------------------------------------//
IMutableILSContext * const
CCalltoContext::get_mutableIlsContext(void) const
{
return( (IMutableILSContext * const) this );
} // End of CCalltoContext::get_mutableIlsContext.
//--------------------------------------------------------------------------//
// CCalltoContext::isPhoneNumber. //
//--------------------------------------------------------------------------//
bool
CCalltoContext::isPhoneNumber
(
const TCHAR * phone
){
bool result = ((phone != NULL) && (phone[ 0 ] != '\0'));
while( (phone != NULL) && (phone[ 0 ] != '\0') )
{
switch( phone[ 0 ] )
{
default:
result = false; // fall through...
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '(':
case ')':
case '#':
case '*':
case '-':
case ',':
case '+':
case ' ':
break;
}
phone++;
}
return( result );
} // End of CCalltoContext::isPhoneNumber.
//--------------------------------------------------------------------------//
// CCalltoContext::toE164. //
//--------------------------------------------------------------------------//
bool
CCalltoContext::toE164
(
const TCHAR * phone,
TCHAR * base10,
int size
){
static TCHAR base10map[] =
{
0, -1, -1, '#', -1, -1, -1, -1, // !"#$%&'
0, 0, '*', -1, ',', 0, 0, -1, // ()*+,-./
'0', '1', '2', '3', '4', '5', '6', '7', // 01234567
'8', '9', -1, -1, -1, -1, -1, -1, // 89:;<=>?
-1, '2', '2', '2', '3', '3', '3', '4', // @ABCDEFG
'4', '4', '5', '5', '5', '6', '6', '6', // HIJKLMNO
'7', '7', '7', '7', '8', '8', '8', '9', // PQRSTUVW
'9', '9', '9', -1, -1, -1, -1, -1, // XYZ[\]^_
-1, '2', '2', '2', '3', '3', '3', '4', // `abcdefg
'4', '4', '5', '5', '5', '6', '6', '6', // hijklmno
'7', '7', '7', '7', '8', '8', '8', '9', // pqrstuvw
'9', '9', '9' // xyz
};
bool result = true;
for( ; (*phone != NULL) && ((size > 0) || (base10 == NULL)) && result; phone++ )
{
if( (*phone >= ' ') && (*phone < (TCHAR) (' ' + elementsof( base10map ))) )
{
TCHAR mapValue = base10map[ *phone - ' ' ];
if( mapValue == (TCHAR) -1 )
{
result = false;
}
else if( mapValue != (TCHAR) 0 )
{
if( base10 != NULL )
{
*base10++ = mapValue;
size--;
}
}
}
else
{
result = false;
}
}
if( (size <= 0) && (base10 != NULL) )
{
result = false;
}
else if( result )
{
if( base10 != NULL )
{
*base10 = NULL;
}
}
return( result );
} // End of CCalltoContext::toE164.
//--------------------------------------------------------------------------//
// CCalltoContext::isIPAddress. //
//--------------------------------------------------------------------------//
bool
CCalltoContext::isIPAddress
(
const TCHAR * const ipAddress
){
int parts = 0;
bool result;
if( (result = (ipAddress != NULL)) != false )
{
const TCHAR * ptr = ipAddress;
bool newPart = true;
int ipByte = 0;
int base = 10;
while( result && (*ptr != NULL) && (parts <= 16) )
{
if( (*ptr >= '0') && (*ptr <= '9') )
{
if( newPart )
{
parts++;
newPart = false;
}
if( (*ptr == '0') && (ipByte == 0) && (base == 10) )
{
base = 8;
}
else if( (base == 8) && ((*ptr == '8') || (*ptr == '9')) )
{
result = false;
}
else
{
ipByte = (ipByte * base) + (*ptr - '0');
if( ipByte > 255 )
{
result = false;
}
}
}
else if( (*ptr >= 'A') && (*ptr <= 'F') )
{
if( base != 16 )
{
result = false;
}
else
{
if( newPart )
{
parts++;
newPart = false;
}
ipByte = (ipByte * 16) + (*ptr - 'A' + 10);
if( ipByte > 255 )
{
result = false;
}
}
}
else if( (*ptr >= 'a') && (*ptr <= 'f') )
{
if( base != 16 )
{
result = false;
}
else
{
if( newPart )
{
parts++;
newPart = false;
}
ipByte = (ipByte * 16) + (*ptr - 'a' + 10);
if( ipByte > 255 )
{
result = false;
}
}
}
else if( *ptr == '.' )
{
newPart = true;
ipByte = 0;
base = 10;
}
else if( (*ptr == 'x') || (*ptr == 'X') )
{
base = 16;
result = (ipByte == 0);
}
else
{
result = false;
}
ptr++;
}
if( result )
{
if( (parts != 4) && (parts != 16) ) // 4 for IPv4, 16 for IPv6 (IPng)...
{
if( (result = (parts < 4)) != false )
{
#if !defined( UNICODE )
result = (inet_addr( ipAddress ) != INADDR_NONE); // Check for valid 1, 2, or 3 part IPv4 address...
#else
result = false;
char * ansiIPAddress;
int size;
size = WideCharToMultiByte( CP_ACP, // code page
0, // performance and mapping flags
ipAddress, // address of wide-character string
-1, // number of characters in string
NULL, // address of buffer for new string
0, // size of buffer
NULL, // address of default for unmappable characters
NULL ); // address of flag set when default char. used
if( (ansiIPAddress = new char [ size ]) != NULL )
{
size = WideCharToMultiByte( CP_ACP, // code page
0, // performance and mapping flags
ipAddress, // address of wide-character string
-1, // number of characters in string
ansiIPAddress, // address of buffer for new string
size, // size of buffer
NULL, // address of default for unmappable characters
NULL ); // address of flag set when default char. used
if( size != 0 )
{
result = (inet_addr( ansiIPAddress ) != INADDR_NONE); // Check for valid 1-4 part IPv4 address...
}
delete [] ansiIPAddress;
}
#endif // !defined( UNICODE )
}
}
}
}
return( result );
} // End of CCalltoContext::isIPAddress.
//--------------------------------------------------------------------------//
// CCalltoContext::get_ipAddressFromName. //
//--------------------------------------------------------------------------//
HRESULT
CCalltoContext::get_ipAddressFromName
(
const TCHAR * const name,
TCHAR * buffer,
int length
){
HRESULT result = S_FALSE;
if( (name != NULL) && (buffer != NULL) )
{
if( isIPAddress( name ) )
{
if( lstrlen( name ) < length )
{
lstrcpy( buffer, name );
result = S_OK;
}
}
else
{
HOSTENT * hostEntry;
#if !defined( UNICODE )
if( (hostEntry = gethostbyname( name )) != NULL )
{
if( hostEntry->h_addr_list[ 0 ] != NULL )
{
const char * const ipAddress = inet_ntoa( *((in_addr *) hostEntry->h_addr_list[ 0 ]) );
if( lstrlen( ipAddress ) < length )
{
lstrcpy( buffer, ipAddress );
result = S_OK;
}
}
}
#else
char * ansiHost;
int size;
size = WideCharToMultiByte( CP_ACP, // code page
0, // performance and mapping flags
name, // address of wide-character string
-1, // number of characters in string
NULL, // address of buffer for new string
0, // size of buffer
NULL, // address of default for unmappable characters
NULL ); // address of flag set when default char. used
if( (ansiHost = new char [ size ]) == NULL )
{
result = E_OUTOFMEMORY;
}
else
{
size = WideCharToMultiByte( CP_ACP, // code page
0, // performance and mapping flags
name, // address of wide-character string
-1, // number of characters in string
ansiHost, // address of buffer for new string
size, // size of buffer
NULL, // address of default for unmappable characters
NULL ); // address of flag set when default char. used
if( size != 0 )
{
if( (hostEntry = gethostbyname( ansiHost )) != NULL )
{
if( hostEntry->h_addr_list[ 0 ] != NULL )
{
const char * const ipAddress = inet_ntoa( *((in_addr *) hostEntry->h_addr_list[ 0 ]) );
if( lstrlen( ipAddress ) < length )
{
MultiByteToWideChar( CP_ACP, // code page
MB_PRECOMPOSED, // character-type options
ipAddress, // string to convert
-1, // length of string to convert
buffer, // address of wide character buffer
length ); // size of buffer
result = S_OK;
}
}
}
}
delete [] ansiHost;
}
#endif // !defined( UNICODE )
}
}
return( result );
} // End of CCalltoContext::get_ipAddressFromName.
//--------------------------------------------------------------------------//
// CCalltoContext::get_ipAddressFromILSEmail. //
//--------------------------------------------------------------------------//
HRESULT
CCalltoContext::get_ipAddressFromILSEmail
(
const TCHAR * const ilsServer,
const TCHAR * const ilsPort,
const TCHAR * const email,
TCHAR * const ipAddress,
const int size
){
HRESULT result;
if( g_pLDAP == NULL )
{
g_pLDAP = new CNmLDAP;
}
if( g_pLDAP == NULL )
{
result = E_FAIL;
}
else
{
int port = (ilsPort != NULL)? (int) DecimalStringToUINT( ilsPort ): LDAP_PORT;
result = g_pLDAP->ResolveUser( email, ilsServer, ipAddress, size, port );
}
return( result );
} // End of CCalltoContext::get_ipAddressFromILSEmail.