Aric Stewart : imm32: Update CopyCompClauseIMEtoClient to handle A-> W and W->A conversions.

Alexandre Julliard julliard at winehq.org
Tue Sep 16 06:54:27 CDT 2008


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Sep 15 08:49:54 2008 -0500

imm32: Update CopyCompClauseIMEtoClient to handle A->W and W->A conversions.

---

 dlls/imm32/imm.c |   52 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index b826163..602aeca 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -1078,10 +1078,56 @@ static INT CopyCompAttrIMEtoClient(InputContextData *data, LPBYTE source, INT sl
 static INT CopyCompClauseIMEtoClient(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;
+
+    if (is_himc_ime_unicode(data) && !unicode)
+    {
+        if (tlen)
+        {
+            int i;
+
+            if (slen < tlen)
+                tlen = slen;
+            tlen /= sizeof (DWORD);
+            for (i = 0; i < tlen; ++i)
+            {
+                ((DWORD *)target)[i] = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)ssource,
+                                                          ((DWORD *)source)[i],
+                                                          NULL, 0,
+                                                          NULL, NULL);
+            }
+            rc = sizeof (DWORD) * i;
+        }
+        else
+            rc = slen;
+    }
+    else if (!is_himc_ime_unicode(data) && unicode)
+    {
+        if (tlen)
+        {
+            int i;
+
+            if (slen < tlen)
+                tlen = slen;
+            tlen /= sizeof (DWORD);
+            for (i = 0; i < tlen; ++i)
+            {
+                ((DWORD *)target)[i] = MultiByteToWideChar(CP_ACP, 0, (LPSTR)ssource,
+                                                          ((DWORD *)source)[i],
+                                                          NULL, 0);
+            }
+            rc = sizeof (DWORD) * i;
+        }
+        else
+            rc = slen;
+    }
+    else
+    {
+        memcpy( target, source, min(slen,tlen));
+        rc = slen;
+    }
 
-    return slen;
+    return rc;
 }
 
 static INT CopyCompOffsetIMEtoClient(InputContextData *data, DWORD offset, LPBYTE ssource, BOOL unicode)




More information about the wine-cvs mailing list