This needs for multiple codepage support.
CORE-11700
ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen,
BOOL bAnsi)
{
- DWORD ret = 0;
+ DWORD dwSize, ret = 0;
+ UINT uCodePage;
LPINPUTCONTEXT pIC;
PCLIENTIMC pClientImc;
LPCANDIDATEINFO pCI;
LPCANDIDATELIST pCL;
- DWORD dwSize;
pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc)
return 0;
+ uCodePage = pClientImc->uCodePage;
pIC = ImmLockIMC(hIMC);
if (pIC == NULL)
{
if (bAnsi)
{
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
- dwSize = CandidateListAnsiToWide(pCL, NULL, 0, CP_ACP);
+ dwSize = CandidateListAnsiToWide(pCL, NULL, 0, uCodePage);
else
dwSize = pCL->dwSize;
}
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
dwSize = pCL->dwSize;
else
- dwSize = CandidateListWideToAnsi(pCL, NULL, 0, CP_ACP);
+ dwSize = CandidateListWideToAnsi(pCL, NULL, 0, uCodePage);
}
if (dwBufLen != 0 && dwSize != 0)
if (bAnsi)
{
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
- CandidateListAnsiToWide(pCL, lpCandList, dwSize, CP_ACP);
+ CandidateListAnsiToWide(pCL, lpCandList, dwSize, uCodePage);
else
RtlCopyMemory(lpCandList, pCL, dwSize);
}
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
RtlCopyMemory(lpCandList, pCL, dwSize);
else
- CandidateListWideToAnsi(pCL, lpCandList, dwSize, CP_ACP);
+ CandidateListWideToAnsi(pCL, lpCandList, dwSize, uCodePage);
}
}
ImmUnlockIMCC(pIC->hCandInfo);
ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc);
+ TRACE("ret: 0x%X\n", ret);
return ret;
}
DWORD ret = 0, cbGot, dwIndex;
PCLIENTIMC pClientImc;
LPINPUTCONTEXT pIC;
+ UINT uCodePage;
const CANDIDATEINFO *pCI;
const BYTE *pb;
const CANDIDATELIST *pCL;
return 0;
}
+ uCodePage = pClientImc->uCodePage;
+
pCI = ImmLockIMCC(pIC->hCandInfo);
if (pCI == NULL)
{
{
pb = (const BYTE *)pCI + pdwOffsets[dwIndex];
pCL = (const CANDIDATELIST *)pb;
- cbGot = CandidateListWideToAnsi(pCL, NULL, 0, CP_ACP);
+ cbGot = CandidateListWideToAnsi(pCL, NULL, 0, uCodePage);
ret += cbGot;
}
}
{
pb = (const BYTE *)pCI + pdwOffsets[dwIndex];
pCL = (const CANDIDATELIST *)pb;
- cbGot = CandidateListAnsiToWide(pCL, NULL, 0, CP_ACP);
+ cbGot = CandidateListAnsiToWide(pCL, NULL, 0, uCodePage);
ret += cbGot;
}
}
ImmUnlockIMCC(pIC->hCandInfo);
ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc);
+ TRACE("ret: 0x%X\n", ret);
return ret;
}
}
ImmUnlockIMC(hIMC);
+ TRACE("ret: %d\n", ret);
return ret;
}
ImmLocalFree(pCompNew);
ImmLocalFree(pReadNew);
ImmUnlockImeDpi(pImeDpi);
+ TRACE("ret: %d\n", ret);
return ret;
}
ret = Imm32GetCompStrA(hIMC, pCS, dwIndex, lpBuf, dwBufLen, bAnsiClient, uCodePage);
ImmUnlockIMCC(pIC->hCompStr);
ImmUnlockIMC(hIMC);
+ TRACE("ret: %ld\n", ret);
return ret;
}
ret = Imm32GetCompStrW(hIMC, pCS, dwIndex, lpBuf, dwBufLen, bAnsiClient, uCodePage);
ImmUnlockIMCC(pIC->hCompStr);
ImmUnlockIMC(hIMC);
+ TRACE("ret: %ld\n", ret);
return ret;
}
DWORD cb, ret = 0;
LPVOID pvStr, pvPrivate;
BOOL bUsedDefault;
+ UINT uCodePage;
pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc)
return 0;
+ uCodePage = pClientImc->uCodePage;
+
pIC = ImmLockIMC(hIMC);
if (!pIC)
{
{
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
{
- cb = WideCharToMultiByte(CP_ACP, 0, pvStr, pGuideLine->dwStrLen,
+ cb = WideCharToMultiByte(uCodePage, 0, pvStr, pGuideLine->dwStrLen,
NULL, 0, NULL, &bUsedDefault);
}
else
}
else
{
- cb = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
+ cb = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
NULL, 0) * sizeof(WCHAR);
}
}
{
if (pClientImc->dwFlags & CLIENTIMC_WIDE)
{
- ret = WideCharToMultiByte(CP_ACP, 0, pvStr, pGuideLine->dwStrLen,
+ ret = WideCharToMultiByte(uCodePage, 0, pvStr, pGuideLine->dwStrLen,
lpBuf, dwBufLen, NULL, &bUsedDefault);
goto Quit;
}
{
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE))
{
- ret = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
+ ret = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
lpBuf, dwBufLen) * sizeof(WCHAR);
goto Quit;
}
if ((pClientImc->dwFlags & CLIENTIMC_WIDE) &&
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
{
- cb = CandidateListWideToAnsi(pvPrivate, NULL, 0, CP_ACP);
+ cb = CandidateListWideToAnsi(pvPrivate, NULL, 0, uCodePage);
}
else
{
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE) &&
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
{
- cb = CandidateListAnsiToWide(pvPrivate, NULL, 0, CP_ACP);
+ cb = CandidateListAnsiToWide(pvPrivate, NULL, 0, uCodePage);
}
else
{
if ((pClientImc->dwFlags & CLIENTIMC_WIDE) &&
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
{
- ret = CandidateListWideToAnsi(pvPrivate, lpBuf, cb, CP_ACP);
+ ret = CandidateListWideToAnsi(pvPrivate, lpBuf, cb, uCodePage);
goto Quit;
}
}
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE) &&
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
{
- ret = CandidateListAnsiToWide(pvPrivate, lpBuf, cb, CP_ACP);
+ ret = CandidateListAnsiToWide(pvPrivate, lpBuf, cb, uCodePage);
goto Quit;
}
}
ImmUnlockIMCC(pIC->hGuideLine);
ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc);
+ TRACE("ret: 0x%X\n", ret);
return ret;
}
if (bTargetIsAnsi)
{
if (pNewParent)
- Imm32ImeMenuWideToAnsi(pNewParent, lpImeParentMenu, CP_ACP);
+ Imm32ImeMenuWideToAnsi(pNewParent, lpImeParentMenu, pImeDpi->uCodePage);
pItemW = pNewItems;
pItemA = lpImeMenu;
for (iItem = 0; iItem < ret; ++iItem, ++pItemW, ++pItemA)
{
- if (!Imm32ImeMenuWideToAnsi(pItemW, pItemA, CP_ACP))
+ if (!Imm32ImeMenuWideToAnsi(pItemW, pItemA, pImeDpi->uCodePage))
{
ret = 0;
break;
TRACE("(%s, %s)\n", debugstr_a(lpszIMEFileName), debugstr_a(lpszLayoutText));
- pszFileNameW = Imm32WideFromAnsi(lpszIMEFileName);
+ pszFileNameW = Imm32WideFromAnsi(CP_ACP, lpszIMEFileName);
if (!pszFileNameW)
goto Quit;
- pszLayoutTextW = Imm32WideFromAnsi(lpszLayoutText);
+ pszLayoutTextW = Imm32WideFromAnsi(CP_ACP, lpszLayoutText);
if (!pszLayoutTextW)
goto Quit;
if (pSrc)
{
- pszSrcW = Imm32WideFromAnsi(pSrc);
+ pszSrcW = Imm32WideFromAnsi(pImeDpi->uCodePage, pSrc);
if (pszSrcW == NULL)
goto Quit;
}
if (cb == 0)
goto Quit;
- ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, CP_ACP);
+ ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
Quit:
ImmLocalFree(pszSrcW);
if (pSrc)
{
- pszSrcA = Imm32AnsiFromWide(pSrc);
+ pszSrcA = Imm32AnsiFromWide(pImeDpi->uCodePage, pSrc);
if (pszSrcA == NULL)
goto Quit;
}
if (!cb)
goto Quit;
- ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, CP_ACP);
+ ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
Quit:
ImmLocalFree(pszSrcA);
if (pRegWordA->lpReading)
{
- RegWordW.lpReading = Imm32WideFromAnsi(pRegWordA->lpReading);
+ RegWordW.lpReading = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpReading);
if (!RegWordW.lpReading)
goto Quit;
}
if (pRegWordA->lpWord)
{
- RegWordW.lpWord = Imm32WideFromAnsi(pRegWordA->lpWord);
+ RegWordW.lpWord = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpWord);
if (!RegWordW.lpWord)
goto Quit;
}
if (pRegWordW->lpReading)
{
- RegWordA.lpReading = Imm32AnsiFromWide(pRegWordW->lpReading);
+ RegWordA.lpReading = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpReading);
if (!RegWordA.lpReading)
goto Quit;
}
if (pRegWordW->lpWord)
{
- RegWordA.lpWord = Imm32AnsiFromWide(pRegWordW->lpWord);
+ RegWordA.lpWord = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpWord);
if (!RegWordA.lpWord)
goto Quit;
}
LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes);
#define ImmLocalFree(lpData) HeapFree(ghImmHeap, 0, (lpData))
-LPWSTR APIENTRY Imm32WideFromAnsi(LPCSTR pszA);
-LPSTR APIENTRY Imm32AnsiFromWide(LPCWSTR pszW);
+LPWSTR APIENTRY Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA);
+LPSTR APIENTRY Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW);
LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage);
LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage);
PIMEDPI APIENTRY Imm32FindOrLoadImeDpi(HKL hKL);
REGISTERWORDENUMPROCW lpfnEnumProc;
LPVOID lpData;
UINT ret;
+ UINT uCodePage;
} ENUM_WORD_A2W, *LPENUM_WORD_A2W;
typedef struct ENUM_WORD_W2A
REGISTERWORDENUMPROCA lpfnEnumProc;
LPVOID lpData;
UINT ret;
+ UINT uCodePage;
} ENUM_WORD_W2A, *LPENUM_WORD_W2A;
/*
if (pszReadingA)
{
- pszReadingW = Imm32WideFromAnsi(pszReadingA);
+ pszReadingW = Imm32WideFromAnsi(lpEnumData->uCodePage, pszReadingA);
if (pszReadingW == NULL)
goto Quit;
}
if (pszRegisterA)
{
- pszRegisterW = Imm32WideFromAnsi(pszRegisterA);
+ pszRegisterW = Imm32WideFromAnsi(lpEnumData->uCodePage, pszRegisterA);
if (pszRegisterW == NULL)
goto Quit;
}
if (pszReadingW)
{
- pszReadingA = Imm32AnsiFromWide(pszReadingW);
+ pszReadingA = Imm32AnsiFromWide(lpEnumData->uCodePage, pszReadingW);
if (pszReadingW == NULL)
goto Quit;
}
if (pszRegisterW)
{
- pszRegisterA = Imm32AnsiFromWide(pszRegisterW);
+ pszRegisterA = Imm32AnsiFromWide(lpEnumData->uCodePage, pszRegisterW);
if (pszRegisterA == NULL)
goto Quit;
}
if (lpszReading)
{
- pszReadingW = Imm32WideFromAnsi(lpszReading);
+ pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL)
goto Quit;
}
if (lpszRegister)
{
- pszRegisterW = Imm32WideFromAnsi(lpszRegister);
+ pszRegisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterW == NULL)
goto Quit;
}
EnumDataW2A.lpfnEnumProc = lpfnEnumProc;
EnumDataW2A.lpData = lpData;
EnumDataW2A.ret = 0;
+ EnumDataW2A.uCodePage = pImeDpi->uCodePage;
pImeDpi->ImeEnumRegisterWord(Imm32EnumWordProcW2A, pszReadingW, dwStyle,
pszRegisterW, &EnumDataW2A);
ret = EnumDataW2A.ret;
if (lpszReading)
{
- pszReadingA = Imm32AnsiFromWide(lpszReading);
+ pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (pszReadingA == NULL)
goto Quit;
}
if (lpszRegister)
{
- pszRegisterA = Imm32AnsiFromWide(lpszRegister);
+ pszRegisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterA == NULL)
goto Quit;
}
EnumDataA2W.lpfnEnumProc = lpfnEnumProc;
EnumDataA2W.lpData = lpData;
EnumDataA2W.ret = 0;
+ EnumDataA2W.uCodePage = pImeDpi->uCodePage;
pImeDpi->ImeEnumRegisterWord(Imm32EnumWordProcA2W, pszReadingA, dwStyle,
pszRegisterA, &EnumDataA2W);
ret = EnumDataA2W.ret;
pDestA = &lpStyleBuf[iItem];
pDestA->dwStyle = pSrcW->dwStyle;
StringCchLengthW(pSrcW->szDescription, _countof(pSrcW->szDescription), &cchW);
- cchA = WideCharToMultiByte(CP_ACP, MB_PRECOMPOSED,
+ cchA = WideCharToMultiByte(pImeDpi->uCodePage, MB_PRECOMPOSED,
pSrcW->szDescription, (INT)cchW,
pDestA->szDescription, _countof(pDestA->szDescription),
NULL, NULL);
pDestW = &lpStyleBuf[iItem];
pDestW->dwStyle = pSrcA->dwStyle;
StringCchLengthA(pSrcA->szDescription, _countof(pSrcA->szDescription), &cchA);
- cchW = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
+ cchW = MultiByteToWideChar(pImeDpi->uCodePage, MB_PRECOMPOSED,
pSrcA->szDescription, (INT)cchA,
pDestW->szDescription, _countof(pDestW->szDescription));
if (cchW > _countof(pDestW->szDescription) - 1)
if (lpszReading)
{
- pszReadingW = Imm32WideFromAnsi(lpszReading);
+ pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL)
goto Quit;
}
if (lpszRegister)
{
- pszRegisterW = Imm32WideFromAnsi(lpszRegister);
+ pszRegisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterW == NULL)
goto Quit;
}
if (lpszReading)
{
- pszReadingA = Imm32AnsiFromWide(lpszReading);
+ pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (!pszReadingA)
goto Quit;
}
if (lpszRegister)
{
- pszRegisterA = Imm32AnsiFromWide(lpszRegister);
+ pszRegisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszRegister);
if (!pszRegisterA)
goto Quit;
}
if (lpszReading)
{
- pszReadingW = Imm32WideFromAnsi(lpszReading);
+ pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL)
goto Quit;
}
if (lpszUnregister)
{
- pszUnregisterW = Imm32WideFromAnsi(lpszUnregister);
+ pszUnregisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszUnregister);
if (pszUnregisterW == NULL)
goto Quit;
}
if (lpszReading)
{
- pszReadingA = Imm32AnsiFromWide(lpszReading);
+ pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (!pszReadingA)
goto Quit;
}
if (lpszUnregister)
{
- pszUnregisterA = Imm32AnsiFromWide(lpszUnregister);
+ pszUnregisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszUnregister);
if (!pszUnregisterA)
goto Quit;
}
return ret;
}
-LPWSTR APIENTRY Imm32WideFromAnsi(LPCSTR pszA)
+LPWSTR APIENTRY Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
{
INT cch = lstrlenA(pszA);
LPWSTR pszW = ImmLocalAlloc(0, (cch + 1) * sizeof(WCHAR));
if (pszW == NULL)
return NULL;
- cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1);
+ cch = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1);
pszW[cch] = 0;
return pszW;
}
-LPSTR APIENTRY Imm32AnsiFromWide(LPCWSTR pszW)
+LPSTR APIENTRY Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW)
{
INT cchW = lstrlenW(pszW);
INT cchA = (cchW + 1) * sizeof(WCHAR);
LPSTR pszA = ImmLocalAlloc(0, cchA);
if (!pszA)
return NULL;
- cchA = WideCharToMultiByte(CP_ACP, 0, pszW, cchW, pszA, cchA, NULL, NULL);
+ cchA = WideCharToMultiByte(uCodePage, 0, pszW, cchW, pszA, cchA, NULL, NULL);
pszA[cchA] = 0;
return pszA;
}