ByeongSik Jeon : imm32: Add the missing is_himc_ime_unicode() check.

Alexandre Julliard julliard at winehq.org
Mon May 12 13:41:12 CDT 2008


Module: wine
Branch: master
Commit: 6e74a865e371763b75330de61371387d5961b053
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6e74a865e371763b75330de61371387d5961b053

Author: ByeongSik Jeon <bsjeon at hanmail.net>
Date:   Fri May  9 21:27:19 2008 +0900

imm32: Add the missing is_himc_ime_unicode() check.

---

 dlls/imm32/imm.c |  139 +++++++++++++++++++++++++++---------------------------
 1 files changed, 70 insertions(+), 69 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index 8a8fabd..2a6c525 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -991,7 +991,9 @@ BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
 LONG WINAPI ImmGetCompositionStringA(
   HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
 {
-    CHAR *buf;
+    BOOL isString = FALSE;
+    LPBYTE buffer = NULL;
+    CHAR *buf = NULL;
     LONG rc = 0;
     InputContextData *data = (InputContextData*)hIMC;
     LPCOMPOSITIONSTRING compstr;
@@ -1013,68 +1015,43 @@ LONG WINAPI ImmGetCompositionStringA(
     case GCS_RESULTSTR:
         if (compstr->dwResultStrLen > 0 && compstr->dwResultStrOffset > 0)
         {
-            LPWSTR ResultStr = (LPWSTR)(compdata + compstr->dwResultStrOffset);
-
-            TRACE("GCS_RESULTSTR %p %i\n",ResultStr,
-                                        compstr->dwResultStrLen);
-
-            buf = HeapAlloc( GetProcessHeap(), 0, compstr->dwResultStrLen * 3 );
-            rc = WideCharToMultiByte(CP_ACP, 0, ResultStr,
-                                     compstr->dwResultStrLen , buf,
-                                     compstr->dwResultStrLen * 3, NULL, NULL);
-            if (dwBufLen >= rc)
-                memcpy(lpBuf,buf,rc);
-
-            HeapFree( GetProcessHeap(), 0, buf );
+            isString = TRUE;
+            buffer = compdata + compstr->dwResultStrOffset;
+            rc =  compstr->dwResultStrLen;
+            TRACE("GCS_RESULTSTR %p %i\n", buffer, rc);
         }
         break;
     case GCS_COMPSTR:
         if (compstr->dwCompStrLen > 0 && compstr->dwCompStrOffset > 0)
         {
-            LPWSTR CompString = (LPWSTR)(compdata + compstr->dwCompStrOffset);
-
-            TRACE("GCS_COMPSTR %p %i\n", CompString, compstr->dwCompStrLen);
-
-            buf = HeapAlloc( GetProcessHeap(), 0, compstr->dwCompStrLen * 3 );
-            rc = WideCharToMultiByte(CP_ACP, 0, CompString,
-                                     compstr->dwCompStrLen, buf,
-                                     compstr->dwCompStrLen * 3, NULL, NULL);
-            if (dwBufLen >= rc)
-                memcpy(lpBuf,buf,rc);
-            HeapFree( GetProcessHeap(), 0, buf );
+            isString = TRUE;
+            buffer = compdata + compstr->dwCompStrOffset;
+            rc = compstr->dwCompStrLen;
+            TRACE("GCS_COMPSTR %p %i\n", buffer, rc);
         }
         break;
     case GCS_COMPATTR:
         if (compstr->dwCompAttrLen > 0 && compstr->dwCompAttrOffset > 0)
         {
-            LPWSTR Compattr = (LPWSTR)(compdata + compstr->dwCompAttrOffset);
-            TRACE("GCS_COMPATTR %p %i\n", Compattr , compstr->dwCompAttrLen);
-
+            buffer = compdata + compstr->dwCompAttrOffset;
             rc = compstr->dwCompAttrLen;
-            if (dwBufLen >= rc)
-                memcpy(lpBuf,Compattr,rc);
+            TRACE("GCS_COMPATTR %p %i\n", buffer, rc);
         }
         break;
     case GCS_COMPCLAUSE:
         if (compstr->dwCompClauseLen > 0 && compstr->dwCompClauseOffset > 0)
         {
-            LPWSTR Compclause = (LPWSTR)(compdata + compstr->dwCompClauseOffset);
-            TRACE("GCS_COMPCLAUSE %p %i\n", Compclause, compstr->dwCompClauseLen);
-
+            buffer = compdata + compstr->dwCompClauseOffset;
             rc = compstr->dwCompClauseLen;
-            if (dwBufLen >= compstr->dwCompClauseLen)
-                memcpy(lpBuf,Compclause,rc);
+            TRACE("GCS_COMPCLAUSE %p %i\n", buffer, rc);
         }
         break;
     case GCS_RESULTCLAUSE:
         if (compstr->dwResultClauseLen > 0 && compstr->dwResultClauseOffset > 0)
         {
-            LPWSTR Resultclause = (LPWSTR)(compdata + compstr->dwResultClauseOffset);
-            TRACE("GCS_RESULTCLAUSE %p %i\n", Resultclause, compstr->dwResultClauseLen);
-
+            buffer = compdata + compstr->dwResultClauseOffset;
             rc = compstr->dwResultClauseLen;
-            if (dwBufLen >= compstr->dwResultClauseLen)
-                memcpy(lpBuf,Resultclause,rc);
+            TRACE("GCS_RESULTCLAUSE %p %i\n", buffer, rc);
         }
         break;
     case GCS_CURSORPOS:
@@ -1090,6 +1067,19 @@ LONG WINAPI ImmGetCompositionStringA(
         break;
     }
 
+    if ( isString && buffer && is_himc_ime_unicode(data))
+    {
+        INT len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)buffer, rc, NULL, 0, NULL, NULL);
+        buf = HeapAlloc( GetProcessHeap(), 0, len );
+        if ( buf )
+            rc = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)buffer, rc, buf, len, NULL, NULL);
+        buffer = (LPBYTE)buf;
+    }
+
+    if ( lpBuf && buffer && dwBufLen >= rc)
+        memcpy(lpBuf, buffer, rc);
+
+    HeapFree( GetProcessHeap(), 0, buf );
     ImmUnlockIMCC(data->IMC.hCompStr);
 
     return rc;
