Huw Davies : inetcomm: Implement IMimeInternational_ConvertString.

Alexandre Julliard julliard at winehq.org
Wed Sep 17 07:15:14 CDT 2008


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Sep 16 11:48:16 2008 +0100

inetcomm: Implement IMimeInternational_ConvertString.

---

 dlls/inetcomm/mimeintl.c |   68 +++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 64 insertions(+), 4 deletions(-)

diff --git a/dlls/inetcomm/mimeintl.c b/dlls/inetcomm/mimeintl.c
index 48deebf..5c4c867 100644
--- a/dlls/inetcomm/mimeintl.c
+++ b/dlls/inetcomm/mimeintl.c
@@ -34,6 +34,7 @@
 #include "mlang.h"
 
 #include "wine/list.h"
+#include "wine/unicode.h"
 #include "wine/debug.h"
 
 #include "inetcomm_private.h"
@@ -395,12 +396,71 @@ static HRESULT WINAPI MimeInternat_ConvertBuffer(IMimeInternational *iface, CODE
 }
 
 static HRESULT WINAPI MimeInternat_ConvertString(IMimeInternational *iface, CODEPAGEID cpiSource,
-                                                 CODEPAGEID cpiDest,
-                                                 LPPROPVARIANT pIn,
+                                                 CODEPAGEID cpiDest, LPPROPVARIANT pIn,
                                                  LPPROPVARIANT pOut)
 {
-    FIXME("stub\n");
-    return E_NOTIMPL;
+    HRESULT hr;
+    int src_len;
+    IMultiLanguage *ml;
+
+    TRACE("(%p)->(%d, %d, %p %p)\n", iface, cpiSource, cpiDest, pIn, pOut);
+
+    switch(pIn->vt)
+    {
+    case VT_LPSTR:
+        if(cpiSource == CP_UNICODE) cpiSource = GetACP();
+        src_len = strlen(pIn->u.pszVal);
+        break;
+    case VT_LPWSTR:
+        cpiSource = CP_UNICODE;
+        src_len = strlenW(pIn->u.pwszVal) * sizeof(WCHAR);
+        break;
+    default:
+        return E_INVALIDARG;
+    }
+
+    hr = get_mlang(&ml);
+    if(SUCCEEDED(hr))
+    {
+        DWORD mode = 0;
+        UINT in_size = src_len, out_size;
+
+        hr = IMultiLanguage_ConvertString(ml, &mode, cpiSource, cpiDest, (BYTE*)pIn->u.pszVal, &in_size,
+                                          NULL, &out_size);
+        if(hr == S_OK) /* S_FALSE means the conversion could not be performed */
+        {
+            out_size += (cpiDest == CP_UNICODE) ? sizeof(WCHAR) : sizeof(char);
+
+            pOut->u.pszVal = CoTaskMemAlloc(out_size);
+            if(!pOut->u.pszVal)
+                hr = E_OUTOFMEMORY;
+            else
+            {
+                mode = 0;
+                in_size = src_len;
+                hr = IMultiLanguage_ConvertString(ml, &mode, cpiSource, cpiDest, (BYTE*)pIn->u.pszVal, &in_size,
+                                                  (BYTE*)pOut->u.pszVal, &out_size);
+
+                if(hr == S_OK)
+                {
+                    if(cpiDest == CP_UNICODE)
+                    {
+                        pOut->u.pwszVal[out_size / sizeof(WCHAR)] = 0;
+                        pOut->vt = VT_LPWSTR;
+                    }
+                    else
+                    {
+                        pOut->u.pszVal[out_size] = '\0';
+                        pOut->vt = VT_LPSTR;
+                    }
+                }
+                else
+                    CoTaskMemFree(pOut->u.pszVal);
+            }
+        }
+        IMultiLanguage_Release(ml);
+    }
+    return hr;
 }
 
 static HRESULT WINAPI MimeInternat_MLANG_ConvertInetReset(IMimeInternational *iface)




More information about the wine-cvs mailing list