Skip to content

Commit 6585803

Browse files
committed
[IMM32] Add uCodePage parameter to Imm32WideFromAnsi/Imm32AnsiFromWide
This needs for multiple codepage support. CORE-11700
1 parent e1d3a7d commit 6585803

File tree

7 files changed

+70
-52
lines changed

7 files changed

+70
-52
lines changed

dll/win32/imm32/candidate.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,17 +153,18 @@ static DWORD APIENTRY
153153
ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen,
154154
BOOL bAnsi)
155155
{
156-
DWORD ret = 0;
156+
DWORD dwSize, ret = 0;
157+
UINT uCodePage;
157158
LPINPUTCONTEXT pIC;
158159
PCLIENTIMC pClientImc;
159160
LPCANDIDATEINFO pCI;
160161
LPCANDIDATELIST pCL;
161-
DWORD dwSize;
162162

163163
pClientImc = ImmLockClientImc(hIMC);
164164
if (!pClientImc)
165165
return 0;
166166

167+
uCodePage = pClientImc->uCodePage;
167168
pIC = ImmLockIMC(hIMC);
168169
if (pIC == NULL)
169170
{
@@ -187,7 +188,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
187188
if (bAnsi)
188189
{
189190
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
190-
dwSize = CandidateListAnsiToWide(pCL, NULL, 0, CP_ACP);
191+
dwSize = CandidateListAnsiToWide(pCL, NULL, 0, uCodePage);
191192
else
192193
dwSize = pCL->dwSize;
193194
}
@@ -196,7 +197,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
196197
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
197198
dwSize = pCL->dwSize;
198199
else
199-
dwSize = CandidateListWideToAnsi(pCL, NULL, 0, CP_ACP);
200+
dwSize = CandidateListWideToAnsi(pCL, NULL, 0, uCodePage);
200201
}
201202

202203
if (dwBufLen != 0 && dwSize != 0)
@@ -208,7 +209,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
208209
if (bAnsi)
209210
{
210211
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
211-
CandidateListAnsiToWide(pCL, lpCandList, dwSize, CP_ACP);
212+
CandidateListAnsiToWide(pCL, lpCandList, dwSize, uCodePage);
212213
else
213214
RtlCopyMemory(lpCandList, pCL, dwSize);
214215
}
@@ -217,7 +218,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
217218
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
218219
RtlCopyMemory(lpCandList, pCL, dwSize);
219220
else
220-
CandidateListWideToAnsi(pCL, lpCandList, dwSize, CP_ACP);
221+
CandidateListWideToAnsi(pCL, lpCandList, dwSize, uCodePage);
221222
}
222223
}
223224

@@ -227,6 +228,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
227228
ImmUnlockIMCC(pIC->hCandInfo);
228229
ImmUnlockIMC(hIMC);
229230
ImmUnlockClientImc(pClientImc);
231+
TRACE("ret: 0x%X\n", ret);
230232
return ret;
231233
}
232234

@@ -237,6 +239,7 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
237239
DWORD ret = 0, cbGot, dwIndex;
238240
PCLIENTIMC pClientImc;
239241
LPINPUTCONTEXT pIC;
242+
UINT uCodePage;
240243
const CANDIDATEINFO *pCI;
241244
const BYTE *pb;
242245
const CANDIDATELIST *pCL;
@@ -258,6 +261,8 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
258261
return 0;
259262
}
260263

264+
uCodePage = pClientImc->uCodePage;
265+
261266
pCI = ImmLockIMCC(pIC->hCandInfo);
262267
if (pCI == NULL)
263268
{
@@ -282,7 +287,7 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
282287
{
283288
pb = (const BYTE *)pCI + pdwOffsets[dwIndex];
284289
pCL = (const CANDIDATELIST *)pb;
285-
cbGot = CandidateListWideToAnsi(pCL, NULL, 0, CP_ACP);
290+
cbGot = CandidateListWideToAnsi(pCL, NULL, 0, uCodePage);
286291
ret += cbGot;
287292
}
288293
}
@@ -305,7 +310,7 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
305310
{
306311
pb = (const BYTE *)pCI + pdwOffsets[dwIndex];
307312
pCL = (const CANDIDATELIST *)pb;
308-
cbGot = CandidateListAnsiToWide(pCL, NULL, 0, CP_ACP);
313+
cbGot = CandidateListAnsiToWide(pCL, NULL, 0, uCodePage);
309314
ret += cbGot;
310315
}
311316
}
@@ -315,6 +320,7 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
315320
ImmUnlockIMCC(pIC->hCandInfo);
316321
ImmUnlockIMC(hIMC);
317322
ImmUnlockClientImc(pClientImc);
323+
TRACE("ret: 0x%X\n", ret);
318324
return ret;
319325
}
320326

@@ -379,6 +385,7 @@ ImmGetCandidateWindow(HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
379385
}
380386

381387
ImmUnlockIMC(hIMC);
388+
TRACE("ret: %d\n", ret);
382389
return ret;
383390
}
384391