@@ -1102,6 +1092,9 @@ LONG WINAPI ImmGetCompositionStringW(
   HIMC hIMC, DWORD dwIndex,
   LPVOID lpBuf, DWORD dwBufLen)
 {
+    BOOL isString = FALSE;
+    LPBYTE buffer = NULL;
+    WCHAR *buf = NULL;
     LONG rc = 0;
     InputContextData *data = (InputContextData*)hIMC;
     LPCOMPOSITIONSTRING compstr;
@@ -1123,62 +1116,53 @@ LONG WINAPI ImmGetCompositionStringW(
     case GCS_RESULTSTR:
         if (compstr->dwResultStrLen > 0 && compstr->dwResultStrOffset > 0)
         {
-            LPWSTR ResultStr = (LPWSTR)(compdata + compstr->dwResultStrOffset);
-            rc =  compstr->dwResultStrLen * sizeof(WCHAR);
-
-            if (dwBufLen >= rc)
-                memcpy(lpBuf,ResultStr,rc);
+            isString = TRUE;
+            buffer = compdata + compstr->dwResultStrOffset;
+            rc =  compstr->dwResultStrLen;
+            TRACE("GCS_RESULTSTR %p %i\n", buffer, rc);
         }
         break;
     case GCS_RESULTREADSTR:
         if (compstr->dwResultReadStrLen > 0 && compstr->dwResultReadStrOffset > 0)
         {
-            LPWSTR ResultReadString = (LPWSTR)(compdata + compstr->dwResultReadStrOffset);
-
-            rc = compstr->dwResultReadStrLen * sizeof(WCHAR);
-            if (dwBufLen >= rc)
-                memcpy(lpBuf,ResultReadString,rc);
+            isString = TRUE;
+            buffer = compdata + compstr->dwResultReadStrOffset;
+            rc =  compstr->dwResultReadStrLen;
+            TRACE("GCS_RESULTREADSTR %p %i\n",buffer, rc);
         }
         break;
     case GCS_COMPSTR:
         if (compstr->dwCompStrLen > 0 && compstr->dwCompStrOffset > 0)
         {
-            LPWSTR CompString = (LPWSTR)(compdata + compstr->dwCompStrOffset);
-            rc = compstr->dwCompStrLen * sizeof(WCHAR);
-            if (dwBufLen >= rc)
-                memcpy(lpBuf,CompString,rc);
+            isString = TRUE;
+            buffer = compdata + compstr->dwCompStrOffset;
+            rc = compstr->dwCompStrLen;
+            TRACE("GCS_COMPSTR %p %i\n", buffer, rc);
         }
         break;
     case GCS_COMPATTR:
         if (compstr->dwCompAttrLen > 0 && compstr->dwCompAttrOffset > 0)
         {
-
-            LPWSTR Compattr = (LPWSTR)(compdata + compstr->dwCompAttrOffset);
-
+            buffer = compdata + compstr->dwCompAttrOffset;
             rc = compstr->dwCompAttrLen;
-            if (dwBufLen >= rc)
-                memcpy(lpBuf,Compattr,rc);
+            TRACE("GCS_COMPATTR %p %i\n", buffer, rc);
         }
         break;
     case GCS_COMPCLAUSE:
         if (compstr->dwCompClauseLen > 0 && compstr->dwCompClauseOffset > 0)
         {
-            LPWSTR Compclause = (LPWSTR)(compdata + compstr->dwCompClauseOffset);
-
+            buffer = compdata + compstr->dwCompClauseOffset;
             rc = compstr->dwCompClauseLen;
-            if (dwBufLen >= compstr->dwCompClauseLen)
-                memcpy(lpBuf,Compclause,rc);
+            TRACE("GCS_COMPCLAUSE %p %i\n", buffer, rc);
         }
         break;
     case GCS_COMPREADSTR:
         if (compstr->dwCompReadStrLen > 0 && compstr->dwCompReadStrOffset > 0)
         {
-            LPWSTR CompReadString = (LPWSTR)(compdata + compstr->dwCompReadStrOffset);
-
-            rc = compstr->dwCompReadStrLen * sizeof(WCHAR);
-
-            if (dwBufLen >= rc)
-                memcpy(lpBuf,CompReadString,rc);
+            isString = TRUE;
+            buffer = compdata + compstr->dwCompReadStrOffset;
+            rc = compstr->dwCompReadStrLen;
+            TRACE("GCS_COMPREADSTR %p %i\n", buffer, rc);
         }
         break;
     case GCS_CURSORPOS:
@@ -1194,6 +1178,23 @@ LONG WINAPI ImmGetCompositionStringW(
         break;
     }
 
+    if ( isString && buffer )
+    {
+        if ( !is_himc_ime_unicode(data) )
+        {
+            INT len = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)buffer, rc, NULL, 0 );
+            buf = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+            if ( buf )
+                rc = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)buffer, rc, buf, len );
+            buffer = (LPBYTE)buf;
+        }
+        rc *= sizeof(WCHAR);
+    }
+
+    if ( lpBuf && buffer && dwBufLen >= rc )
+        memcpy( lpBuf, buffer, rc );
+
+    HeapFree( GetProcessHeap(), 0, buf );
     ImmUnlockIMCC(data->IMC.hCompStr);
 
     return rc;




More information about the wine-cvs mailing list