mlang: Implement IMultiLanguage2::ConvertStringInIStream.
Hans Leidekker
hans at codeweavers.com
Mon Nov 10 05:19:10 CST 2008
diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c
index ae85f6e..a18d6c3 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 128
+
static HRESULT WINAPI fnIMultiLanguage2_ConvertStringInIStream(
IMultiLanguage3* iface,
DWORD* pdwMode,
@@ -2772,8 +2774,45 @@ 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)) goto exit;
+
+ 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)) goto exit;
+
+ hr = IStream_Write(pstmOut, dst, dstlen, NULL);
+ if (FAILED(hr)) goto exit;
+
+ if (bytes_read != sizeof(src)) break;
+ }
+
+exit:
+ HeapFree(GetProcessHeap(), 0, dst);
+ return hr;
}
/*
More information about the wine-patches
mailing list