From: Eric Kohl Date: Mon, 15 May 2017 20:02:48 +0000 (+0000) Subject: [INTL] X-Git-Tag: ReactOS-0.4.6~704 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=4021832267b5ef9b4004369405ab77548a7bbaeb;ds=sidebyside [INTL] Advanced page: Show code pages again. - Use SetupFindFirstLine and SetupFindNextLine to enumerate all code pages. - Use heap memory functions instead of global memory functions. - Get rid of TCHAR. - Rename LPCPAGE to PCPAGE. - Hack: Do not fail if EnumSystemCodePages returns FALSE. svn path=/trunk/; revision=74555 --- diff --git a/reactos/dll/cpl/intl/advanced.c b/reactos/dll/cpl/intl/advanced.c index 059687aacd1..9e3eb63786f 100644 --- a/reactos/dll/cpl/intl/advanced.c +++ b/reactos/dll/cpl/intl/advanced.c @@ -1,60 +1,68 @@ #include "intl.h" +#include + typedef struct CPStruct { - WORD Status; - UINT CPage; - HANDLE hCPage; - TCHAR Name[MAX_PATH]; - struct CPStruct *NextItem; -} CPAGE, *LPCPAGE; - -static LPCPAGE PCPage = NULL; -static HINF hIntlInf; + WORD Status; + UINT CodePage; + WCHAR Name[MAX_PATH]; + struct CPStruct *NextItem; +} CPAGE, *PCPAGE; + +static PCPAGE PCPage = NULL; static BOOL bSpain = FALSE; static HWND hLangList; static BOOL -GetSupportedCP(VOID) +GetSupportedCP( + HINF hInf) { - UINT uiCPage, Number; - LONG Count; - INFCONTEXT infCont; - LPCPAGE lpCPage; - HANDLE hCPage; + INFCONTEXT Context; + PCPAGE pCodePage; CPINFOEX cpInfEx; - //TCHAR Section[MAX_PATH]; + UINT uiCodePage; - Count = SetupGetLineCountW(hIntlInf, L"CodePages"); - if (Count <= 0) return FALSE; + if (!SetupFindFirstLine(hInf, + L"CodePages", + NULL, + &Context)) + return FALSE; - for (Number = 0; Number < (UINT)Count; Number++) + for (;;) { - if (SetupGetLineByIndexW(hIntlInf, L"CodePages", Number, &infCont) && - SetupGetIntField(&infCont, 0, (PINT)&uiCPage)) + if (SetupGetIntField(&Context, 0, (PINT)&uiCodePage)) { - if (!(hCPage = GlobalAlloc(GHND, sizeof(CPAGE)))) return FALSE; + pCodePage = HeapAlloc(GetProcessHeap(), 0, sizeof(CPAGE)); + if (pCodePage == NULL) + return FALSE; - lpCPage = GlobalLock(hCPage); - lpCPage->CPage = uiCPage; - lpCPage->hCPage = hCPage; - lpCPage->Status = 0; - (lpCPage->Name)[0] = 0; + pCodePage->CodePage = uiCodePage; + pCodePage->Status = 0; + (pCodePage->Name)[0] = UNICODE_NULL; - if (GetCPInfoEx(uiCPage, 0, &cpInfEx)) + if (GetCPInfoExW(uiCodePage, 0, &cpInfEx)) { - wcscpy(lpCPage->Name, cpInfEx.CodePageName); + wcscpy(pCodePage->Name, cpInfEx.CodePageName); } - else if (!SetupGetStringFieldW(&infCont, 1, lpCPage->Name, MAX_PATH, NULL)) + else { - GlobalUnlock(hCPage); - GlobalFree(hCPage); - continue; + SetupGetStringFieldW(&Context, 1, pCodePage->Name, MAX_PATH, NULL); } - lpCPage->NextItem = PCPage; - PCPage = lpCPage; + if (wcslen(pCodePage->Name) != 0) + { + pCodePage->NextItem = PCPage; + PCPage = pCodePage; + } + else + { + HeapFree(GetProcessHeap(), 0, pCodePage); + } } + + if (!SetupFindNextLine(&Context, &Context)) + break; } return TRUE; @@ -63,7 +71,7 @@ GetSupportedCP(VOID) static BOOL CALLBACK InstalledCPProc(PWSTR lpStr) { - LPCPAGE lpCP; + PCPAGE lpCP; UINT uiCP; lpCP = PCPage; @@ -71,12 +79,15 @@ InstalledCPProc(PWSTR lpStr) for (;;) { - if (!lpCP) break; - if (lpCP->CPage == uiCP) + if (!lpCP) + break; + + if (lpCP->CodePage == uiCP) { lpCP->Status |= 0x0001; break; } + lpCP = lpCP->NextItem; } @@ -86,17 +97,15 @@ InstalledCPProc(PWSTR lpStr) static VOID InitCodePagesList(HWND hwndDlg) { - LPCPAGE lpCPage; + PCPAGE pCodePage; INT ItemIndex; HWND hList; LV_COLUMN column; LV_ITEM item; RECT ListRect; - - hList = GetDlgItem(hwndDlg, IDC_CONV_TABLES); + HINF hIntlInf; hIntlInf = SetupOpenInfFileW(L"intl.inf", NULL, INF_STYLE_WIN4, NULL); - if (hIntlInf == INVALID_HANDLE_VALUE) return; @@ -107,40 +116,46 @@ InitCodePagesList(HWND hwndDlg) return; } - if (!GetSupportedCP()) + if (!GetSupportedCP(hIntlInf)) return; SetupCloseInfFile(hIntlInf); - if (!EnumSystemCodePages(InstalledCPProc, CP_INSTALLED)) - return; + if (!EnumSystemCodePagesW(InstalledCPProc, CP_INSTALLED)) + { + /* Hack: EnumSystemCodePages returns FALSE on successful completion! */ + /* return; */ + } + + hList = GetDlgItem(hwndDlg, IDC_CONV_TABLES); ZeroMemory(&column, sizeof(LV_COLUMN)); - column.mask = LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; - column.fmt = LVCFMT_LEFT; + column.mask = LVCF_FMT | LVCF_WIDTH; + column.fmt = LVCFMT_LEFT; GetClientRect(hList, &ListRect); - column.cx = ListRect.right - GetSystemMetrics(SM_CYHSCROLL); - (VOID) ListView_InsertColumn(hList, 0, &column); + column.cx = ListRect.right - GetSystemMetrics(SM_CYHSCROLL); + ListView_InsertColumn(hList, 0, &column); - (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT); + (VOID) ListView_SetExtendedListViewStyle(hList, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); - lpCPage = PCPage; + pCodePage = PCPage; for (;;) { - if (!lpCPage) break; + if (pCodePage == NULL) + break; + ZeroMemory(&item, sizeof(LV_ITEM)); - item.mask = LVIF_TEXT|LVIF_PARAM|LVIF_STATE; + item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; item.state = 0; item.stateMask = LVIS_STATEIMAGEMASK; - item.pszText = lpCPage->Name; - item.lParam = (LPARAM)lpCPage; + item.pszText = pCodePage->Name; + item.lParam = (LPARAM)pCodePage; ItemIndex = ListView_InsertItem(hList, &item); - - if (ItemIndex >= 0) + if (ItemIndex != -1) { - if (lpCPage->Status & 0x0001) + if (pCodePage->Status & 0x0001) { ListView_SetItemState(hList, ItemIndex, INDEXTOSTATEIMAGEMASK(LVIS_SELECTED), @@ -154,7 +169,7 @@ InitCodePagesList(HWND hwndDlg) } } - lpCPage = lpCPage->NextItem; + pCodePage = pCodePage->NextItem; } } @@ -278,7 +293,7 @@ SaveFontSubstitutionSettings( return; } - Count = (UINT) SetupGetLineCount(hFontInf, szSection); + Count = (UINT)SetupGetLineCount(hFontInf, szSection); if (Count <= 0) return;