|
|
// File: speedial.cpp
#include "precomp.h"
#include "resource.h"
#include "dirutil.h"
#include "speedial.h"
#include "nameres.h" // for old transports
#include "callto.h"
static const TCHAR g_cszConfLinkExt[] = TEXT(".cnf"); static const TCHAR g_cszConfLinkFilter[] = TEXT("*.cnf");
static const TCHAR g_cszConferenceShortcutSection[] = TEXT("ConferenceShortcut"); static const TCHAR g_cszNameKey[] = TEXT("ConfName"); static const TCHAR g_cszAddressKey[] = TEXT("Address"); static const TCHAR g_cszTransportKey[] = TEXT("Transport"); static const TCHAR g_cszRemoteConfNameKey[] = TEXT("RemoteConfName"); static const TCHAR g_cszCallFlagsKey[] = TEXT("CallFlags"); static const TCHAR g_cszPasswordKey[] = TEXT("Password");
static const int _rgIdMenu[] = { IDM_DLGCALL_DELETE, 0 };
inline VOID DwToSz(DWORD dw, LPTSTR psz) { wsprintf(psz, TEXT("%d"), dw); }
/* C S P E E D D I A L */ /*-------------------------------------------------------------------------
%%Function: CSPEEDDIAL
-------------------------------------------------------------------------*/ CSPEEDDIAL::CSPEEDDIAL() : CALV(IDS_DLGCALL_SPEEDDIAL, II_SPEEDDIAL, _rgIdMenu) { DbgMsg(iZONE_OBJECTS, "CSPEEDDIAL - Constructed(%08X)", this);
// Check the path to the speed dial folder
if (!FGetSpeedDialFolder(m_szFile, CCHMAX(m_szFile))) return;
int cchSpeedDialFolder = lstrlen(m_szFile); m_szFile[cchSpeedDialFolder++] = _T('\\'); m_pszFileName = &m_szFile[cchSpeedDialFolder]; m_cchFileNameMax = CCHMAX(m_szFile) - cchSpeedDialFolder; ASSERT(m_cchFileNameMax >= MAX_PATH); lstrcpyn(m_pszFileName, g_cszConfLinkFilter, m_cchFileNameMax);
WIN32_FIND_DATA wfd; HANDLE hFind = ::FindFirstFile(m_szFile, &wfd); if (INVALID_HANDLE_VALUE == hFind) return; ::FindClose(hFind);
SetAvailable(TRUE); // we found at least one file
}
CSPEEDDIAL::~CSPEEDDIAL() { DbgMsg(iZONE_OBJECTS, "CSPEEDDIAL - Destroyed(%08X)", this); }
///////////////////////////////////////////////////////////////////////////
// CALV methods
/* S H O W I T E M S */ /*-------------------------------------------------------------------------
%%Function: ShowItems
-------------------------------------------------------------------------*/ VOID CSPEEDDIAL::ShowItems(HWND hwnd) { CALV::SetHeader(hwnd, IDS_ADDRESS);
if (!FAvailable()) return;
lstrcpyn(m_pszFileName, g_cszConfLinkFilter, m_cchFileNameMax);
WIN32_FIND_DATA wfd; HANDLE hFind = ::FindFirstFile(m_szFile, &wfd); if (INVALID_HANDLE_VALUE == hFind) return;
for ( ; ; ) { lstrcpyn(m_pszFileName, wfd.cFileName, m_cchFileNameMax);
TCHAR szAddress[CCHMAXSZ_ADDRESS]; if (0 != GetPrivateProfileString(g_cszConferenceShortcutSection, g_cszAddressKey, g_cszEmpty, szAddress, CCHMAX(szAddress), m_szFile)) { TCHAR szName[MAX_PATH]; lstrcpyn(szName, wfd.cFileName, lstrlen(wfd.cFileName) - CCHEXT); // no .cnf extension
DlgCallAddItem(hwnd, szName, szAddress, II_COMPUTER); }
if (FALSE == ::FindNextFile(hFind, &wfd)) { ::FindClose(hFind); break; } } }
VOID CSPEEDDIAL::OnCommand(WPARAM wParam, LPARAM lParam) { switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDM_DLGCALL_DELETE: CmdDelete(); break; default: CALV::OnCommand(wParam, lParam); break; } }
BOOL CSPEEDDIAL::FGetSelectedFilename(LPTSTR pszFile) { int iItem = GetSelection(); if (-1 == iItem) return FALSE;
if (!FGetSpeedDialFolder(pszFile, MAX_PATH)) return FALSE; LPTSTR psz = pszFile + lstrlen(pszFile); *psz++ = _T('\\');
int cchMax = (INT)(MAX_PATH - (CCHMAX(g_cszConfLinkExt) + psz - pszFile)); if (!GetSzData(psz, cchMax, iItem, IDI_DLGCALL_NAME)) return FALSE;
lstrcat(pszFile, g_cszConfLinkExt); return TRUE; }
VOID CSPEEDDIAL::CmdDelete(void) { int iItem = GetSelection(); if (-1 == iItem) return;
TCHAR szFile[MAX_PATH]; if (!FGetSelectedFilename(szFile)) return;
if (::DeleteFile(szFile)) { DeleteItem(iItem); } }
/* G E T A D D R I N F O */ /*-------------------------------------------------------------------------
%%Function: GetAddrInfo
-------------------------------------------------------------------------*/ RAI * CSPEEDDIAL::GetAddrInfo(void) { TCHAR szFile[MAX_PATH]; if (!FGetSelectedFilename(szFile)) return NULL;
NM_ADDR_TYPE addrType; int iTransport = GetPrivateProfileInt(g_cszConferenceShortcutSection, g_cszTransportKey, NAMETYPE_UNKNOWN, szFile); switch (iTransport) { case NAMETYPE_IP: addrType = NM_ADDR_IP; break; case NAMETYPE_PSTN: addrType = NM_ADDR_PSTN; break; case NAMETYPE_ULS: addrType = NM_ADDR_ULS; break; case NAMETYPE_H323GTWY: addrType = NM_ADDR_H323_GATEWAY; break;
case NAMETYPE_UNKNOWN: addrType = NM_ADDR_ULS; break;
default: addrType = NM_ADDR_UNKNOWN; break; }
RichAddressInfo * pRai = CALV::GetAddrInfo( addrType );
if( hasValidUserInfo( pRai ) && (addrType == NM_ADDR_IP) ) { unsigned long ulDestination;
if( GetIpAddress( pRai->rgDwStr[0].psz, ulDestination ) != S_OK ) { pRai->rgDwStr[0].dw = NM_ADDR_MACHINENAME; } }
return( pRai ); }
/* F C R E A T E S P E E D D I A L */ /*-------------------------------------------------------------------------
%%Function: FCreateSpeedDial
Return TRUE if a new speed dial was created.
If pcszPathPrefix is NULL the file will be created only if necessary. -------------------------------------------------------------------------*/ BOOL FCreateSpeedDial(LPCTSTR pcszName, LPCTSTR pcszAddress, NM_ADDR_TYPE addrType, DWORD dwCallFlags, LPCTSTR pcszRemoteConfName, LPCTSTR pcszPassword, LPCTSTR pcszPathPrefix) { TCHAR sz[MAX_PATH]; TCHAR szFileName[MAX_PATH*2]; if (FEmptySz(pcszPathPrefix)) { if (FExistingSpeedDial(pcszAddress, addrType)) { WARNING_OUT(("Duplicate SpeedDial already exists - not creating")); return FALSE; }
if (!FGetSpeedDialFolder(szFileName, CCHMAX(szFileName), TRUE)) { ERROR_OUT(("FGetSpeedDialFolder failed!")); return FALSE; } } else { lstrcpyn(szFileName, pcszPathPrefix, CCHMAX(szFileName)); }
if (!FCreateNewFile(szFileName, pcszName, g_cszConfLinkExt, szFileName, CCHMAX(szFileName))) { return FALSE; }
// Write the data to the file
WritePrivateProfileString(g_cszConferenceShortcutSection, g_cszNameKey, pcszName, szFileName); WritePrivateProfileString(g_cszConferenceShortcutSection, g_cszAddressKey, pcszAddress, szFileName); // Call Flags (normally CRPCF_DEFAULT)
DwToSz(dwCallFlags, sz); WritePrivateProfileString(g_cszConferenceShortcutSection, g_cszCallFlagsKey, sz, szFileName);
// Transports
DWORD dwTransport; switch (addrType) { case NM_ADDR_IP: dwTransport = NAMETYPE_IP; break;
case NM_ADDR_PSTN: dwTransport = NAMETYPE_PSTN; break;
case NM_ADDR_ULS: dwTransport = NAMETYPE_ULS; break;
case NM_ADDR_H323_GATEWAY: dwTransport = NAMETYPE_H323GTWY; break;
case NM_ADDR_UNKNOWN: default: dwTransport = NAMETYPE_UNKNOWN; break; } DwToSz(dwTransport, sz); WritePrivateProfileString(g_cszConferenceShortcutSection, g_cszTransportKey, sz, szFileName);
// Remote conference name
if (!FEmptySz(pcszRemoteConfName)) { WritePrivateProfileString(g_cszConferenceShortcutSection, g_cszRemoteConfNameKey, pcszName, pcszRemoteConfName);
// Remote conference name
if (!FEmptySz(pcszPassword)) { WritePrivateProfileString(g_cszConferenceShortcutSection, g_cszPasswordKey, pcszName, pcszPassword); } }
return TRUE; }
/* F E X I S T I N G S P E E D D I A L */ /*-------------------------------------------------------------------------
%%Function: FExistingSpeedDial
-------------------------------------------------------------------------*/ BOOL FExistingSpeedDial(LPCTSTR pcszAddress, NM_ADDR_TYPE addrType) { TCHAR szFile[MAX_PATH*2]; if (!FGetSpeedDialFolder(szFile, CCHMAX(szFile))) return FALSE;
lstrcat(szFile, "\\"); int cchMax = lstrlen(szFile); LPTSTR pszFileName = &szFile[cchMax]; // points to the filename
lstrcpy(pszFileName, g_cszConfLinkFilter); cchMax = CCHMAX(szFile) - cchMax; // The max length of a filename
WIN32_FIND_DATA wfd; HANDLE hFind = ::FindFirstFile(szFile, &wfd); if (INVALID_HANDLE_VALUE == hFind) return FALSE;
BOOL fFound = FALSE; for ( ; ; ) { lstrcpyn(pszFileName, wfd.cFileName, cchMax);
TCHAR szAddress[CCHMAXSZ_ADDRESS]; if (0 != GetPrivateProfileString(g_cszConferenceShortcutSection, g_cszAddressKey, g_cszEmpty, szAddress, CCHMAX(szAddress), szFile)) { if (0 == lstrcmp(szAddress, pcszAddress)) { fFound = TRUE; break; } }
if (!FindNextFile(hFind, &wfd)) break; }
::FindClose(hFind); return fFound; }
/*-------------------------------------------------------------------------
%%Function: GetSpeedDialFolderName
-------------------------------------------------------------------------*/ bool GetSpeedDialFolderName(LPTSTR pszBuffer, int cbLength) { ASSERT( pszBuffer != NULL ); ASSERT( cbLength > 0 );
RegEntry re( CONFERENCING_KEY, HKEY_LOCAL_MACHINE );
LPTSTR pszFolder = re.GetString( REGVAL_SPEED_DIAL_FOLDER ); bool bResult = !FEmptySz( pszFolder );
if( !bResult ) { TCHAR szNewFolder[ MAX_PATH ];
if( GetInstallDirectory( szNewFolder ) ) { TCHAR szSDFolder[ MAX_PATH ];
FLoadString( IDS_SPEEDDIAL_FOLDER, szSDFolder, CCHMAX( szSDFolder ) );
ASSERT( (lstrlen( szNewFolder) + lstrlen( szSDFolder )) < CCHMAX( szNewFolder ) );
lstrcat( szNewFolder, szSDFolder );
pszFolder = szNewFolder; bResult = true; // Set the registry entry
RegEntry re2( CONFERENCING_KEY, HKEY_LOCAL_MACHINE ); re2.SetValue( REGVAL_SPEED_DIAL_FOLDER, szNewFolder ); } }
if( bResult ) { lstrcpyn( pszBuffer, pszFolder, cbLength ); }
return( bResult );
}
/* C R E A T E S P E E D D I A L F O L D E R */ /*-------------------------------------------------------------------------
%%Function: CreateSpeedDialFolder
-------------------------------------------------------------------------*/ BOOL CreateSpeedDialFolder(LPTSTR pszBuffer, int cbLength) { BOOL bResult = FALSE;
if( GetSpeedDialFolderName( pszBuffer, cbLength ) ) { bResult = ::FEnsureDirExists( pszBuffer ); }
return( bResult );
}
/* F G E T S P E E D D I A L F O L D E R */ /*-------------------------------------------------------------------------
%%Function: FGetSpeedDialFolder
-------------------------------------------------------------------------*/ BOOL FGetSpeedDialFolder(LPTSTR pszBuffer, UINT cchMax, BOOL fCreate) { bool bResult = false;
if( GetSpeedDialFolderName( pszBuffer, cchMax ) ) { if( ::FDirExists( pszBuffer ) ) { bResult = true; } else if( fCreate ) { bResult = (CreateSpeedDialFolder( pszBuffer, cchMax ) != FALSE); } }
return( (BOOL) bResult );
}
|