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
This commit is contained in:
Eric Kohl 2017-05-15 20:02:48 +00:00
parent 6ac34f176c
commit 4021832267

View file

@ -1,60 +1,68 @@
#include "intl.h" #include "intl.h"
#include <debug.h>
typedef struct CPStruct typedef struct CPStruct
{ {
WORD Status; WORD Status;
UINT CPage; UINT CodePage;
HANDLE hCPage; WCHAR Name[MAX_PATH];
TCHAR Name[MAX_PATH]; struct CPStruct *NextItem;
struct CPStruct *NextItem; } CPAGE, *PCPAGE;
} CPAGE, *LPCPAGE;
static LPCPAGE PCPage = NULL; static PCPAGE PCPage = NULL;
static HINF hIntlInf;
static BOOL bSpain = FALSE; static BOOL bSpain = FALSE;
static HWND hLangList; static HWND hLangList;
static BOOL static BOOL
GetSupportedCP(VOID) GetSupportedCP(
HINF hInf)
{ {
UINT uiCPage, Number; INFCONTEXT Context;
LONG Count; PCPAGE pCodePage;
INFCONTEXT infCont;
LPCPAGE lpCPage;
HANDLE hCPage;
CPINFOEX cpInfEx; CPINFOEX cpInfEx;
//TCHAR Section[MAX_PATH]; UINT uiCodePage;
Count = SetupGetLineCountW(hIntlInf, L"CodePages"); if (!SetupFindFirstLine(hInf,
if (Count <= 0) return FALSE; L"CodePages",
NULL,
&Context))
return FALSE;
for (Number = 0; Number < (UINT)Count; Number++) for (;;)
{ {
if (SetupGetLineByIndexW(hIntlInf, L"CodePages", Number, &infCont) && if (SetupGetIntField(&Context, 0, (PINT)&uiCodePage))
SetupGetIntField(&infCont, 0, (PINT)&uiCPage))
{ {
if (!(hCPage = GlobalAlloc(GHND, sizeof(CPAGE)))) return FALSE; pCodePage = HeapAlloc(GetProcessHeap(), 0, sizeof(CPAGE));
if (pCodePage == NULL)
return FALSE;
lpCPage = GlobalLock(hCPage); pCodePage->CodePage = uiCodePage;
lpCPage->CPage = uiCPage; pCodePage->Status = 0;
lpCPage->hCPage = hCPage; (pCodePage->Name)[0] = UNICODE_NULL;
lpCPage->Status = 0;
(lpCPage->Name)[0] = 0;
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); SetupGetStringFieldW(&Context, 1, pCodePage->Name, MAX_PATH, NULL);
GlobalFree(hCPage);
continue;
} }
lpCPage->NextItem = PCPage; if (wcslen(pCodePage->Name) != 0)
PCPage = lpCPage; {
pCodePage->NextItem = PCPage;
PCPage = pCodePage;
}
else
{
HeapFree(GetProcessHeap(), 0, pCodePage);
}
} }
if (!SetupFindNextLine(&Context, &Context))
break;
} }
return TRUE; return TRUE;
@ -63,7 +71,7 @@ GetSupportedCP(VOID)
static BOOL CALLBACK static BOOL CALLBACK
InstalledCPProc(PWSTR lpStr) InstalledCPProc(PWSTR lpStr)
{ {
LPCPAGE lpCP; PCPAGE lpCP;
UINT uiCP; UINT uiCP;
lpCP = PCPage; lpCP = PCPage;
@ -71,12 +79,15 @@ InstalledCPProc(PWSTR lpStr)
for (;;) for (;;)
{ {
if (!lpCP) break; if (!lpCP)
if (lpCP->CPage == uiCP) break;
if (lpCP->CodePage == uiCP)
{ {
lpCP->Status |= 0x0001; lpCP->Status |= 0x0001;
break; break;
} }
lpCP = lpCP->NextItem; lpCP = lpCP->NextItem;
} }
@ -86,17 +97,15 @@ InstalledCPProc(PWSTR lpStr)
static VOID static VOID
InitCodePagesList(HWND hwndDlg) InitCodePagesList(HWND hwndDlg)
{ {
LPCPAGE lpCPage; PCPAGE pCodePage;
INT ItemIndex; INT ItemIndex;
HWND hList; HWND hList;
LV_COLUMN column; LV_COLUMN column;
LV_ITEM item; LV_ITEM item;
RECT ListRect; RECT ListRect;
HINF hIntlInf;
hList = GetDlgItem(hwndDlg, IDC_CONV_TABLES);
hIntlInf = SetupOpenInfFileW(L"intl.inf", NULL, INF_STYLE_WIN4, NULL); hIntlInf = SetupOpenInfFileW(L"intl.inf", NULL, INF_STYLE_WIN4, NULL);
if (hIntlInf == INVALID_HANDLE_VALUE) if (hIntlInf == INVALID_HANDLE_VALUE)
return; return;
@ -107,40 +116,46 @@ InitCodePagesList(HWND hwndDlg)
return; return;
} }
if (!GetSupportedCP()) if (!GetSupportedCP(hIntlInf))
return; return;
SetupCloseInfFile(hIntlInf); SetupCloseInfFile(hIntlInf);
if (!EnumSystemCodePages(InstalledCPProc, CP_INSTALLED)) if (!EnumSystemCodePagesW(InstalledCPProc, CP_INSTALLED))
return; {
/* Hack: EnumSystemCodePages returns FALSE on successful completion! */
/* return; */
}
hList = GetDlgItem(hwndDlg, IDC_CONV_TABLES);
ZeroMemory(&column, sizeof(LV_COLUMN)); ZeroMemory(&column, sizeof(LV_COLUMN));
column.mask = LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; column.mask = LVCF_FMT | LVCF_WIDTH;
column.fmt = LVCFMT_LEFT; column.fmt = LVCFMT_LEFT;
GetClientRect(hList, &ListRect); GetClientRect(hList, &ListRect);
column.cx = ListRect.right - GetSystemMetrics(SM_CYHSCROLL); column.cx = ListRect.right - GetSystemMetrics(SM_CYHSCROLL);
(VOID) ListView_InsertColumn(hList, 0, &column); 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 (;;) for (;;)
{ {
if (!lpCPage) break; if (pCodePage == NULL)
break;
ZeroMemory(&item, sizeof(LV_ITEM)); 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.state = 0;
item.stateMask = LVIS_STATEIMAGEMASK; item.stateMask = LVIS_STATEIMAGEMASK;
item.pszText = lpCPage->Name; item.pszText = pCodePage->Name;
item.lParam = (LPARAM)lpCPage; item.lParam = (LPARAM)pCodePage;
ItemIndex = ListView_InsertItem(hList, &item); ItemIndex = ListView_InsertItem(hList, &item);
if (ItemIndex != -1)
if (ItemIndex >= 0)
{ {
if (lpCPage->Status & 0x0001) if (pCodePage->Status & 0x0001)
{ {
ListView_SetItemState(hList, ItemIndex, ListView_SetItemState(hList, ItemIndex,
INDEXTOSTATEIMAGEMASK(LVIS_SELECTED), INDEXTOSTATEIMAGEMASK(LVIS_SELECTED),
@ -154,7 +169,7 @@ InitCodePagesList(HWND hwndDlg)
} }
} }
lpCPage = lpCPage->NextItem; pCodePage = pCodePage->NextItem;
} }
} }
@ -278,7 +293,7 @@ SaveFontSubstitutionSettings(
return; return;
} }
Count = (UINT) SetupGetLineCount(hFontInf, szSection); Count = (UINT)SetupGetLineCount(hFontInf, szSection);
if (Count <= 0) if (Count <= 0)
return; return;