//+---------------------------------------------------------------------------- // // File: gppswithalloc.cpp // // Module: CMDIAL32.DLL, CMAK.EXE // // Synopsis: GetPrivateProfileStringWithAlloc and AddAllKeysInCurrentSectionToCombo // are implemented here // // Copyright (c) 2000-2001 Microsoft Corporation // // Author: quintinb Created 11/01/00 // //+---------------------------------------------------------------------------- #ifndef _CMUTOA #ifndef GetPrivateProfileStringU #ifdef UNICODE #define GetPrivateProfileStringU GetPrivateProfileStringW #else #define GetPrivateProfileStringU GetPrivateProfileStringA #endif #endif #ifndef lstrlenU #ifdef UNICODE #define lstrlenU lstrlenW #else #define lstrlenU lstrlenA #endif #endif #ifndef SendDlgItemMessageU #ifdef UNICODE #define SendDlgItemMessageU SendDlgItemMessageW #else #define SendDlgItemMessageU SendDlgItemMessageA #endif #endif #endif //+--------------------------------------------------------------------------- // // Function: GetPrivateProfileStringWithAlloc // // Synopsis: A wrapper function to encapsulate calling GetPrivateProfileString // with string allocation code so the caller doesn't have to worry // about buffer sizing. // // Arguments: LPCTSTR pszSection - section to retrieve the key from // LPCTSTR pszKey - keyname to retrieve the value of // LPCTSTR pszDefault - default value to use if the key isn't there // LPCTSTR pszFile - file to get the data from // // Returns: LPTSTR - string retrieved from the file or NULL on failure // // History: quintinb - Created - 11/01/00 //---------------------------------------------------------------------------- LPTSTR GetPrivateProfileStringWithAlloc(LPCTSTR pszSection, LPCTSTR pszKey, LPCTSTR pszDefault, LPCTSTR pszFile) { if ((NULL == pszDefault) || (NULL == pszFile)) { CMASSERTMSG(FALSE, TEXT("GetPrivateProfileStringWithAlloc -- null default or pszFile passed")); return NULL; } BOOL bExitLoop = FALSE; DWORD dwSize = MAX_PATH; DWORD dwReturnedSize; LPTSTR pszStringToReturn = NULL; pszStringToReturn = (TCHAR*)CmMalloc(dwSize*sizeof(TCHAR)); do { MYDBGASSERT(pszStringToReturn); if (pszStringToReturn) { dwReturnedSize = GetPrivateProfileStringU(pszSection, pszKey, pszDefault, pszStringToReturn, dwSize, pszFile); if (((dwReturnedSize == (dwSize - 2)) && ((NULL == pszSection) || (NULL == pszKey))) || ((dwReturnedSize == (dwSize - 1)) && ((NULL != pszSection) && (NULL != pszKey)))) { // // The buffer is too small, lets allocate a bigger one // dwSize = 2*dwSize; if (dwSize > 1024*1024) { CMASSERTMSG(FALSE, TEXT("GetPrivateProfileStringWithAlloc -- Allocation above 1MB, bailing out.")); goto exit; } pszStringToReturn = (TCHAR*)CmRealloc(pszStringToReturn, dwSize*sizeof(TCHAR)); } else if (0 == dwReturnedSize) { // // Either we got an error, or more likely there was no data to get // CmFree(pszStringToReturn); pszStringToReturn = NULL; goto exit; } else { bExitLoop = TRUE; } } else { goto exit; } } while (!bExitLoop); exit: return pszStringToReturn; } //+--------------------------------------------------------------------------- // // Function: AddAllKeysInCurrentSectionToCombo // // Synopsis: This function reads in all the keynames from the given section // and file name and populates them into the combo box specified // by the hDlg and uComboId params. // // Arguments: HWND hDlg - window handle of the dialog containing the combobox // UINT uComboId - control ID of the combobox // LPCTSTR pszSection - section to get the key names from // LPCTSTR pszFile - file to pull the key names from // // Returns: Nothing // // History: quintinb - Created - 11/01/00 //---------------------------------------------------------------------------- void AddAllKeysInCurrentSectionToCombo(HWND hDlg, UINT uComboId, LPCTSTR pszSection, LPCTSTR pszFile) { if ((NULL == hDlg) || (0 == uComboId) || (NULL == pszFile)) { CMASSERTMSG(FALSE, TEXT("AddAllKeysInCurrentSectionToCombo -- Invalid Parameter passed.")); return; } // // Reset the combobox contents // SendDlgItemMessageU(hDlg, uComboId, CB_RESETCONTENT, 0, 0); //lint !e534 CB_RESETCONTENT doesn't return anything useful // // If the section is NULL, just reset the combobox contents and exit // if (NULL != pszSection) { // // Lets get all of the keys in the current section // LPTSTR pszAllKeysInCurrentSection = GetPrivateProfileStringWithAlloc(pszSection, NULL, TEXT(""), pszFile); // // Now process all of the keys in the current section // LPTSTR pszCurrentKey = pszAllKeysInCurrentSection; while (pszCurrentKey && TEXT('\0') != pszCurrentKey[0]) { // // Okay, lets add all of the keys that we found // MYVERIFY(CB_ERR!= SendDlgItemMessageU(hDlg, uComboId, CB_ADDSTRING, 0, (LPARAM)pszCurrentKey)); // // Advance to the next key in pszAllKeysInCurrentSection // pszCurrentKey = pszCurrentKey + lstrlenU(pszCurrentKey) + 1; } CmFree(pszAllKeysInCurrentSection); } }