mlang: Implement IMultiLanguage2::ConvertStringInIStream.

Hans Leidekker hans at codeweavers.com
Tue Nov 11 03:17:20 CST 2008


With break instead of goto, as suggested by Dmitry, and a larger default
buffer size.

 -Hans

diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c
index ae85f6e..4382f35 100644
--- a/dlls/mlang/mlang.c
+++ b/dlls/mlang/mlang.c
@@ -2762,6 +2762,8 @@ static HRESULT WINAPI fnIMultiLanguage2_CreateConvertCharset(
     return E_NOTIMPL;
 }
 
+#define BUFFER_SIZE 1024
+
 static HRESULT WINAPI fnIMultiLanguage2_ConvertStringInIStream(
     IMultiLanguage3* iface,
     DWORD* pdwMode,
@@ -2772,8 +2774,44 @@ static HRESULT WINAPI fnIMultiLanguage2_ConvertStringInIStream(
     IStream* pstmIn,
     IStream* pstmOut)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    char src[BUFFER_SIZE], *dst;
+    INT srclen, dstlen;
+    ULONG bytes_read, buffer_size = BUFFER_SIZE * 3; /* should be enough in most cases */
+    HRESULT hr;
+
+    TRACE("%p %0x8 %s %u %u %p %p\n",
+          pdwMode, dwFlag, debugstr_w(lpFallBack), dwSrcEncoding, dwDstEncoding, pstmIn, pstmOut);
+
+    FIXME("dwFlag and lpFallBack not handled\n");
+
+    if (!(dst = HeapAlloc(GetProcessHeap(), 0, buffer_size))) return E_OUTOFMEMORY;
+
+    while (1)
+    {
+        hr = IStream_Read(pstmIn, src, sizeof(src), &bytes_read);
+        if (FAILED(hr)) break;
+
+        srclen = bytes_read;
+        dstlen = buffer_size;
+        ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding, src, &srclen, NULL, &dstlen);
+        if (dstlen > buffer_size)
+        {
+            dst = HeapReAlloc(GetProcessHeap(), 0, dst, dstlen);
+            if (!dst) return E_OUTOFMEMORY;
+            buffer_size = dstlen;
+        }
+
+        hr = ConvertINetString(pdwMode, dwSrcEncoding, dwDstEncoding, src, &srclen, dst, &dstlen);
+        if (FAILED(hr)) break;
+
+        hr = IStream_Write(pstmOut, dst, dstlen, NULL);
+        if (FAILED(hr)) break;
+
+        if (bytes_read != sizeof(src)) break;
+    }
+
+    HeapFree(GetProcessHeap(), 0, dst);
+    return hr;
 }
 
 /*



More information about the wine-patches mailing list