Module: wine Branch: master Commit: 0d04d7acb145aaf3af583e4a59749fbb5772e89d URL: http://source.winehq.org/git/wine.git/?a=commit;h=0d04d7acb145aaf3af583e4a59...
Author: Huw Davies huw@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)