dll/win32/imm32/compstr.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,7 @@ ImmSetCompositionStringAW(HIMC hIMC, DWORD dwIndex, LPVOID pComp, DWORD dwCompLe
841841
ImmLocalFree(pCompNew);
842842
ImmLocalFree(pReadNew);
843843
ImmUnlockImeDpi(pImeDpi);
844+
TRACE("ret: %d\n", ret);
844845
return ret;
845846
}
846847

@@ -883,6 +884,7 @@ LONG WINAPI ImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWO
883884
ret = Imm32GetCompStrA(hIMC, pCS, dwIndex, lpBuf, dwBufLen, bAnsiClient, uCodePage);
884885
ImmUnlockIMCC(pIC->hCompStr);
885886
ImmUnlockIMC(hIMC);
887+
TRACE("ret: %ld\n", ret);
886888
return ret;
887889
}
888890

@@ -925,6 +927,7 @@ LONG WINAPI ImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWO
925927
ret = Imm32GetCompStrW(hIMC, pCS, dwIndex, lpBuf, dwBufLen, bAnsiClient, uCodePage);
926928
ImmUnlockIMCC(pIC->hCompStr);
927929
ImmUnlockIMC(hIMC);
930+
TRACE("ret: %ld\n", ret);
928931
return ret;
929932
}
930933

dll/win32/imm32/guideline.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
1919
DWORD cb, ret = 0;
2020
LPVOID pvStr, pvPrivate;
2121
BOOL bUsedDefault;
22+
UINT uCodePage;
2223

2324
pClientImc = ImmLockClientImc(hIMC);
2425
if (!pClientImc)
2526
return 0;
2627

28+
uCodePage = pClientImc->uCodePage;
29+
2730
pIC = ImmLockIMC(hIMC);
2831
if (!pIC)
2932
{
@@ -60,7 +63,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
6063
{
6164
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
6265
{
63-
cb = WideCharToMultiByte(CP_ACP, 0, pvStr, pGuideLine->dwStrLen,
66+
cb = WideCharToMultiByte(uCodePage, 0, pvStr, pGuideLine->dwStrLen,
6467
NULL, 0, NULL, &bUsedDefault);
6568
}
6669
else
@@ -76,7 +79,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
7679
}
7780
else
7881
{
79-
cb = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
82+
cb = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
8083
NULL, 0) * sizeof(WCHAR);
8184
}
8285
}
@@ -92,7 +95,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
9295
{
9396
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
9497
{
95-
ret = WideCharToMultiByte(CP_ACP, 0, pvStr, pGuideLine->dwStrLen,
98+
ret = WideCharToMultiByte(uCodePage, 0, pvStr, pGuideLine->dwStrLen,
9699
lpBuf, dwBufLen, NULL, &bUsedDefault);
97100
goto Quit;
98101
}
@@ -101,7 +104,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
101104
{
102105
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE))
103106
{
104-
ret = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
107+
ret = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
105108
lpBuf, dwBufLen) * sizeof(WCHAR);
106109
goto Quit;
107110
}
@@ -122,7 +125,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
122125
if ((pClientImc->dwFlags & CLIENTIMC_WIDE) &&
123126
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
124127
{
125-
cb = CandidateListWideToAnsi(pvPrivate, NULL, 0, CP_ACP);
128+
cb = CandidateListWideToAnsi(pvPrivate, NULL, 0, uCodePage);
126129
}
127130
else
128131
{
@@ -134,7 +137,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
134137
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE) &&
135138
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
136139
{
137-
cb = CandidateListAnsiToWide(pvPrivate, NULL, 0, CP_ACP);
140+
cb = CandidateListAnsiToWide(pvPrivate, NULL, 0, uCodePage);
138141
}
139142
else
140143
{
@@ -154,7 +157,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
154157
if ((pClientImc->dwFlags & CLIENTIMC_WIDE) &&
155158
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
156159
{
157-
ret = CandidateListWideToAnsi(pvPrivate, lpBuf, cb, CP_ACP);
160+
ret = CandidateListWideToAnsi(pvPrivate, lpBuf, cb, uCodePage);
158161
goto Quit;
159162
}
160163
}
@@ -163,7 +166,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
163166
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE) &&
164167
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
165168
{
166-
ret = CandidateListAnsiToWide(pvPrivate, lpBuf, cb, CP_ACP);
169+
ret = CandidateListAnsiToWide(pvPrivate, lpBuf, cb, uCodePage);
167170
goto Quit;
168171
}
169172
}
@@ -177,6 +180,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
177180
ImmUnlockIMCC(pIC->hGuideLine);
178181
ImmUnlockIMC(hIMC);
179182
ImmUnlockClientImc(pClientImc);
183+
TRACE("ret: 0x%X\n", ret);
180184
return ret;
181185
}
182186

