682 lines
24 KiB
C++
682 lines
24 KiB
C++
//--------------------------------------------------------------------------//
|
|
// Header Files. //
|
|
//--------------------------------------------------------------------------//
|
|
#include "precomp.h"
|
|
#include "resource.h"
|
|
#include "help_ids.h"
|
|
#include "dlgcall2.h"
|
|
#include "mrulist2.h"
|
|
#include "dlgacd.h"
|
|
#include "dlgCall2.h"
|
|
#include "calv.h"
|
|
#include "dirutil.h"
|
|
#include "callto.h"
|
|
#include "conf.h"
|
|
#include "confroom.h"
|
|
#include "confpolicies.h"
|
|
|
|
|
|
extern void UpdateSecurityCheck(CConfRoom *pConfRoom, HWND hDlg, UINT idCheck);
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::CDlgAcd. //
|
|
//--------------------------------------------------------------------------//
|
|
CDlgAcd::CDlgAcd(CConfRoom *pConfRoom):
|
|
m_hwnd( NULL ),
|
|
m_nameCombo( NULL ),
|
|
m_addressTypeCombo( NULL ),
|
|
m_pRai( NULL ),
|
|
m_mruRai( NULL ),
|
|
m_pConfRoom( pConfRoom ),
|
|
m_secure( false )
|
|
{
|
|
// Ensure the common controls are loaded...
|
|
INITCOMMONCONTROLSEX icc;
|
|
|
|
icc.dwSize = sizeof(icc);
|
|
icc.dwICC = ICC_WIN95_CLASSES | ICC_COOL_CLASSES | ICC_USEREX_CLASSES;
|
|
|
|
InitCommonControlsEx( &icc );
|
|
|
|
} // End of CDlgAcd::CDlgAcd.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::~CDlgAcd. //
|
|
//--------------------------------------------------------------------------//
|
|
CDlgAcd::~CDlgAcd()
|
|
{
|
|
|
|
ClearRai( &m_mruRai );
|
|
|
|
} // End of CDlgAcd::~CDlgAcd.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::doModal. //
|
|
//--------------------------------------------------------------------------//
|
|
INT_PTR CDlgAcd::doModal
|
|
(
|
|
HWND parent,
|
|
RichAddressInfo * rai,
|
|
bool & secure
|
|
){
|
|
INT_PTR result;
|
|
|
|
m_pRai = rai;
|
|
m_secure = secure;
|
|
|
|
result = DialogBoxParam( ::GetInstanceHandle(),
|
|
MAKEINTRESOURCE( IDD_ACD ),
|
|
parent,
|
|
DlgProcAcd,
|
|
(LPARAM) this );
|
|
|
|
secure = m_secure;
|
|
|
|
return( result );
|
|
|
|
} // End of CDlgAcd::doModal.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::DlgProcAcd. //
|
|
//--------------------------------------------------------------------------//
|
|
INT_PTR
|
|
CALLBACK
|
|
CDlgAcd::DlgProcAcd
|
|
(
|
|
HWND dialog,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
){
|
|
static const DWORD helpIDMap[] =
|
|
{
|
|
IDC_STATIC_ADDRESS, IDH_GENERAL_GENERAL,
|
|
IDB_ACD_ADDRESS, IDH_PLACECALL_TO_TEXT,
|
|
IDL_ACD_ADDRESS, IDH_PLACECALL_TO_TEXT,
|
|
IDC_ACD_USING_STATIC, IDH_PLACECALL_USING,
|
|
IDL_ACD_ADDR_TYPE, IDH_PLACECALL_USING,
|
|
IDC_SECURE_CALL, IDH_PLACECALL_SECURITY_CHKBX,
|
|
IDC_ACD_DIRECTORY, IDH_PLACECALL_TO,
|
|
IDOK, IDH_PLACECALL_CALL,
|
|
0, 0
|
|
};
|
|
|
|
bool result = false;
|
|
|
|
switch( message )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
ASSERT(NULL != lParam);
|
|
::SetWindowLongPtr( dialog, DWLP_USER, lParam );
|
|
result = ((CDlgAcd *) lParam)->onInitDialog( dialog );
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
CDlgAcd * acd = (CDlgAcd *) ::GetWindowLongPtr( dialog, DWLP_USER );
|
|
|
|
if( acd != NULL )
|
|
{
|
|
result = acd->onCommand( LOWORD( wParam ), HIWORD( wParam ) );
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
DoHelpWhatsThis( wParam, helpIDMap );
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
{
|
|
DoHelp( lParam, helpIDMap );
|
|
}
|
|
break;
|
|
}
|
|
|
|
return( (BOOL) result );
|
|
|
|
} // End of CDlgAcd::DlgProcAcd.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::onInitDialog. //
|
|
//--------------------------------------------------------------------------//
|
|
bool
|
|
CDlgAcd::onInitDialog
|
|
(
|
|
HWND dialog
|
|
){
|
|
|
|
m_hwnd = dialog;
|
|
|
|
UpdateSecurityCheck(m_pConfRoom, m_hwnd, IDC_SECURE_CALL);
|
|
|
|
HICON directoryIcon = LoadIcon( ::GetInstanceHandle(), MAKEINTRESOURCE( IDI_DIRECTORY ) );
|
|
|
|
if( directoryIcon != NULL )
|
|
{
|
|
::SendDlgItemMessage( dialog, IDC_ACD_DIRECTORY, BM_SETIMAGE, IMAGE_ICON, (LPARAM) directoryIcon );
|
|
}
|
|
|
|
m_nameCombo = GetDlgItem( m_hwnd, IDL_ACD_ADDRESS );
|
|
m_addressTypeCombo = GetDlgItem( m_hwnd, IDL_ACD_ADDR_TYPE );
|
|
|
|
ComboBox_LimitText( m_nameCombo, CCHMAXSZ_ADDRESS - 1 );
|
|
|
|
fillCallMruList();
|
|
fillAddressTypesList();
|
|
|
|
::SendMessage( m_nameCombo, EM_LIMITTEXT, CCallto::s_iMaxAddressLength, 0 );
|
|
|
|
if( hasValidUserInfo( m_pRai ) )
|
|
{
|
|
::SetWindowText( m_nameCombo, m_pRai->szName );
|
|
::SendMessage( m_addressTypeCombo, CB_SETCURSEL, m_pRai->rgDwStr[ 0 ].dw, 0 );
|
|
}
|
|
else
|
|
{
|
|
::SendMessage( m_addressTypeCombo, CB_SETCURSEL, 0, 0 );
|
|
}
|
|
|
|
CenterWindow( m_hwnd, ::GetParent( m_hwnd ) );
|
|
|
|
if (m_pConfRoom->FIsConferenceActive())
|
|
{
|
|
// Simulate a call started to get all the states right
|
|
OnCallStarted();
|
|
}
|
|
|
|
return( true ); // Default focus...
|
|
|
|
} // End of CDlgAcd::onInitDialog.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::fillCallMruList. //
|
|
//--------------------------------------------------------------------------//
|
|
void
|
|
CDlgAcd::fillCallMruList(void)
|
|
{
|
|
ASSERT(NULL != m_nameCombo);
|
|
|
|
COMBOBOXEXITEM cbi;
|
|
|
|
ClearStruct( &cbi );
|
|
|
|
cbi.mask = CBEIF_TEXT;
|
|
cbi.iItem = -1; // Always insert at the end...
|
|
|
|
HRESULT result = S_OK;
|
|
|
|
for( int nn = 0; result == S_OK; nn++ )
|
|
{
|
|
RichAddressInfo * rai;
|
|
|
|
if( (result = m_callMruList.GetAddress( nn, &rai )) == S_OK )
|
|
{
|
|
cbi.pszText = rai->szName;
|
|
cbi.cchTextMax = lstrlen( cbi.pszText );
|
|
|
|
int index = (int)::SendMessage( m_nameCombo, CBEM_INSERTITEM, 0, (LPARAM) &cbi );
|
|
|
|
if( index != CB_ERR )
|
|
{
|
|
::SendMessage( m_nameCombo, CB_SETITEMDATA, index, nn );
|
|
}
|
|
else
|
|
{
|
|
result = S_FALSE;
|
|
}
|
|
|
|
ClearRai( &rai );
|
|
}
|
|
}
|
|
|
|
} // End of CDlgAcd::fillCallMruList.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::fillAddressTypesList. //
|
|
//--------------------------------------------------------------------------//
|
|
void
|
|
CDlgAcd::fillAddressTypesList(void)
|
|
{
|
|
using namespace ConfPolicies;
|
|
|
|
enum CallMode
|
|
{
|
|
CM_GK = 0x0001, // GateKeeper
|
|
CM_GW = 0x0002, // Gateway
|
|
CM_NoGate = 0x0004, // Neither
|
|
} ;
|
|
|
|
static const struct
|
|
{
|
|
LPARAM dwCallType;
|
|
UINT idTitle;
|
|
UINT uCallMode;
|
|
} s_mpCtIds[] =
|
|
{
|
|
{ NM_ADDR_UNKNOWN, IDS_ACD_CT_AUTOMATIC, CM_GK|CM_GW|CM_NoGate },
|
|
{ NM_ADDR_MACHINENAME, IDS_ACD_CT_IP, CM_GW|CM_NoGate },
|
|
{ NM_ADDR_ULS, IDS_ACD_CT_ILS, CM_GW|CM_NoGate },
|
|
{ NM_ADDR_ALIAS_E164, IDS_ACD_CT_PHONE, CM_GK|CM_GW },
|
|
{ NM_ADDR_ALIAS_ID, IDS_ACD_CT_ALIAS, CM_GK },
|
|
} ;
|
|
|
|
HWND combo = GetDlgItem( m_hwnd, IDL_ACD_ADDR_TYPE );
|
|
|
|
if( combo != NULL )
|
|
{
|
|
UINT uCallType = CM_NoGate;
|
|
|
|
if (CallingMode_GateKeeper == GetCallingMode())
|
|
{
|
|
uCallType = CM_GK;
|
|
}
|
|
else
|
|
{
|
|
RegEntry reConf(CONFERENCING_KEY, HKEY_CURRENT_USER);
|
|
if (reConf.GetNumber( REGVAL_USE_H323_GATEWAY ) != 0)
|
|
{
|
|
uCallType = CM_GW;
|
|
}
|
|
}
|
|
|
|
for( int nn = 0; nn < ARRAY_ELEMENTS(s_mpCtIds); nn++ )
|
|
{
|
|
if (0 == (uCallType & s_mpCtIds[nn].uCallMode))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
TCHAR sz[ CCHMAXSZ_NAME ];
|
|
|
|
if( FLoadString( s_mpCtIds[ nn ].idTitle, sz, CCHMAX( sz ) ) )
|
|
{
|
|
int index = (int)::SendMessage( combo, CB_INSERTSTRING, -1, (LPARAM) sz );
|
|
|
|
if( index != CB_ERR )
|
|
{
|
|
::SendMessage( combo, CB_SETITEMDATA, index, s_mpCtIds[ nn ].dwCallType );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} // End of CDlgAcd::fillAddressTypesList.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::onCommand. //
|
|
//--------------------------------------------------------------------------//
|
|
bool
|
|
CDlgAcd::onCommand
|
|
(
|
|
int command,
|
|
int notification
|
|
){
|
|
ASSERT(NULL != m_hwnd);
|
|
|
|
bool result = false;
|
|
|
|
switch( command )
|
|
{
|
|
case IDC_SECURE_CALL:
|
|
{
|
|
m_secure = (IsDlgButtonChecked( m_hwnd, IDC_SECURE_CALL ) == BST_CHECKED);
|
|
}
|
|
break;
|
|
|
|
case IDL_ACD_ADDRESS:
|
|
{
|
|
if( notification == CBN_EDITCHANGE )
|
|
{
|
|
onEditChange();
|
|
}
|
|
else if( notification == CBN_SELCHANGE )
|
|
{
|
|
int iSel = (int)::SendMessage( m_nameCombo, CB_GETCURSEL, 0, 0 );
|
|
|
|
if (iSel >= 0)
|
|
{
|
|
onMruSelect( iSel );
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDL_ACD_ADDR_TYPE:
|
|
if (CBN_SELCHANGE == notification)
|
|
{
|
|
// Pretend like the user just typed in the edit control
|
|
onEditChange();
|
|
}
|
|
break;
|
|
|
|
case IDC_ACD_DIRECTORY:
|
|
{
|
|
CFindSomeone::findSomeone(m_pConfRoom);
|
|
::EndDialog( m_hwnd, IDCANCEL );
|
|
}
|
|
break;
|
|
|
|
case IDOK:
|
|
{
|
|
if( m_mruRai != NULL )
|
|
{
|
|
lstrcpy( m_pRai->szName, m_mruRai->szName );
|
|
m_pRai->cItems = m_mruRai->cItems;
|
|
|
|
for( int nn = 0; nn < m_mruRai->cItems; nn++ )
|
|
{
|
|
m_pRai->rgDwStr[ nn ].dw = m_mruRai->rgDwStr[ nn ].dw;
|
|
m_pRai->rgDwStr[ nn ].psz = PszAlloc( m_mruRai->rgDwStr[ nn ].psz );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int type = (int)::SendMessage( m_addressTypeCombo, CB_GETCURSEL, 0, 0 );
|
|
|
|
type = (int)((type == CB_ERR)? NM_ADDR_UNKNOWN: ComboBox_GetItemData(m_addressTypeCombo, type));
|
|
|
|
::SendMessage( GetDlgItem( m_hwnd, IDL_ACD_ADDRESS), WM_GETTEXT, CCHMAX( m_pRai->szName ), (LPARAM) m_pRai->szName );
|
|
|
|
if( (type == NM_ADDR_UNKNOWN) && bCanCallAsPhoneNumber( m_pRai->szName ) )
|
|
{
|
|
type = NM_ADDR_ALIAS_E164;
|
|
}
|
|
|
|
m_pRai->cItems = 1;
|
|
m_pRai->rgDwStr[ 0 ].dw = type;
|
|
m_pRai->rgDwStr[ 0 ].psz = PszAlloc( m_pRai->szName );
|
|
}
|
|
|
|
::EndDialog( m_hwnd, IDOK );
|
|
result = true;
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
{
|
|
::EndDialog( m_hwnd, IDCANCEL );
|
|
result = true;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return( result );
|
|
|
|
} // End of CDlgAcd::onCommand.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::onEditChange. //
|
|
//--------------------------------------------------------------------------//
|
|
void
|
|
CDlgAcd::onEditChange(void)
|
|
{
|
|
TCHAR szEdit[ CCHMAXSZ_ADDRESS ];
|
|
int cch = get_editText( szEdit, CCHMAX( szEdit ) );
|
|
|
|
EnableWindow( GetDlgItem( m_hwnd, IDOK ), (cch > 0) );
|
|
ClearRai( &m_mruRai );
|
|
|
|
} // End of CDlgAcd::onEditChange.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::onMruSelect. //
|
|
//--------------------------------------------------------------------------//
|
|
void
|
|
CDlgAcd::onMruSelect
|
|
(
|
|
int selection
|
|
){
|
|
int mruIndex = (int)::SendMessage( m_nameCombo, CB_GETITEMDATA, selection, 0 );
|
|
HRESULT result;
|
|
|
|
RichAddressInfo * rai;
|
|
|
|
if( (result = m_callMruList.GetAddress( mruIndex, &rai )) == S_OK )
|
|
{
|
|
::SetWindowText( m_nameCombo, rai->szName );
|
|
|
|
DWORD dwType = rai->rgDwStr[ 0 ].dw;
|
|
|
|
// HACKHACK georgep: We know Automatic is at index 0
|
|
for (int typeIndex=ComboBox_GetCount(m_addressTypeCombo)-1; typeIndex>0; --typeIndex)
|
|
{
|
|
if (static_cast<DWORD>(ComboBox_GetItemData(m_addressTypeCombo, typeIndex))
|
|
== dwType)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
ComboBox_SetCurSel(m_addressTypeCombo, typeIndex);
|
|
|
|
m_mruRai = rai;
|
|
}
|
|
|
|
} // End of CDlgAcd::onMruSelect.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::newCall. //
|
|
//--------------------------------------------------------------------------//
|
|
void
|
|
CDlgAcd::newCall
|
|
(
|
|
HWND parentWindow,
|
|
CConfRoom * pConfRoom
|
|
){
|
|
CDlgAcd placeCall(pConfRoom);
|
|
RichAddressInfo rai;
|
|
bool userAlterable;
|
|
bool secure;
|
|
|
|
pConfRoom->AddConferenceChangeHandler(&placeCall);
|
|
|
|
pConfRoom->get_securitySettings( userAlterable, secure );
|
|
|
|
rai.szName[ 0 ] = '\0';
|
|
rai.cItems = 0;
|
|
|
|
if( placeCall.doModal( parentWindow, &rai, secure ) == IDOK )
|
|
{
|
|
NM_ADDR_TYPE nmType = static_cast<NM_ADDR_TYPE>(rai.rgDwStr[ 0 ].dw);
|
|
|
|
g_pCCallto->Callto( rai.szName, // pointer to the callto url to try to place the call with...
|
|
NULL, // pointer to the display name to use...
|
|
nmType, // callto type to resolve this callto as...
|
|
true, // the pszCallto parameter is to be interpreted as a pre-unescaped addressing component vs a full callto...
|
|
&secure, // security preference, NULL for none. must be "compatible" with secure param if present...
|
|
true, // whether or not save in mru...
|
|
true, // whether or not to perform user interaction on errors...
|
|
parentWindow, // if bUIEnabled is true this is the window to parent error/status windows to...
|
|
NULL ); // out pointer to INmCall * to receive INmCall * generated by placing call...
|
|
|
|
for( int nn = 0; nn < rai.cItems; nn++ )
|
|
{
|
|
delete [] rai.rgDwStr[ nn ].psz;
|
|
}
|
|
}
|
|
|
|
pConfRoom->RemoveConferenceChangeHandler(&placeCall);
|
|
|
|
} // End of CDlgAcd::newCall.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CDlgAcd::get_editText. //
|
|
//--------------------------------------------------------------------------//
|
|
int
|
|
CDlgAcd::get_editText
|
|
(
|
|
LPTSTR psz,
|
|
int cchMax
|
|
){
|
|
ASSERT(NULL != m_nameCombo);
|
|
|
|
SetEmptySz( psz );
|
|
GetWindowText( m_nameCombo, psz, cchMax );
|
|
|
|
return( TrimSz( psz ) );
|
|
|
|
} // End of get_editText.
|
|
|
|
|
|
void CDlgAcd::OnCallStarted()
|
|
{
|
|
UpdateSecurityCheck(m_pConfRoom, m_hwnd, IDC_SECURE_CALL);
|
|
|
|
// BUGBUG georgep: We get notified before the actual conference state
|
|
// changes, so we need to disable manually
|
|
::EnableWindow( GetDlgItem(m_hwnd, IDC_SECURE_CALL), FALSE );
|
|
}
|
|
|
|
void CDlgAcd::OnCallEnded()
|
|
{
|
|
UpdateSecurityCheck(m_pConfRoom, m_hwnd, IDC_SECURE_CALL);
|
|
::CheckDlgButton( m_hwnd, IDC_SECURE_CALL, m_secure );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CEnumMRU::CEnumMRU. //
|
|
//--------------------------------------------------------------------------//
|
|
CEnumMRU::CEnumMRU():
|
|
RefCount( NULL )
|
|
{
|
|
} // CEnumMRU::CEnumMRU.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CEnumMRU::AddRef. //
|
|
//--------------------------------------------------------------------------//
|
|
ULONG
|
|
STDMETHODCALLTYPE
|
|
CEnumMRU::AddRef(void)
|
|
{
|
|
|
|
return( RefCount::AddRef() );
|
|
|
|
} // CEnumMRU::AddRef.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CEnumMRU::Release. //
|
|
//--------------------------------------------------------------------------//
|
|
ULONG
|
|
STDMETHODCALLTYPE
|
|
CEnumMRU::Release(void)
|
|
{
|
|
return( RefCount::Release() );
|
|
|
|
} // CEnumMRU::Release.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CEnumMRU::GetAddress. //
|
|
//--------------------------------------------------------------------------//
|
|
HRESULT
|
|
STDMETHODCALLTYPE
|
|
CEnumMRU::GetAddress
|
|
(
|
|
long index,
|
|
RichAddressInfo ** ppAddr
|
|
){
|
|
HRESULT result = S_FALSE;
|
|
|
|
if( GetNumEntries() <= index )
|
|
{
|
|
result = S_FALSE;
|
|
}
|
|
else
|
|
{
|
|
// HACKHACK georgep: Just using the Address as the display name. We
|
|
// should clean this up later so we are not taking up extra memory and
|
|
// registry space
|
|
*ppAddr = CreateRai( GetString( index, ACD_ADDR ), (NM_ADDR_TYPE) GetDWORD( index, ACD_TYPE ), GetString( index, ACD_ADDR ) );
|
|
result = (*ppAddr == NULL)? E_OUTOFMEMORY: S_OK;
|
|
}
|
|
|
|
return( result );
|
|
|
|
} // CEnumMRU::GetAddress.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CEnumMRU::GetRecentAddresses. //
|
|
//--------------------------------------------------------------------------//
|
|
HRESULT
|
|
CEnumMRU::GetRecentAddresses
|
|
(
|
|
IEnumRichAddressInfo ** ppEnum
|
|
){
|
|
|
|
*ppEnum = new CEnumMRU();
|
|
|
|
return( (*ppEnum == NULL)? E_OUTOFMEMORY: S_OK );
|
|
|
|
} // End of CEnumMRU::GetRecentAddresses.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CEnumMRU::FreeAddress. //
|
|
//--------------------------------------------------------------------------//
|
|
HRESULT
|
|
CEnumMRU::FreeAddress
|
|
(
|
|
RichAddressInfo ** ppAddr
|
|
){
|
|
|
|
ClearRai( ppAddr );
|
|
|
|
return( S_OK );
|
|
|
|
} // End of CEnumMRU::FreeAddress.
|
|
|
|
|
|
//--------------------------------------------------------------------------//
|
|
// CEnumMRU::CopyAddress. //
|
|
//--------------------------------------------------------------------------//
|
|
HRESULT
|
|
CEnumMRU::CopyAddress
|
|
(
|
|
RichAddressInfo * pAddrIn,
|
|
RichAddressInfo ** ppAddrOut
|
|
){
|
|
|
|
*ppAddrOut = DupRai( pAddrIn );
|
|
|
|
return( (*ppAddrOut == NULL)? E_OUTOFMEMORY: S_OK );
|
|
|
|
} // End of CEnumMRU::CopyAddress.
|
|
|
|
CAcdMru::CAcdMru() :
|
|
CMRUList2( _rgMruCall, CENTRYMAX_MRUCALL )
|
|
{
|
|
}
|
|
|
|
int CAcdMru::CompareEntry(int iItem, PMRUE pEntry)
|
|
{
|
|
ASSERT(NULL != pEntry);
|
|
|
|
int iRet = 0;
|
|
|
|
LPCTSTR psz1 = GetString(iItem, ACD_ADDR);
|
|
LPCTSTR psz2 = GetString(pEntry, ACD_ADDR);
|
|
|
|
ASSERT(NULL != psz1 && NULL != psz2);
|
|
|
|
return(lstrcmpi(psz1, psz2));
|
|
}
|