1036 lines
25 KiB
C++
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.
|