mlang: Reimplement ConvertINetMultiByteToUnicode.

This commit is contained in:
James Hawkins 2008-07-08 00:01:21 -05:00 committed by Alexandre Julliard
parent e7fe63df60
commit 4e3ce9f887
1 changed files with 37 additions and 24 deletions

View File

@ -546,50 +546,63 @@ HRESULT WINAPI ConvertINetUnicodeToMultiByte(
LPSTR pDstStr,
LPINT pcDstSize)
{
INT destsz, size;
INT src_len = -1;
TRACE("%p %d %s %p %p %p\n", pdwMode, dwEncoding,
debugstr_w(pSrcStr), pcSrcSize, pDstStr, pcDstSize);
if (!pcDstSize)
return E_FAIL;
return S_OK;
if (!pcSrcSize)
pcSrcSize = &src_len;
if (!*pcSrcSize)
{
*pcDstSize = 0;
destsz = (pDstStr) ? *pcDstSize : 0;
*pcDstSize = 0;
if (!pSrcStr || !*pcSrcSize)
return S_OK;
}
switch (dwEncoding)
if (*pcSrcSize == -1)
*pcSrcSize = lstrlenW(pSrcStr);
if (dwEncoding == CP_UNICODE)
{
case CP_UNICODE:
if (*pcSrcSize == -1)
*pcSrcSize = lstrlenW(pSrcStr);
*pcDstSize = min(*pcSrcSize * sizeof(WCHAR), *pcDstSize);
if (pDstStr)
memmove(pDstStr, pSrcStr, *pcDstSize);
break;
default:
if (*pcSrcSize == -1)
*pcSrcSize = lstrlenW(pSrcStr);
size = min(*pcSrcSize, destsz) * sizeof(WCHAR);
if (pDstStr)
*pcDstSize = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, pDstStr, *pcDstSize, NULL, NULL);
else
*pcDstSize = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize, NULL, 0, NULL, NULL);
break;
memmove(pDstStr, pSrcStr, size);
if (size >= destsz)
goto fail;
}
else
{
size = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize,
NULL, 0, NULL, NULL);
if (!size)
goto fail;
if (pDstStr)
{
size = min(size, destsz);
size = WideCharToMultiByte(dwEncoding, 0, pSrcStr, *pcSrcSize,
pDstStr, destsz, NULL, NULL);
if (!size)
goto fail;
}
}
if (!*pcDstSize)
return E_FAIL;
*pcDstSize = size;
return S_OK;
fail:
*pcSrcSize = 0;
*pcDstSize = 0;
return E_FAIL;
}
HRESULT WINAPI ConvertINetString(