|
|
//+----------------------------------------------------------------------------
//
// File: pb.cpp
//
// Module: CMDIAL32.DLL
//
// Synopsis: Handle the phone book dialog and call cmpbk32.dll.
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// Author: fengsun Created Header 1/14/98
//
//+----------------------------------------------------------------------------
#include "cmmaster.h"
#define MAX_PB_WAIT 30000 // max miliiseconds to wait for PB mutex
//+----------------------------------------------------------------------------
//
// Function: ExtendArray
//
// Synopsis: Increase the array for one element as the size nSize
// Reallocate and copy *ppvArray and increase *pnCount
//
// Arguments: void **ppvArray - the point to the array pointer
// size_t nSize - the size of one element
// UINT *pnCount - the number of element currently in the array
//
// Returns:
//
// History: feng sun Created Header 1/14/98
//
//+----------------------------------------------------------------------------
static void ExtendArray(IN OUT void **ppvArray, size_t nSize, IN OUT UINT *pnCount) { void *pvTmp;
if (NULL != ppvArray && NULL != pnCount) { pvTmp = CmMalloc(nSize*(*pnCount+1)); if (NULL != pvTmp) { CopyMemory(pvTmp,*ppvArray,nSize*(*pnCount)); CmFree(*ppvArray); *ppvArray = pvTmp; (*pnCount)++; } } }
//+---------------------------------------------------------------------------
//
// struct ServiceInfo
//
// Synopsis: Save the information of a service under .cms [Service Types]
//
// History: fengsun created 1/14/97
//
//----------------------------------------------------------------------------
typedef struct tagServiceInfo { DWORD_PTR dwPB; UINT nServiceString; PPBFS pFilter; PPBFS pFilterA; PPBFS pFilterB; LPTSTR pszFile; } ServiceInfo;
class CPhoneBookInfo { public: CPhoneBookInfo(); ~CPhoneBookInfo(); BOOL Load(LPCTSTR pszFile, BOOL fHasValidTopLevelPBK, BOOL fHasValidReferencedPBKs); void LoadServiceTypes(HWND hwndDlg, UINT nIdServiceType, LPCTSTR pszServiceType); void LoadCountries(HWND hwndDlg, UINT nIdCountry, DWORD dwCountryId); void LoadRegions(HWND hwndDlg, UINT nIdRegion, LPCTSTR pszRegionName); void LoadNumbers(HWND hwndDlg, UINT nIdNumberA, UINT nIdNumberB, UINT nIdMore, LPCTSTR pszPhoneNumber, LPCTSTR pszPhoneBookFile); //BOOL GetDisp(DWORD dwCookie, LPTSTR pszDisp, DWORD *pdwDisp);
BOOL GetDesc(DWORD dwCookie, LPTSTR pszDesc, DWORD *pdwDesc); BOOL HasMoreNumbers(); BOOL GetCanonical(DWORD dwCookie, LPTSTR pszCanonical, DWORD *pdwCanonical); BOOL GetNonCanonical(DWORD dwCookie, LPTSTR pszNonCanonical, DWORD *pdwNonCanonical); LPCTSTR GetFile(DWORD dwCookie); BOOL GetDUN(DWORD dwCookie, LPTSTR pszDUN, DWORD *pdwDUN); private: BOOL LoadFile(LPCTSTR pszFile, PPBFS pFilterA, PPBFS pFilterB); BOOL ServiceCB(LPCTSTR pszSvc, PPBFS pFilter, PPBFS pFilterA, PPBFS pFilterB, DWORD dwPB, LPCTSTR pszFile); void LoadRegionsCB(unsigned int nIdx, DWORD_PTR dwParam); void LoadNumbersCB(unsigned int nIdx, DWORD_PTR dwParam); void LoadCountriesA(HWND hwndDlg, UINT nIdCountry, DWORD dwCountryId); void LoadCountriesW(HWND hwndDlg, UINT nIdCountry, DWORD dwCountryId);
CPBMap m_Map; UINT m_nServiceString; LPTSTR *m_ppszServiceString; UINT m_nServiceInfo; // the number of elements in m_psiServiceInfo
ServiceInfo *m_psiServiceInfo; // a array to save the information of all the services
// under [Service Types]
UINT m_nIdServiceType; UINT m_nIdCountry; UINT m_nIdRegion; UINT *m_pnRegionIdx; UINT m_nRegionIdx; typedef struct { CPhoneBookInfo *pInfo; PPBFS pFilterA; PPBFS pFilterB; DWORD dwPB; LPCSTR pszFile; } SCBS; friend BOOL WINAPI _ServiceCB(LPCSTR pszSvc, PPBFS pFilter, DWORD_PTR dwParam);
friend BOOL WINAPI _ReferenceCB(LPCSTR pszFile, LPCSTR pszURL, PPBFS pFilterA, PPBFS pFilterB, DWORD_PTR dwParam); friend void WINAPI _LoadRegionsCB(unsigned int nIdx, DWORD_PTR dwParam); friend void WINAPI _LoadNumbersCB(unsigned int nIdx, DWORD_PTR dwParam); };
LPCTSTR CPhoneBookInfo::GetFile(DWORD dwCookie) { DWORD dwParam;
CMTRACE(TEXT("CPhoneBookInfo::GetFile"));
DWORD_PTR dwPB = m_Map.PBFromCookie(dwCookie, &dwParam);
if (dwPB == CPBMAP_ERROR) { return (TEXT("")); }
MYDBGASSERT(dwParam < m_nServiceInfo); return (m_psiServiceInfo[dwParam].pszFile); }
/*
BOOL CPhoneBookInfo::GetDisp(DWORD dwCookie, LPTSTR pszDisp, DWORD *pdwDisp) {
MYDBG(("CPhoneBookInfo::GetDisp"));
return (PhoneBookGetPhoneDisp(m_Map.PBFromCookie(dwCookie),m_Map.IdxFromCookie(dwCookie),pszDisp,pdwDisp)); } */
BOOL CPhoneBookInfo::GetDesc(DWORD dwCookie, LPTSTR pszDesc, DWORD *pdwDesc) { #ifdef UNICODE
BOOL bReturn = FALSE; DWORD dwSize = *pdwDesc; LPSTR pszAnsiDesc = (LPSTR)CmMalloc(dwSize);
if (pszAnsiDesc) { bReturn = PhoneBookGetPhoneDesc(m_Map.PBFromCookie(dwCookie), m_Map.IdxFromCookie(dwCookie), pszAnsiDesc, pdwDesc);
MYVERIFY(0 != MultiByteToWideChar(CP_ACP, 0, pszAnsiDesc, -1, pszDesc, dwSize));
CmFree(pszAnsiDesc); }
return bReturn;
#else
return (PhoneBookGetPhoneDesc(m_Map.PBFromCookie(dwCookie),m_Map.IdxFromCookie(dwCookie),pszDesc,pdwDesc)); #endif
}
BOOL CPhoneBookInfo::GetCanonical(DWORD dwCookie, LPTSTR pszCanonical, DWORD *pdwCanonical) {
#ifdef UNICODE
BOOL bReturn = FALSE; DWORD dwSize = *pdwCanonical; LPSTR pszAnsiCanonical = (LPSTR)CmMalloc(dwSize);
if (pszAnsiCanonical) { bReturn = PhoneBookGetPhoneCanonical(m_Map.PBFromCookie(dwCookie), m_Map.IdxFromCookie(dwCookie), pszAnsiCanonical, pdwCanonical);
MYVERIFY(0 != MultiByteToWideChar(CP_ACP, 0, pszAnsiCanonical, -1, pszCanonical, dwSize));
CmFree(pszAnsiCanonical); }
return bReturn;
#else
return (PhoneBookGetPhoneCanonical(m_Map.PBFromCookie(dwCookie), m_Map.IdxFromCookie(dwCookie), pszCanonical, pdwCanonical)); #endif
}
BOOL CPhoneBookInfo::GetNonCanonical(DWORD dwCookie, LPTSTR pszNonCanonical, DWORD *pdwNonCanonical) {
#ifdef UNICODE
BOOL bReturn = FALSE; DWORD dwSize = *pdwNonCanonical; LPSTR pszAnsiNonCanonical = (LPSTR)CmMalloc(dwSize);
if (pszAnsiNonCanonical) { bReturn = PhoneBookGetPhoneNonCanonical(m_Map.PBFromCookie(dwCookie), m_Map.IdxFromCookie(dwCookie), pszAnsiNonCanonical, pdwNonCanonical);
MYVERIFY(0 != MultiByteToWideChar(CP_ACP, 0, pszAnsiNonCanonical, -1, pszNonCanonical, dwSize));
CmFree(pszAnsiNonCanonical); }
return bReturn;
#else
return (PhoneBookGetPhoneNonCanonical(m_Map.PBFromCookie(dwCookie),m_Map.IdxFromCookie(dwCookie),pszNonCanonical,pdwNonCanonical)); #endif
}
BOOL CPhoneBookInfo::GetDUN(DWORD dwCookie, LPTSTR pszDUN, DWORD *pdwDUN) {
#ifdef UNICODE
BOOL bReturn = FALSE; DWORD dwSize = *pdwDUN; LPSTR pszAnsiDUN = (LPSTR)CmMalloc(dwSize);
if (pszAnsiDUN) { bReturn = PhoneBookGetPhoneDUN(m_Map.PBFromCookie(dwCookie), m_Map.IdxFromCookie(dwCookie), pszAnsiDUN, pdwDUN);
MYVERIFY(0 != MultiByteToWideChar(CP_ACP, 0, pszAnsiDUN, -1, pszDUN, dwSize));
CmFree(pszAnsiDUN); }
return bReturn;
#else
return (PhoneBookGetPhoneDUN(m_Map.PBFromCookie(dwCookie), m_Map.IdxFromCookie(dwCookie), pszDUN, pdwDUN)); #endif
}
CPhoneBookInfo::CPhoneBookInfo() {
m_nServiceString = 0; m_ppszServiceString = NULL; m_nServiceInfo = 0; m_psiServiceInfo = NULL; m_pnRegionIdx = NULL; m_nRegionIdx = 0; }
CPhoneBookInfo::~CPhoneBookInfo() {
while (m_nServiceString) { CmFree(m_ppszServiceString[--m_nServiceString]); } CmFree(m_ppszServiceString); m_ppszServiceString = NULL; while (m_nServiceInfo) { PhoneBookFreeFilter(m_psiServiceInfo[m_nServiceInfo-1].pFilter); PhoneBookFreeFilter(m_psiServiceInfo[m_nServiceInfo-1].pFilterA); PhoneBookFreeFilter(m_psiServiceInfo[m_nServiceInfo-1].pFilterB); CmFree(m_psiServiceInfo[m_nServiceInfo-1].pszFile); m_nServiceInfo--; } CmFree(m_psiServiceInfo); m_psiServiceInfo = NULL; CmFree(m_pnRegionIdx); m_pnRegionIdx = NULL; m_nRegionIdx = 0; }
BOOL PhoneBookParseInfoWrapper(LPCTSTR pszFile, PhoneBookParseInfoStruct* piInfo) { #ifdef UNICODE
BOOL bReturn;
LPSTR pszAnsiFile = WzToSzWithAlloc(pszFile);
if (NULL == pszAnsiFile) { return FALSE; } else { bReturn = PhoneBookParseInfo(pszAnsiFile, piInfo); CmFree(pszAnsiFile); }
return bReturn; #else
return PhoneBookParseInfo(pszFile, piInfo); #endif
}
BOOL CPhoneBookInfo::Load(LPCTSTR pszFile, BOOL fHasValidTopLevelPBK, BOOL fHasValidReferencedPBKs) { PhoneBookParseInfoStruct iInfo; BOOL bRes = FALSE;
CMTRACE(TEXT("CPhoneBookInfo::Load"));
CmFree(m_pnRegionIdx); m_pnRegionIdx = NULL; m_nRegionIdx = 0; if (!pszFile) { SetLastError(ERROR_INVALID_PARAMETER); return (FALSE); } ZeroMemory(&iInfo,sizeof(iInfo)); iInfo.dwSize = sizeof(iInfo);
if (fHasValidTopLevelPBK) { if (!PhoneBookParseInfoWrapper(pszFile,&iInfo)) { return (FALSE); } bRes = LoadFile(pszFile,iInfo.pFilterA,iInfo.pFilterB); PhoneBookFreeFilter(iInfo.pFilterA); PhoneBookFreeFilter(iInfo.pFilterB); if (!bRes) { return (FALSE); } }
if (fHasValidReferencedPBKs) { iInfo.pfnRef = _ReferenceCB; iInfo.dwRefParam = (DWORD_PTR) this; if (!PhoneBookParseInfoWrapper(pszFile,&iInfo)) { return (FALSE); } PhoneBookFreeFilter(iInfo.pFilterA); PhoneBookFreeFilter(iInfo.pFilterB); } return (TRUE); }
void CPhoneBookInfo::LoadServiceTypes(HWND hwndDlg, UINT nIdServiceType, LPCTSTR pszServiceType) { UINT nIdx; UINT nTmpIdx;
CMTRACE(TEXT("CPhoneBookInfo::LoadServiceTypes"));
CmFree(m_pnRegionIdx); m_pnRegionIdx = NULL; m_nRegionIdx = 0; m_nIdServiceType = nIdServiceType; SendDlgItemMessageU(hwndDlg, nIdServiceType, CB_RESETCONTENT,0,0);
for (nIdx=0; nIdx < m_nServiceString; nIdx++) { nTmpIdx = (UINT) SendDlgItemMessageU(hwndDlg, nIdServiceType, CB_ADDSTRING, 0, (LPARAM) m_ppszServiceString[nIdx]); SendDlgItemMessageU(hwndDlg, nIdServiceType, CB_SETITEMDATA, nTmpIdx, nIdx); } if (SendDlgItemMessageU(hwndDlg, nIdServiceType, CB_GETCOUNT, 0, 0) > 1) { LPTSTR pszDesc = NULL;
EnableWindow(GetDlgItem(hwndDlg, nIdServiceType), TRUE);
//
// If the service type is empty, select the first type as a default
//
if ((!pszServiceType) || pszServiceType[0] == '\0') { pszDesc = CmStrCpyAlloc(m_ppszServiceString[0]); } else { pszDesc = CmStrCpyAlloc(pszServiceType); } //
// Search for the specified default and if found, make it the current
// selection. Previously, we did this in the loop above, but 16-bit
// combos, don't remember the CURSEL when strings are added.
//
nTmpIdx = (UINT) SendDlgItemMessageU(hwndDlg, nIdServiceType, CB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM) pszDesc); if (nTmpIdx == CB_ERR) { nTmpIdx = 0; }
SendDlgItemMessageU(hwndDlg, nIdServiceType, CB_SETCURSEL, nTmpIdx, 0);
CmFree(pszDesc); } else { EnableWindow(GetDlgItem(hwndDlg, nIdServiceType), FALSE); } }
typedef struct tagLoadCountriesCBStruct { DWORD_PTR dwPB; HWND hwndDlg; UINT nId; DWORD dwCountryId; } LoadCountriesCBStruct;
//
// Note: this function and its mirror function _LoadCountriesCBW must stay in sync
//
static void WINAPI _LoadCountriesCBA(unsigned int nIdx, DWORD_PTR dwParam) { LoadCountriesCBStruct *pParam = (LoadCountriesCBStruct *) dwParam; CHAR szCountry[256]; UINT nTmpIdx; DWORD dwCountryId = PhoneBookGetCountryId(pParam->dwPB, nIdx); DWORD dwLen;
szCountry[0] = '\0';
dwLen = sizeof(szCountry) / sizeof(CHAR); PhoneBookGetCountryNameA(pParam->dwPB, nIdx, szCountry, &dwLen); wsprintfA(szCountry + lstrlenA(szCountry), " (%u)", dwCountryId);
nTmpIdx = (UINT) SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM)szCountry); if (nTmpIdx != CB_ERR) { return; } nTmpIdx = (UINT) SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_ADDSTRING, 0, (LPARAM) szCountry); SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_SETITEMDATA, nTmpIdx, dwCountryId); if (pParam->dwCountryId && (dwCountryId == pParam->dwCountryId)) { SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_SETCURSEL, nTmpIdx, 0); } }
//
// Note: this function and its mirror function _LoadCountriesCBA must stay in sync
//
static void WINAPI _LoadCountriesCBW(unsigned int nIdx, DWORD_PTR dwParam) { LoadCountriesCBStruct *pParam = (LoadCountriesCBStruct *) dwParam; WCHAR szCountry[256]; UINT nTmpIdx; DWORD dwCountryId = PhoneBookGetCountryId(pParam->dwPB, nIdx); DWORD dwLen;
szCountry[0] = L'\0';
dwLen = sizeof(szCountry) / sizeof(WCHAR); PhoneBookGetCountryNameW(pParam->dwPB, nIdx, szCountry, &dwLen); wsprintfW(szCountry + lstrlenW(szCountry), L" (%u)", dwCountryId);
nTmpIdx = (UINT) SendDlgItemMessageW(pParam->hwndDlg, pParam->nId, CB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM)szCountry); if (nTmpIdx != CB_ERR) { return; } nTmpIdx = (UINT) SendDlgItemMessageW(pParam->hwndDlg, pParam->nId, CB_ADDSTRING, 0, (LPARAM) szCountry);
SendDlgItemMessageW(pParam->hwndDlg, pParam->nId, CB_SETITEMDATA, nTmpIdx, dwCountryId); if (pParam->dwCountryId && (dwCountryId == pParam->dwCountryId)) { SendDlgItemMessageW(pParam->hwndDlg, pParam->nId, CB_SETCURSEL, nTmpIdx, 0); } }
void CPhoneBookInfo::LoadCountries(HWND hwndDlg, UINT nIdCountry, DWORD dwCountryId) { CMTRACE(TEXT("CPhoneBookInfo::LoadCountries"));
if (OS_NT51) { return LoadCountriesW(hwndDlg, nIdCountry, dwCountryId); } else { return LoadCountriesA(hwndDlg, nIdCountry, dwCountryId); } }
//
// Note: this function and its mirror function LoadCountriesW must stay in sync
//
void CPhoneBookInfo::LoadCountriesA(HWND hwndDlg, UINT nIdCountry, DWORD dwCountryId) { UINT nIdx; DWORD_PTR nServiceType;
CMTRACE(TEXT("CPhoneBookInfo::LoadCountriesA"));
CmFree(m_pnRegionIdx); m_pnRegionIdx = NULL; m_nRegionIdx = 0; m_nIdCountry = nIdCountry; SendDlgItemMessageA(hwndDlg, nIdCountry, CB_RESETCONTENT, 0, 0); nIdx = (UINT) SendDlgItemMessageA(hwndDlg, m_nIdServiceType, CB_GETCURSEL, 0, 0);
if (nIdx == CB_ERR) { return; } nServiceType = SendDlgItemMessageA(hwndDlg, m_nIdServiceType, CB_GETITEMDATA, nIdx, 0); MYDBGASSERT(nServiceType<m_nServiceInfo); for (nIdx=0; nIdx < m_nServiceInfo; nIdx++) { if (m_psiServiceInfo[nIdx].nServiceString == nServiceType) { LoadCountriesCBStruct sParam = {m_Map.GetPBByIdx(m_psiServiceInfo[nIdx].dwPB), hwndDlg, nIdCountry, dwCountryId?dwCountryId:PhoneBookGetCurrentCountryId()};
PhoneBookEnumCountries(m_Map.GetPBByIdx(m_psiServiceInfo[nIdx].dwPB), _LoadCountriesCBA, m_psiServiceInfo[nIdx].pFilter, (DWORD_PTR) &sParam); } } if ((SendDlgItemMessageA(hwndDlg,nIdCountry,CB_GETCURSEL,0,0) == CB_ERR) && (SendDlgItemMessageA(hwndDlg,nIdCountry,CB_GETCOUNT,0,0) != 0)) { SendDlgItemMessageA(hwndDlg,nIdCountry,CB_SETCURSEL,0,0); } }
//
// Note: this function and its mirror function LoadCountriesA must stay in sync
//
void CPhoneBookInfo::LoadCountriesW(HWND hwndDlg, UINT nIdCountry, DWORD dwCountryId) { UINT nIdx; DWORD_PTR nServiceType;
CMTRACE(TEXT("CPhoneBookInfo::LoadCountriesW"));
CmFree(m_pnRegionIdx); m_pnRegionIdx = NULL; m_nRegionIdx = 0; m_nIdCountry = nIdCountry; SendDlgItemMessageW(hwndDlg, nIdCountry, CB_RESETCONTENT, 0, 0); nIdx = (UINT) SendDlgItemMessageW(hwndDlg, m_nIdServiceType, CB_GETCURSEL, 0, 0);
if (nIdx == CB_ERR) { return; } nServiceType = SendDlgItemMessageW(hwndDlg, m_nIdServiceType, CB_GETITEMDATA, nIdx, 0); MYDBGASSERT(nServiceType<m_nServiceInfo); for (nIdx=0; nIdx < m_nServiceInfo; nIdx++) { if (m_psiServiceInfo[nIdx].nServiceString == nServiceType) { LoadCountriesCBStruct sParam = {m_Map.GetPBByIdx(m_psiServiceInfo[nIdx].dwPB), hwndDlg, nIdCountry, dwCountryId?dwCountryId:PhoneBookGetCurrentCountryId()};
PhoneBookEnumCountries(m_Map.GetPBByIdx(m_psiServiceInfo[nIdx].dwPB), _LoadCountriesCBW, m_psiServiceInfo[nIdx].pFilter, (DWORD_PTR) &sParam); } } if ((SendDlgItemMessageW(hwndDlg,nIdCountry,CB_GETCURSEL,0,0) == CB_ERR) && (SendDlgItemMessageW(hwndDlg,nIdCountry,CB_GETCOUNT,0,0) != 0)) { SendDlgItemMessageW(hwndDlg,nIdCountry,CB_SETCURSEL,0,0); } }
typedef struct tagLoadRegionsCBStruct { CPhoneBookInfo *pPhoneBook; DWORD_PTR dwPB; HWND hwndDlg; UINT nId; LPCSTR pszRegionName; UINT nServiceInfo; } LoadRegionsCBStruct;
void CPhoneBookInfo::LoadRegionsCB(unsigned int nIdx, DWORD_PTR dwParam) { UINT nTmpIdx;
LoadRegionsCBStruct *pParam = (LoadRegionsCBStruct *) dwParam; CHAR szRegionName[256]; DWORD dwLen;
dwLen = sizeof(szRegionName) / sizeof(CHAR); PhoneBookGetRegionNameA(pParam->dwPB, nIdx, szRegionName, &dwLen); ExtendArray((void **) &m_pnRegionIdx, sizeof(*m_pnRegionIdx)*m_nServiceInfo, &m_nRegionIdx); for (nTmpIdx = 0; nTmpIdx < m_nServiceInfo; nTmpIdx++) { m_pnRegionIdx[m_nServiceInfo*(m_nRegionIdx-1) + nTmpIdx] = UINT_MAX; } nTmpIdx = (UINT) SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_FINDSTRINGEXACT, 0, (LPARAM) szRegionName); if (nTmpIdx == CB_ERR) { nTmpIdx = (UINT) SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_ADDSTRING, 0, (LPARAM) szRegionName); SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_SETITEMDATA, nTmpIdx, m_nRegionIdx - 1);
if (pParam->pszRegionName && (lstrcmpA(szRegionName, pParam->pszRegionName) == 0)) { SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_SETCURSEL, nTmpIdx, 0); }
m_pnRegionIdx[m_nServiceInfo*(m_nRegionIdx-1) + pParam->nServiceInfo] = nIdx;
} else { DWORD_PTR dwTmp = SendDlgItemMessageA(pParam->hwndDlg, pParam->nId, CB_GETITEMDATA, nTmpIdx, 0); m_pnRegionIdx[m_nServiceInfo*dwTmp + pParam->nServiceInfo] = nIdx; } }
static void WINAPI _LoadRegionsCB(unsigned int nIdx, DWORD_PTR dwParam) {
((LoadRegionsCBStruct *) dwParam)->pPhoneBook->LoadRegionsCB(nIdx,dwParam); }
void CPhoneBookInfo::LoadRegions(HWND hwndDlg, UINT nIdRegion, LPCTSTR pszRegionName) { UINT nIdx; DWORD dwServiceType; DWORD dwCountryID;
CMTRACE(TEXT("CPhoneBookInfo::LoadRegions"));
CmFree(m_pnRegionIdx); m_pnRegionIdx = NULL; m_nRegionIdx = 0; m_nIdRegion = nIdRegion; SendDlgItemMessageU(hwndDlg,nIdRegion,CB_RESETCONTENT,0,0); nIdx = (UINT) SendDlgItemMessageU(hwndDlg,m_nIdServiceType,CB_GETCURSEL,0,0); if (nIdx == CB_ERR) { return; } dwServiceType = (DWORD)SendDlgItemMessageU(hwndDlg,m_nIdServiceType,CB_GETITEMDATA,nIdx,0); MYDBGASSERT(dwServiceType<m_nServiceInfo); nIdx = (UINT) SendDlgItemMessageU(hwndDlg,m_nIdCountry,CB_GETCURSEL,0,0); if (nIdx == CB_ERR) { return; } dwCountryID = (DWORD)SendDlgItemMessageU(hwndDlg,m_nIdCountry,CB_GETITEMDATA,nIdx,0); for (nIdx=0;nIdx<m_nServiceInfo;nIdx++) { if (m_psiServiceInfo[nIdx].nServiceString == dwServiceType) {
#ifdef UNICODE
LPSTR pszAnsiRegionName = WzToSzWithAlloc(pszRegionName);
if (NULL == pszAnsiRegionName) { return; } #endif
LoadRegionsCBStruct sParam = {this, m_Map.GetPBByIdx(m_psiServiceInfo[nIdx].dwPB), hwndDlg, nIdRegion, #ifdef UNICODE
pszAnsiRegionName, #else
pszRegionName, #endif
nIdx};
PhoneBookEnumRegions(sParam.dwPB, _LoadRegionsCB, dwCountryID, m_psiServiceInfo[nIdx].pFilter, (DWORD_PTR) &sParam); #ifdef UNICODE
CmFree(pszAnsiRegionName); #endif
} } if (SendDlgItemMessageU(hwndDlg,nIdRegion,CB_GETCOUNT,0,0) != 0) { EnableWindow(GetDlgItem(hwndDlg,nIdRegion),TRUE); /* 10763 */ EnableWindow(GetDlgItem(hwndDlg, IDC_PHONEBOOK_REGION_STATIC), TRUE); } else { EnableWindow(GetDlgItem(hwndDlg,nIdRegion),FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_PHONEBOOK_REGION_STATIC), FALSE); }
if ((SendDlgItemMessageU(hwndDlg,nIdRegion,CB_GETCURSEL,0,0) == CB_ERR) && (SendDlgItemMessageU(hwndDlg,nIdRegion,CB_GETCOUNT,0,0) != 0)) { SendDlgItemMessageU(hwndDlg,nIdRegion,CB_SETCURSEL,0,0); } }
typedef struct tagLoadNumbersCBStruct { CPhoneBookInfo *pPhoneBook; DWORD_PTR dwPB; HWND hwndDlg; UINT nIdA; UINT nIdB; UINT nIdMore; PPBFS pFilterA; PPBFS pFilterB; LPCSTR pszPhoneNumber; LPCSTR pszPhoneBookFile; } LoadNumbersCBStruct;
void CPhoneBookInfo::LoadNumbersCB(unsigned int nIdx, DWORD_PTR dwParam) { UINT nTmpIdx;
LoadNumbersCBStruct *pParam = (LoadNumbersCBStruct *) dwParam; CHAR szPhoneNumber[256]; DWORD dwType = PhoneBookGetPhoneType(pParam->dwPB, nIdx); UINT nId; UINT nOtherId; DWORD dwLen; BOOL bMatch = FALSE; DWORD dwCookie = m_Map.ToCookie(pParam->dwPB, nIdx); LPSTR pszAnsiPhoneBookFile;
#ifdef UNICODE
pszAnsiPhoneBookFile = WzToSzWithAlloc(GetFile(dwCookie));
if (NULL == pszAnsiPhoneBookFile) { CMASSERTMSG(FALSE, TEXT("CPhoneBookInfo::LoadNumbersCB -- Insufficient memory for Wide to Ansi conversion.")); goto exit; } #else
pszAnsiPhoneBookFile = GetFile(dwCookie); #endif
if (PhoneBookMatchFilter(pParam->pFilterA,dwType)) { nId = pParam->nIdA; nOtherId = pParam->nIdB; } else if (PhoneBookMatchFilter(pParam->pFilterB,dwType)) { nId = pParam->nIdB; nOtherId = pParam->nIdA; } else { goto exit; } if (pParam->pszPhoneNumber && pParam->pszPhoneBookFile) { dwLen = sizeof(szPhoneNumber) / sizeof(TCHAR);
PhoneBookGetPhoneCanonical(pParam->dwPB, nIdx, szPhoneNumber, &dwLen);
if ((lstrcmpA(szPhoneNumber, pParam->pszPhoneNumber) == 0) && (lstrcmpA(pszAnsiPhoneBookFile, pParam->pszPhoneBookFile) == 0)) { bMatch = TRUE; } } if (GetDlgItem(pParam->hwndDlg,nId)) {
dwLen = sizeof(szPhoneNumber) / sizeof(TCHAR);
PhoneBookGetPhoneDisp(pParam->dwPB, nIdx, szPhoneNumber, &dwLen); nTmpIdx = (UINT) SendDlgItemMessageA(pParam->hwndDlg, nId, LB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM) szPhoneNumber);
if (nTmpIdx != LB_ERR) { goto exit; }
nTmpIdx = (UINT) SendDlgItemMessageA(pParam->hwndDlg, nId, LB_ADDSTRING, 0, (LPARAM) szPhoneNumber);
DWORD_PTR dwSet = SendDlgItemMessageA(pParam->hwndDlg, nId, LB_SETITEMDATA, nTmpIdx, (LPARAM) dwCookie);
#ifdef DEBUG
if (LB_ERR == dwSet) { CMTRACE(TEXT("PBDlgProc() LB_SETITEMDATA failed")); } #endif
} else { EnableWindow(GetDlgItem(pParam->hwndDlg,pParam->nIdMore),TRUE); if (bMatch) { SendMessageA(pParam->hwndDlg, WM_COMMAND, pParam->nIdMore, 0); } }
exit:
#ifdef UNICODE
CmFree(pszAnsiPhoneBookFile); #endif
return; }
static void WINAPI _LoadNumbersCB(unsigned int nIdx, DWORD_PTR dwParam) { ((LoadNumbersCBStruct *) dwParam)->pPhoneBook->LoadNumbersCB(nIdx,dwParam); }
void CPhoneBookInfo::LoadNumbers(HWND hwndDlg, UINT nIdNumberA, UINT nIdNumberB, UINT nIdMore, LPCTSTR pszPhoneNumber, LPCTSTR pszPhoneBookFile) { UINT nIdx; DWORD dwServiceType; DWORD dwCountryID; DWORD dwRegionIdx = UINT_MAX;
CMTRACE(TEXT("CPhoneBookInfo::LoadNumbers"));
LPSTR pszAnsiPhoneNumber = NULL; LPSTR pszAnsiPhoneBookFile = NULL;
#ifdef UNICODE
pszAnsiPhoneNumber = WzToSzWithAlloc(pszPhoneNumber);
if (NULL == pszAnsiPhoneNumber) { CMTRACE(TEXT("CPhoneBookInfo::LoadNumbers -- Insufficient Memory to convert from Wide to MBCS for pszPhoneNumber")); goto exit; }
pszAnsiPhoneBookFile = WzToSzWithAlloc(pszPhoneBookFile);
if (NULL == pszAnsiPhoneBookFile) { CMTRACE(TEXT("CPhoneBookInfo::LoadNumbers -- Insufficient Memory to convert from Wide to MBCS for pszPhoneBookFile")); goto exit; }
#else
pszAnsiPhoneNumber = (LPSTR)pszPhoneNumber; pszAnsiPhoneBookFile = (LPSTR)pszPhoneBookFile; #endif
SendDlgItemMessageA(hwndDlg, nIdNumberA, LB_RESETCONTENT, 0, 0); SendDlgItemMessageA(hwndDlg, nIdNumberB, LB_RESETCONTENT, 0, 0);
#if 0
// EnableWindow(GetDlgItem(hwndDlg,nIdMore),FALSE); Note: More button is now obsolete
#endif
//
// Get the current service type
//
nIdx = (UINT) SendDlgItemMessageA(hwndDlg, m_nIdServiceType, CB_GETCURSEL, 0, 0);
if (nIdx == CB_ERR) { goto exit; }
dwServiceType = (DWORD)SendDlgItemMessageA(hwndDlg, m_nIdServiceType, CB_GETITEMDATA, nIdx, 0); MYDBGASSERT(dwServiceType < m_nServiceInfo); //
// Get the current country code
//
nIdx = (UINT) SendDlgItemMessageA(hwndDlg, m_nIdCountry, CB_GETCURSEL, 0, 0); if (nIdx == CB_ERR) { goto exit; }
dwCountryID = (DWORD)SendDlgItemMessageA(hwndDlg, m_nIdCountry, CB_GETITEMDATA, nIdx, 0); //
// Get the current region ID
//
nIdx = (UINT) SendDlgItemMessageA(hwndDlg, m_nIdRegion, CB_GETCURSEL, 0, 0);
if (nIdx != CB_ERR) { dwRegionIdx = (DWORD)SendDlgItemMessageA(hwndDlg, m_nIdRegion, CB_GETITEMDATA, nIdx, 0); } for (nIdx=0; nIdx < m_nServiceInfo; nIdx++) { if (m_psiServiceInfo[nIdx].nServiceString == dwServiceType) { if ((dwRegionIdx == UINT_MAX) || (m_pnRegionIdx[m_nServiceInfo*dwRegionIdx+nIdx] != UINT_MAX)) { LoadNumbersCBStruct sParam = {this, m_Map.GetPBByIdx(m_psiServiceInfo[nIdx].dwPB), hwndDlg, nIdNumberA, nIdNumberB, nIdMore, m_psiServiceInfo[nIdx].pFilterA, m_psiServiceInfo[nIdx].pFilterB, pszAnsiPhoneNumber, pszAnsiPhoneBookFile};
PhoneBookEnumNumbers(sParam.dwPB, _LoadNumbersCB, dwCountryID, (dwRegionIdx == UINT_MAX) ? UINT_MAX : m_pnRegionIdx[m_nServiceInfo*dwRegionIdx+nIdx], m_psiServiceInfo[nIdx].pFilter, (DWORD_PTR) &sParam); } else { //
// Multiple PBKs (especially if one has no regions) can create a
// situation in which we have a valid region selection in the combo
// but the m_pnRegionIdx[m_nServiceInfo*dwRegionIdx+nIdx] is
// UINT_MAX. What we do in this situation is enumerate the
// numbers such that only those without regions are added to the
// list by enumerating phone numbers with region 0.
//
if ((dwRegionIdx != UINT_MAX) && (m_pnRegionIdx[m_nServiceInfo*dwRegionIdx+nIdx] == UINT_MAX)) { LoadNumbersCBStruct sParam = {this, m_Map.GetPBByIdx(m_psiServiceInfo[nIdx].dwPB), hwndDlg, nIdNumberA, nIdNumberB, nIdMore, m_psiServiceInfo[nIdx].pFilterA, m_psiServiceInfo[nIdx].pFilterB, pszAnsiPhoneNumber, pszAnsiPhoneBookFile};
PhoneBookEnumNumbersWithRegionsZero(sParam.dwPB, _LoadNumbersCB, dwCountryID, m_psiServiceInfo[nIdx].pFilter, (DWORD_PTR) &sParam); } } } }
exit:
#ifdef UNICODE
CmFree(pszAnsiPhoneNumber); CmFree(pszAnsiPhoneBookFile); #endif
return; }
BOOL CPhoneBookInfo::HasMoreNumbers() { //
// Filters are stored by service type, so examine each one.
//
for (UINT nIdx = 0; nIdx < m_nServiceInfo; nIdx++) { if (PhoneBookHasPhoneType(m_Map.GetPBByIdx(m_psiServiceInfo[nIdx].dwPB), m_psiServiceInfo[nIdx].pFilterB)) { return TRUE; } }
return FALSE; }
BOOL CPhoneBookInfo::LoadFile(LPCTSTR pszFile, PPBFS pFilterA, PPBFS pFilterB) { CMTRACE(TEXT("CPhoneBookInfo::LoadFile"));
LPSTR pszAnsiFile = NULL; BOOL bRes = TRUE;
#ifdef UNICODE
pszAnsiFile = WzToSzWithAlloc(pszFile); if (!pszAnsiFile) { return FALSE; } #else
pszAnsiFile = (LPSTR)pszFile; #endif
SCBS sSvc = {this,pFilterA,pFilterB,0,pszAnsiFile}; PhoneBookParseInfoStruct iInfo;
sSvc.dwPB = m_Map.Open(pszAnsiFile, m_nServiceInfo); if (sSvc.dwPB == CPBMAP_ERROR) { bRes = FALSE; goto exit; }
ZeroMemory(&iInfo, sizeof(iInfo)); iInfo.dwSize = sizeof(iInfo); iInfo.pfnSvc = _ServiceCB; iInfo.dwSvcParam = (DWORD_PTR) &sSvc;
CMTRACE(TEXT("CPhoneBookInfo::LoadFile - ParseInfo"));
bRes = PhoneBookParseInfo(pszAnsiFile, &iInfo);
PhoneBookFreeFilter(iInfo.pFilterA); PhoneBookFreeFilter(iInfo.pFilterB);
exit:
#ifdef UNICODE
CmFree(pszAnsiFile); #endif
return (bRes); }
BOOL CPhoneBookInfo::ServiceCB(LPCTSTR pszSvc, PPBFS pFilter, PPBFS pFilterA, PPBFS pFilterB, DWORD dwPB, LPCTSTR pszFile) { ServiceInfo *psiInfo; UINT nIdx;
CMTRACE(TEXT("CPhoneBookInfo::ServiceCB"));
//
// Extended m_psiServiceInfo and set up the new element
//
ExtendArray((void **) &m_psiServiceInfo,sizeof(*m_psiServiceInfo),&m_nServiceInfo); psiInfo = &m_psiServiceInfo[m_nServiceInfo-1]; psiInfo->dwPB = dwPB; psiInfo->pFilter = pFilter; psiInfo->pFilterA = PhoneBookCopyFilter(pFilterA); psiInfo->pFilterB = PhoneBookCopyFilter(pFilterB); psiInfo->pszFile = CmStrCpyAlloc(pszFile); for (nIdx=0;nIdx<m_nServiceString;nIdx++) { if (lstrcmpU(pszSvc,m_ppszServiceString[nIdx]) == 0) { psiInfo->nServiceString = nIdx; break; } } if (nIdx == m_nServiceString) { ExtendArray((void **) &m_ppszServiceString,sizeof(*m_ppszServiceString),&m_nServiceString); m_ppszServiceString[m_nServiceString-1] = CmStrCpyAlloc(pszSvc); psiInfo->nServiceString = m_nServiceString - 1; } return (TRUE); }
static BOOL WINAPI _ReferenceCB(LPCSTR pszFile, LPCSTR pszURL, PPBFS pFilterA, PPBFS pFilterB, DWORD_PTR dwParam) { CPhoneBookInfo *pParam = (CPhoneBookInfo *) dwParam;
#ifdef UNICODE
LPWSTR pszwFile = NULL; pszwFile = SzToWzWithAlloc(pszFile); BOOL bReturn = FALSE;
if (NULL != pszwFile) { bReturn = pParam->LoadFile(pszwFile, pFilterA, pFilterB); CmFree(pszwFile); } else { CMTRACE(TEXT("_ReferenceCB -- CmMalloc returned a NULL pointer.")); }
return bReturn;
#else
return (pParam->LoadFile(pszFile, pFilterA, pFilterB)); #endif
}
static BOOL CALLBACK _ServiceCB(LPCSTR pszSvc, PPBFS pFilter, DWORD_PTR dwParam) { CPhoneBookInfo::SCBS *pParam = (CPhoneBookInfo::SCBS *) dwParam;
#ifdef UNICODE
BOOL bReturn = FALSE; LPWSTR pszwSvc = SzToWzWithAlloc(pszSvc); LPWSTR pszwFile = SzToWzWithAlloc(pParam->pszFile);
if ((NULL != pszwFile) && (NULL != pszwSvc)) { bReturn = (pParam->pInfo->ServiceCB)(pszwSvc, pFilter, pParam->pFilterA, pParam->pFilterB, pParam->dwPB, pszwFile); }
CmFree(pszwSvc); CmFree(pszwFile);
return bReturn;
#else
return (pParam->pInfo->ServiceCB(pszSvc, pFilter, pParam->pFilterA, pParam->pFilterB, pParam->dwPB, pParam->pszFile)); #endif
}
typedef struct tagPBDlgArgs { PBArgs *pPBArgs; CPhoneBookInfo cPB; BMPDATA BmpData; } PBDlgArgs;
static BOOL PBDlgFillData(HWND hwndDlg, PBArgs *pPBArgs, CPhoneBookInfo *pPB, BOOL fValidateDun) { UINT nTmpIdx; UINT nId; DWORD dwLen;
GetDlgItemTextU(hwndDlg,IDC_PHONEBOOK_SERVICETYPE_COMBO,pPBArgs->szServiceType,sizeof(pPBArgs->szServiceType)/sizeof(TCHAR)-1); nTmpIdx = (UINT) SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOK_COUNTRY_COMBO,CB_GETCURSEL,0,0); if (nTmpIdx != CB_ERR) { pPBArgs->dwCountryId = (DWORD)SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOK_COUNTRY_COMBO,CB_GETITEMDATA,nTmpIdx,0); } else { pPBArgs->dwCountryId = PhoneBookGetCurrentCountryId(); } GetDlgItemTextU(hwndDlg,IDC_PHONEBOOK_REGION_COMBO,pPBArgs->szRegionName,sizeof(pPBArgs->szRegionName)/sizeof(TCHAR)-1); nId = IDC_PHONEBOOK_PHONE_LIST; nTmpIdx = (UINT) SendDlgItemMessageU(hwndDlg,nId,LB_GETCURSEL,0,0); if (nTmpIdx == LB_ERR) { if (GetDlgItem(hwndDlg,IDC_PHONEBOOKEX_PHONE_LIST)) { nId = IDC_PHONEBOOKEX_PHONE_LIST; nTmpIdx = (UINT) SendDlgItemMessageU(hwndDlg,nId,LB_GETCURSEL,0,0);
UINT nTmpCount = (UINT) SendDlgItemMessageU(hwndDlg,nId,LB_GETCOUNT,0,0);
} } if (nTmpIdx != LB_ERR) { DWORD dwIdx = (DWORD)SendDlgItemMessageU(hwndDlg,nId,LB_GETITEMDATA,nTmpIdx,0); if (dwIdx != LB_ERR) { dwLen = sizeof(pPBArgs->szNonCanonical) / sizeof(TCHAR); pPB->GetNonCanonical(dwIdx,pPBArgs->szNonCanonical,&dwLen);
dwLen = sizeof(pPBArgs->szCanonical) / sizeof(TCHAR); pPB->GetCanonical(dwIdx,pPBArgs->szCanonical,&dwLen);
dwLen = sizeof(pPBArgs->szDesc) / sizeof(TCHAR); pPB->GetDesc(dwIdx,pPBArgs->szDesc,&dwLen); lstrcpynU(pPBArgs->szPhoneBookFile,pPB->GetFile(dwIdx),sizeof(pPBArgs->szPhoneBookFile)/sizeof(TCHAR)); dwLen = sizeof(pPBArgs->szDUNFile) / sizeof(TCHAR); pPB->GetDUN(dwIdx,pPBArgs->szDUNFile,&dwLen); if (fValidateDun) { //
// Make sure we can support any DUN settings associated with the number
//
if (FALSE == ValidateDialupDunSettings(pPBArgs->szPhoneBookFile, pPBArgs->szDUNFile, pPBArgs->pszCMSFile)) { return FALSE; } } } #ifdef DEBUG
if (LB_ERR == dwIdx) { CMTRACE(TEXT("PBDlgProc() LB_GETITEMDATA failed")); } #endif
}
return TRUE; }
INT_PTR CALLBACK PBDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PBDlgArgs *pArgs = (PBDlgArgs *) GetWindowLongU(hwndDlg,DWLP_USER); static DWORD adwHelp[] = {IDC_PHONEBOOK_SERVICETYPE_COMBO,IDH_PHONEBOOK_SERVICETYP, IDC_PHONEBOOK_COUNTRY_COMBO,IDH_PHONEBOOK_COUNTRY, IDC_PHONEBOOK_REGION_COMBO,IDH_PHONEBOOK_STATEREG, IDC_PHONEBOOK_REGION_STATIC,IDH_PHONEBOOK_STATEREG, IDC_PHONEBOOK_PHONE_LIST,IDH_PHONEBOOK_ACCESSNUMS, IDC_PHONEBOOK_HELP_BUTTON, IDH_CMHELP, //IDC_PHONEBOOK_MORE_BUTTON,IDH_PHONEBOOK_MORE,
IDC_PHONEBOOKEX_MESSAGE_DISPLAY,IDH_PHONEBOOK_SVCMSG, IDC_PHONEBOOKEX_MORE_STATIC,IDH_PHONEBOOK_MORENUMS, IDC_PHONEBOOKEX_PHONE_LIST,IDH_PHONEBOOK_MORENUMS, 0,0}; switch (uMsg) { case WM_INITDIALOG:
CMTRACE(TEXT("PBDlgProc - WM_INITDIALOG")); UpdateFont(hwndDlg);
pArgs = (PBDlgArgs *) lParam; SetWindowLongU(hwndDlg,DWLP_USER,(LONG_PTR) pArgs); SetDlgItemTextU(hwndDlg,IDC_PHONEBOOKEX_MESSAGE_DISPLAY,pArgs->pPBArgs->pszMessage); pArgs->cPB.LoadServiceTypes(hwndDlg,IDC_PHONEBOOK_SERVICETYPE_COMBO,pArgs->pPBArgs->szServiceType); pArgs->cPB.LoadCountries(hwndDlg,IDC_PHONEBOOK_COUNTRY_COMBO,pArgs->pPBArgs->dwCountryId); pArgs->cPB.LoadRegions(hwndDlg,IDC_PHONEBOOK_REGION_COMBO,pArgs->pPBArgs->szRegionName); pArgs->cPB.LoadNumbers(hwndDlg, IDC_PHONEBOOK_PHONE_LIST, IDC_PHONEBOOKEX_PHONE_LIST, IDC_PHONEBOOK_MORE_BUTTON, pArgs->pPBArgs->szCanonical, pArgs->pPBArgs->szPhoneBookFile);
if ((SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOK_PHONE_LIST,LB_GETCURSEL,0,0) == LB_ERR) && (!GetDlgItem(hwndDlg,IDC_PHONEBOOKEX_PHONE_LIST) || (SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOKEX_PHONE_LIST,LB_GETCURSEL,0,0) == LB_ERR))) { EnableWindow(GetDlgItem(hwndDlg,IDOK),FALSE); } SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOK_BITMAP,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM) &pArgs->BmpData);
if (IsLogonAsSystem()) { EnableWindow(GetDlgItem(hwndDlg, IDC_PHONEBOOK_HELP_BUTTON), FALSE); }
return (FALSE);
case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (PBDlgFillData(hwndDlg, pArgs->pPBArgs, &pArgs->cPB, TRUE)) { EndDialog(hwndDlg,1); } return (TRUE);
case IDC_PHONEBOOK_HELP_BUTTON: CmWinHelp(hwndDlg, hwndDlg, pArgs->pPBArgs->pszHelpFile,HELP_FORCEFILE,ICM_TRB); return (TRUE);
case IDCANCEL: EndDialog(hwndDlg,0); return (TRUE);
case IDC_PHONEBOOK_MORE_BUTTON: MYDBGASSERT(FALSE); // Now obsolete
PBDlgFillData(hwndDlg, pArgs->pPBArgs, &pArgs->cPB, FALSE); EndDialog(hwndDlg,2); return (TRUE);
default: if ((HIWORD(wParam) == CBN_SELCHANGE) || (HIWORD(wParam) == LBN_SELCHANGE)) { switch (LOWORD(wParam)) { case IDC_PHONEBOOK_SERVICETYPE_COMBO:
PBDlgFillData(hwndDlg, pArgs->pPBArgs, &pArgs->cPB, FALSE); pArgs->cPB.LoadCountries(hwndDlg,IDC_PHONEBOOK_COUNTRY_COMBO,pArgs->pPBArgs->dwCountryId);
// fall through
case IDC_PHONEBOOK_COUNTRY_COMBO:
pArgs->cPB.LoadRegions(hwndDlg,IDC_PHONEBOOK_REGION_COMBO,pArgs->pPBArgs->szRegionName); // fall through
case IDC_PHONEBOOK_REGION_COMBO:
pArgs->cPB.LoadNumbers(hwndDlg, IDC_PHONEBOOK_PHONE_LIST, IDC_PHONEBOOKEX_PHONE_LIST, IDC_PHONEBOOK_MORE_BUTTON, pArgs->pPBArgs->szCanonical, pArgs->pPBArgs->szPhoneBookFile);
if ((SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOK_PHONE_LIST,LB_GETCURSEL,0,0) == LB_ERR) && (!GetDlgItem(hwndDlg,IDC_PHONEBOOKEX_PHONE_LIST) || (SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOKEX_PHONE_LIST,LB_GETCURSEL,0,0) == LB_ERR))) { EnableWindow(GetDlgItem(hwndDlg,IDOK),FALSE); } else { EnableWindow(GetDlgItem(hwndDlg,IDOK),TRUE); }
return (TRUE);
case IDC_PHONEBOOK_PHONE_LIST: if (SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOK_PHONE_LIST,LB_GETCURSEL,0,0) != LB_ERR) { EnableWindow(GetDlgItem(hwndDlg,IDOK),TRUE); SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOKEX_PHONE_LIST,LB_SETCURSEL,(WPARAM) -1,0); } return (TRUE);
case IDC_PHONEBOOKEX_PHONE_LIST: if (SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOKEX_PHONE_LIST,LB_GETCURSEL,0,0) != LB_ERR) { EnableWindow(GetDlgItem(hwndDlg,IDOK),TRUE); SendDlgItemMessageU(hwndDlg,IDC_PHONEBOOK_PHONE_LIST,LB_SETCURSEL,(WPARAM) -1,0); } return (TRUE);
default: break; } } if (HIWORD(wParam) == LBN_DBLCLK) { switch (LOWORD(wParam)) { case IDC_PHONEBOOK_PHONE_LIST: case IDC_PHONEBOOKEX_PHONE_LIST: if (SendDlgItemMessageU(hwndDlg,LOWORD(wParam),LB_GETCURSEL,0,0) != LB_ERR) { SendMessageU(hwndDlg, WM_COMMAND, IDOK, 0); } break;
default: break; } } break; } break;
case WM_HELP: { LPHELPINFO lpHelpInfo = (LPHELPINFO) lParam;
CmWinHelp((HWND) (lpHelpInfo->hItemHandle), (HWND) (lpHelpInfo->hItemHandle), pArgs->pPBArgs->pszHelpFile, HELP_WM_HELP, (ULONG_PTR) ((LPTSTR) adwHelp));
return (TRUE); }
case WM_CONTEXTMENU: {
POINT pt = {LOWORD(lParam), HIWORD(lParam)}; HWND hWndItem; ScreenToClient(hwndDlg, &pt); hWndItem = ChildWindowFromPoint(hwndDlg, pt); if (hWndItem != NULL && HaveContextHelp(hwndDlg, hWndItem)) { CmWinHelp((HWND) wParam, hWndItem,pArgs->pPBArgs->pszHelpFile,HELP_CONTEXTMENU,(ULONG_PTR) (LPSTR) adwHelp); return (TRUE); } //
// 170599: Assertion when right click phone book dialog title bar
// Return FALSE, DefaultWindowProc will handle this message then.
//
return (FALSE); }
case WM_PALETTEISCHANGING: CMTRACE2(TEXT("PBDlgProc() got WM_PALETTEISCHANGING message, wParam=0x%x, hwndDlg=0x%x."), wParam, hwndDlg); break;
case WM_PALETTECHANGED: { if ((wParam != (WPARAM) hwndDlg) && pArgs->BmpData.hDIBitmap) { PaletteChanged(&pArgs->BmpData, hwndDlg, IDC_PHONEBOOK_BITMAP); } else { CMTRACE2(TEXT("PBDlgProc().WM_PALETTECHANGED not changing palette, wParam=0x%x, hwndDlg=0x%x."), wParam, hwndDlg); } break; }
case WM_QUERYNEWPALETTE:
QueryNewPalette(&pArgs->BmpData, hwndDlg, IDC_PHONEBOOK_BITMAP); break;
default: break; } return (FALSE); }
BOOL DisplayPhoneBook(HWND hwndDlg, PBArgs *pPBArgs, BOOL fHasValidTopLevelPBK, BOOL fHasValidReferencedPBKs) { PBDlgArgs sDlgArgs; BOOL bRes = FALSE; HWND hwndParent = NULL; CNamedMutex PbMutex;
memset(&sDlgArgs,0,sizeof(sDlgArgs)); sDlgArgs.pPBArgs = pPBArgs;
//
// Show wait cursor and attempt to grab PB access mutex
//
HCURSOR hPrev = SetCursor(LoadCursorU(NULL,IDC_WAIT)); if (PbMutex.Lock(c_pszCMPhoneBookMutex, TRUE, MAX_PB_WAIT)) { sDlgArgs.cPB.Load(pPBArgs->pszCMSFile, fHasValidTopLevelPBK, fHasValidReferencedPBKs); PbMutex.Unlock(); } else { SetCursor(hPrev); CMTRACE(TEXT("DisplayPhoneBook() - Unable to grab PB access mutex.")); return bRes; }
//
// We have a phonebook to display, setup graphics
//
if (pPBArgs->pszBitmap && *pPBArgs->pszBitmap) { sDlgArgs.BmpData.hDIBitmap = CmLoadBitmap(g_hInst, pPBArgs->pszBitmap); } if (!sDlgArgs.BmpData.hDIBitmap) { sDlgArgs.BmpData.hDIBitmap = CmLoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_PB)); } if (sDlgArgs.BmpData.hDIBitmap) { //
// Create a new Device Dependent bitmap
//
sDlgArgs.BmpData.phMasterPalette = pPBArgs->phMasterPalette; sDlgArgs.BmpData.bForceBackground = TRUE; // paint as a background app
CreateBitmapData(sDlgArgs.BmpData.hDIBitmap, &sDlgArgs.BmpData, hwndDlg, TRUE); }
//
// Determine the template to be used, if the aggregate PB contains any
// surcharge numbers then use the EX template for displaying more numbers.
//
LPCTSTR pszDlgBox = NULL; if (sDlgArgs.cPB.HasMoreNumbers()) { pszDlgBox = MAKEINTRESOURCE(IDD_PHONEBOOKEX); } else { pszDlgBox = MAKEINTRESOURCE(IDD_PHONEBOOK); }
MYDBGASSERT(pszDlgBox);
//
// Restore cursor and display the PB dialog
//
SetCursor(hPrev);
hwndParent = hwndDlg;
#if 0
/*
//
// Previously, the user drove the template decision by electing to see
// More numbers via the More button. The return code from the proc would
// dictate if we should simply call it a again with a different template.
// Hence this loop and switch.
//
while (1) { switch (DialogBoxParam(g_hInst, pszDlgBox, hwndParent, (DLGPROC) PBDlgProc, (LPARAM) &sDlgArgs)) { case 1: bRes = TRUE; break;
case 2: pszDlgBox = MAKEINTRESOURCE(IDD_PHONEBOOKEX); continue;
case 0: default: break; } //
// Release bitmap resources for dlg
//
ReleaseBitmapData(&sDlgArgs.BmpData); return (bRes); } */ #else
bRes = (BOOL) DialogBoxParamU(g_hInst, pszDlgBox, hwndParent, (DLGPROC) PBDlgProc, (LPARAM) &sDlgArgs);
ReleaseBitmapData(&sDlgArgs.BmpData); return (bRes); #endif
}
|