Module: wine Branch: master Commit: b2d9edd8a0d4725ce6ab5050ded5ee6fb8220514 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b2d9edd8a0d4725ce6ab5050de...
Author: Aric Stewart aric@codeweavers.com Date: Mon Sep 15 08:49:39 2008 -0500
imm32: Correct CopyCompAttrIMEtoClient to handle A->W and W->A conversions.
---
dlls/imm32/imm.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index 76677b4..b826163 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -1010,10 +1010,69 @@ static INT CopyCompStringIMEtoClient(InputContextData *data, LPBYTE source, INT static INT CopyCompAttrIMEtoClient(InputContextData *data, LPBYTE source, INT slen, LPBYTE ssource, INT sslen, LPBYTE target, INT tlen, BOOL unicode ) { - if ( target && source && tlen >= slen) - memcpy( target , source , slen); + INT rc;
- return slen; + if (is_himc_ime_unicode(data) && !unicode) + { + rc = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)ssource, sslen, NULL, 0, NULL, NULL); + if (tlen) + { + const BYTE *src = source; + LPBYTE dst = target; + int i, j = 0, k = 0; + + if (rc < tlen) + tlen = rc; + for (i = 0; i < sslen; ++i) + { + int len; + + len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)ssource + i, 1, + NULL, 0, NULL, NULL); + for (; len > 0; --len) + { + dst[j++] = src[k]; + + if (j >= tlen) + goto end; + } + ++k; + } + end: + rc = j; + } + } + else if (!is_himc_ime_unicode(data) && unicode) + { + rc = MultiByteToWideChar(CP_ACP, 0, (LPSTR)ssource, sslen, NULL, 0); + if (tlen) + { + const BYTE *src = source; + LPBYTE dst = target; + int i, j = 0; + + if (rc < tlen) + tlen = rc; + for (i = 0; i < sslen; ++i) + { + if (IsDBCSLeadByte(((LPSTR)ssource)[i])) + continue; + + dst[j++] = src[i]; + + if (j >= tlen) + break; + } + rc = j; + } + } + else + { + memcpy( target, source, min(slen,tlen)); + rc = slen; + } + + return rc; }
static INT CopyCompClauseIMEtoClient(InputContextData *data, LPBYTE source, INT slen, LPBYTE ssource, INT sslen,