313 lines
5.9 KiB
C++
313 lines
5.9 KiB
C++
//---------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
||
//
|
||
// File: sconv.cxx
|
||
//
|
||
// Contents: Ansi to Unicode conversions
|
||
//
|
||
// History: KrishnaG Jan 22 1996
|
||
//----------------------------------------------------------------------------
|
||
#include "ldapc.hxx"
|
||
#pragma hdrstop
|
||
|
||
#define NULL_TERMINATED 0
|
||
|
||
int
|
||
AnsiToUnicodeString(
|
||
LPSTR pAnsi,
|
||
LPWSTR pUnicode,
|
||
DWORD StringLength
|
||
)
|
||
{
|
||
int iReturn;
|
||
|
||
if( StringLength == NULL_TERMINATED )
|
||
StringLength = strlen( pAnsi );
|
||
|
||
iReturn = MultiByteToWideChar(CP_ACP,
|
||
MB_PRECOMPOSED,
|
||
pAnsi,
|
||
StringLength + 1,
|
||
pUnicode,
|
||
StringLength + 1 );
|
||
|
||
//
|
||
// Ensure NULL termination.
|
||
//
|
||
pUnicode[StringLength] = 0;
|
||
|
||
return iReturn;
|
||
}
|
||
|
||
|
||
int
|
||
UnicodeToAnsiString(
|
||
LPWSTR pUnicode,
|
||
LPSTR pAnsi,
|
||
DWORD StringLength
|
||
)
|
||
{
|
||
LPSTR pTempBuf = NULL;
|
||
INT rc = 0;
|
||
|
||
if( StringLength == NULL_TERMINATED ) {
|
||
|
||
//
|
||
// StringLength is just the
|
||
// number of characters in the string
|
||
//
|
||
StringLength = wcslen( pUnicode );
|
||
}
|
||
|
||
//
|
||
// WideCharToMultiByte doesn't NULL terminate if we're copying
|
||
// just part of the string, so terminate here.
|
||
//
|
||
|
||
pUnicode[StringLength] = 0;
|
||
|
||
//
|
||
// Include one for the NULL
|
||
//
|
||
StringLength++;
|
||
|
||
//
|
||
// Unfortunately, WideCharToMultiByte doesn't do conversion in place,
|
||
// so allocate a temporary buffer, which we can then copy:
|
||
//
|
||
|
||
if( pAnsi == (LPSTR)pUnicode )
|
||
{
|
||
pTempBuf = (LPSTR)LocalAlloc( LPTR, StringLength );
|
||
pAnsi = pTempBuf;
|
||
}
|
||
|
||
if( pAnsi )
|
||
{
|
||
rc = WideCharToMultiByte( CP_ACP,
|
||
0,
|
||
pUnicode,
|
||
StringLength,
|
||
pAnsi,
|
||
StringLength,
|
||
NULL,
|
||
NULL );
|
||
}
|
||
|
||
/* If pTempBuf is non-null, we must copy the resulting string
|
||
* so that it looks as if we did it in place:
|
||
*/
|
||
if( pTempBuf && ( rc > 0 ) )
|
||
{
|
||
pAnsi = (LPSTR)pUnicode;
|
||
strcpy( pAnsi, pTempBuf );
|
||
LocalFree( pTempBuf );
|
||
}
|
||
|
||
return rc;
|
||
}
|
||
|
||
|
||
LPWSTR
|
||
AllocateUnicodeString(
|
||
LPSTR pAnsiString
|
||
)
|
||
{
|
||
LPWSTR pUnicodeString = NULL;
|
||
|
||
if (!pAnsiString)
|
||
return NULL;
|
||
|
||
pUnicodeString = (LPWSTR)LocalAlloc(
|
||
LPTR,
|
||
strlen(pAnsiString)*sizeof(WCHAR) +sizeof(WCHAR)
|
||
);
|
||
|
||
if (pUnicodeString) {
|
||
|
||
AnsiToUnicodeString(
|
||
pAnsiString,
|
||
pUnicodeString,
|
||
NULL_TERMINATED
|
||
);
|
||
}
|
||
|
||
return pUnicodeString;
|
||
}
|
||
|
||
|
||
void
|
||
FreeUnicodeString(
|
||
LPWSTR pUnicodeString
|
||
)
|
||
{
|
||
if (!pUnicodeString)
|
||
return;
|
||
|
||
LocalFree(pUnicodeString);
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
DWORD
|
||
ComputeMaxStrlenW(
|
||
LPWSTR pString,
|
||
DWORD cchBufMax
|
||
)
|
||
{
|
||
DWORD cchLen;
|
||
|
||
//
|
||
// Include space for the NULL.
|
||
//
|
||
|
||
cchBufMax--;
|
||
|
||
cchLen = wcslen(pString);
|
||
|
||
if (cchLen > cchBufMax)
|
||
return cchBufMax;
|
||
|
||
return cchLen;
|
||
}
|
||
|
||
|
||
DWORD
|
||
ComputeMaxStrlenA(
|
||
LPSTR pString,
|
||
DWORD cchBufMax
|
||
)
|
||
{
|
||
DWORD cchLen;
|
||
|
||
//
|
||
// Include space for the NULL.
|
||
//
|
||
cchBufMax--;
|
||
|
||
cchLen = lstrlenA(pString);
|
||
|
||
if (cchLen > cchBufMax)
|
||
return cchBufMax;
|
||
|
||
return cchLen;
|
||
}
|
||
|
||
|
||
HRESULT
|
||
UnicodeToUTF8String(
|
||
LPCWSTR pUnicode,
|
||
LPSTR *ppUTF8
|
||
)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
int UnicodeLength = 0;
|
||
|
||
LPSTR pUTF8Temp = NULL;
|
||
int UTF8TempLength = 0;
|
||
|
||
LPSTR pUTF8 = NULL;
|
||
int UTF8Length = 0;
|
||
|
||
if (!pUnicode || !ppUTF8)
|
||
BAIL_ON_FAILURE(hr = E_INVALIDARG)
|
||
|
||
UnicodeLength = wcslen(pUnicode);
|
||
UTF8TempLength = (UnicodeLength+1) * 4;
|
||
|
||
pUTF8Temp = (char*) AllocADsMem(UTF8TempLength);
|
||
if (!pUTF8Temp)
|
||
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
||
UTF8Length = LdapUnicodeToUTF8(pUnicode,
|
||
UnicodeLength+1,
|
||
pUTF8Temp,
|
||
UTF8TempLength);
|
||
if (UTF8Length == 0)
|
||
BAIL_ON_FAILURE(hr = E_FAIL);
|
||
|
||
|
||
pUTF8 = (char*) AllocADsMem(UTF8Length);
|
||
if (!pUTF8)
|
||
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
||
memcpy(pUTF8, pUTF8Temp, UTF8Length);
|
||
|
||
*ppUTF8 = pUTF8;
|
||
|
||
FreeADsMem(pUTF8Temp);
|
||
|
||
return(hr);
|
||
|
||
error:
|
||
if (pUTF8)
|
||
FreeADsMem(pUTF8);
|
||
|
||
if (pUTF8Temp)
|
||
FreeADsMem(pUTF8Temp);
|
||
|
||
return (hr);
|
||
}
|
||
|
||
|
||
HRESULT
|
||
UTF8ToUnicodeString(
|
||
LPCSTR pUTF8,
|
||
LPWSTR *ppUnicode
|
||
)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
int UTF8Length = 0;
|
||
|
||
LPWSTR pUnicodeTemp = NULL;
|
||
int UnicodeTempLength = 0;
|
||
|
||
LPWSTR pUnicode = NULL;
|
||
int UnicodeLength = 0;
|
||
|
||
if (!pUTF8 || !ppUnicode)
|
||
BAIL_ON_FAILURE(hr = E_INVALIDARG)
|
||
|
||
UTF8Length = strlen(pUTF8);
|
||
UnicodeTempLength = (UTF8Length+1) * 4;
|
||
|
||
pUnicodeTemp = (PWCHAR) AllocADsMem(UnicodeTempLength);
|
||
if (!pUnicodeTemp)
|
||
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
||
UnicodeLength = LdapUTF8ToUnicode(pUTF8,
|
||
UTF8Length+1,
|
||
pUnicodeTemp,
|
||
UnicodeTempLength);
|
||
if (UnicodeLength == 0)
|
||
BAIL_ON_FAILURE(hr = E_FAIL);
|
||
|
||
|
||
pUnicode = (PWCHAR) AllocADsMem(UnicodeLength);
|
||
if (!pUnicode)
|
||
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
||
memcpy(pUnicode, pUnicodeTemp, UnicodeLength);
|
||
|
||
*ppUnicode = pUnicode;
|
||
|
||
FreeADsMem(pUnicodeTemp);
|
||
|
||
return(hr);
|
||
|
||
error:
|
||
if (pUnicode)
|
||
FreeADsMem(pUnicode);
|
||
|
||
if (pUnicodeTemp)
|
||
FreeADsMem(pUnicodeTemp);
|
||
|
||
return (hr);
|
||
}
|
||
|
||
|