dll/win32/imm32/ime.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -655,13 +655,13 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
655655
if (bTargetIsAnsi)
656656
{
657657
if (pNewParent)
658-
Imm32ImeMenuWideToAnsi(pNewParent, lpImeParentMenu, CP_ACP);
658+
Imm32ImeMenuWideToAnsi(pNewParent, lpImeParentMenu, pImeDpi->uCodePage);
659659

660660
pItemW = pNewItems;
661661
pItemA = lpImeMenu;
662662
for (iItem = 0; iItem < ret; ++iItem, ++pItemW, ++pItemA)
663663
{
664-
if (!Imm32ImeMenuWideToAnsi(pItemW, pItemA, CP_ACP))
664+
if (!Imm32ImeMenuWideToAnsi(pItemW, pItemA, pImeDpi->uCodePage))
665665
{
666666
ret = 0;
667667
break;
@@ -704,11 +704,11 @@ HKL WINAPI ImmInstallIMEA(LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText)
704704

705705
TRACE("(%s, %s)\n", debugstr_a(lpszIMEFileName), debugstr_a(lpszLayoutText));
706706

707-
pszFileNameW = Imm32WideFromAnsi(lpszIMEFileName);
707+
pszFileNameW = Imm32WideFromAnsi(CP_ACP, lpszIMEFileName);
708708
if (!pszFileNameW)
709709
goto Quit;
710710

711-
pszLayoutTextW = Imm32WideFromAnsi(lpszLayoutText);
711+
pszLayoutTextW = Imm32WideFromAnsi(CP_ACP, lpszLayoutText);
712712
if (!pszLayoutTextW)
713713
goto Quit;
714714

@@ -1712,7 +1712,7 @@ ImmGetConversionListA(HKL hKL, HIMC hIMC, LPCSTR pSrc, LPCANDIDATELIST lpDst,
17121712

17131713
if (pSrc)
17141714
{
1715-
pszSrcW = Imm32WideFromAnsi(pSrc);
1715+
pszSrcW = Imm32WideFromAnsi(pImeDpi->uCodePage, pSrc);
17161716
if (pszSrcW == NULL)
17171717
goto Quit;
17181718
}
@@ -1729,7 +1729,7 @@ ImmGetConversionListA(HKL hKL, HIMC hIMC, LPCSTR pSrc, LPCANDIDATELIST lpDst,
17291729
if (cb == 0)
17301730
goto Quit;
17311731

1732-
ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, CP_ACP);
1732+
ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
17331733

17341734
Quit:
17351735
ImmLocalFree(pszSrcW);
@@ -1767,7 +1767,7 @@ ImmGetConversionListW(HKL hKL, HIMC hIMC, LPCWSTR pSrc, LPCANDIDATELIST lpDst,
17671767

17681768
if (pSrc)
17691769
{
1770-
pszSrcA = Imm32AnsiFromWide(pSrc);
1770+
pszSrcA = Imm32AnsiFromWide(pImeDpi->uCodePage, pSrc);
17711771
if (pszSrcA == NULL)
17721772
goto Quit;
17731773
}
@@ -1784,7 +1784,7 @@ ImmGetConversionListW(HKL hKL, HIMC hIMC, LPCWSTR pSrc, LPCANDIDATELIST lpDst,
17841784
if (!cb)
17851785
goto Quit;
17861786

1787-
ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, CP_ACP);
1787+
ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
17881788

17891789
Quit:
17901790
ImmLocalFree(pszSrcA);
@@ -1902,14 +1902,14 @@ BOOL WINAPI ImmConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
19021902

19031903
if (pRegWordA->lpReading)
19041904
{
1905-
RegWordW.lpReading = Imm32WideFromAnsi(pRegWordA->lpReading);
1905+
RegWordW.lpReading = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpReading);
19061906
if (!RegWordW.lpReading)
19071907
goto Quit;
19081908
}
19091909

19101910
if (pRegWordA->lpWord)
19111911
{
1912-
RegWordW.lpWord = Imm32WideFromAnsi(pRegWordA->lpWord);
1912+
RegWordW.lpWord = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpWord);
19131913
if (!RegWordW.lpWord)
19141914
goto Quit;
19151915
}
@@ -1956,14 +1956,14 @@ BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
19561956

19571957
if (pRegWordW->lpReading)
19581958
{
1959-
RegWordA.lpReading = Imm32AnsiFromWide(pRegWordW->lpReading);
1959+
RegWordA.lpReading = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpReading);
19601960
if (!RegWordA.lpReading)
19611961
goto Quit;
19621962
}
19631963

19641964
if (pRegWordW->lpWord)
19651965
{
1966-
RegWordA.lpWord = Imm32AnsiFromWide(pRegWordW->lpWord);
1966+
RegWordA.lpWord = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpWord);
19671967
if (!RegWordA.lpWord)
19681968
goto Quit;
19691969
}

dll/win32/imm32/precomp.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ BOOL APIENTRY Imm32CheckImcProcess(PIMC pIMC);
8888
LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes);
8989
#define ImmLocalFree(lpData) HeapFree(ghImmHeap, 0, (lpData))
9090

91-
LPWSTR APIENTRY Imm32WideFromAnsi(LPCSTR pszA);
92-
LPSTR APIENTRY Imm32AnsiFromWide(LPCWSTR pszW);
91+
LPWSTR APIENTRY Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA);
92+
LPSTR APIENTRY Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW);
9393
LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage);
9494
LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage);
9595
PIMEDPI APIENTRY Imm32FindOrLoadImeDpi(HKL hKL);

0 commit comments

Comments
 (0)