|
|
#include "dvosal.h"
//#include "osind.h"
#include "dndbg.h"
#define DVOSAL_DEFAULT_CHAR "-"
volatile BOOL g_fUnicode;
#undef DPF_MODNAME
#define DPF_MODNAME "OSAL_Initialize"
HRESULT OSAL_Initialize() { g_fUnicode = OSAL_CheckIsUnicodePlatform();
return S_OK; }
#undef DPF_MODNAME
#define DPF_MODNAME "OSAL_DeInitialize"
HRESULT OSAL_DeInitialize() { return S_OK; }
#undef DPF_MODNAME
#define DPF_MODNAME "OSAL_IsUnicodePlatform"
BOOL OSAL_IsUnicodePlatform() { return g_fUnicode; }
#undef DPF_MODNAME
#define DPF_MODNAME "OSAL_CheckIsUnicodePlatform"
BOOL OSAL_CheckIsUnicodePlatform() { OSVERSIONINFOA ver; BOOL bReturn = FALSE;
// Clear our structure since it's on the stack
memset(&ver, 0, sizeof(OSVERSIONINFOA)); ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
// Just always call the ANSI function
if(!GetVersionExA(&ver)) { DPF( DVF_ERRORLEVEL, "Unable to determinte platform -- setting flag to ANSI"); bReturn = FALSE; } else { switch(ver.dwPlatformId) { case VER_PLATFORM_WIN32_WINDOWS: DPF(DVF_ERRORLEVEL, "Platform detected as non-NT -- setting flag to ANSI"); bReturn = FALSE; break;
case VER_PLATFORM_WIN32_NT: DPF(DVF_ERRORLEVEL, "Platform detected as NT -- setting flag to Unicode"); bReturn = TRUE; break;
default: DPF(DVF_ERRORLEVEL, "Unable to determine platform -- setting flag to ANSI"); bReturn = FALSE; break; } }
// Keep the compiler happy
return bReturn;
} // OS_IsUnicodePlatform
#undef DPF_MODNAME
#define DPF_MODNAME "OSAL_AllocAndConvertToANSI"
/*
** GetAnsiString * * CALLED BY: Everywhere * * PARAMETERS: *ppszAnsi - pointer to string * lpszWide - string to copy * * DESCRIPTION: handy utility function * allocs space for and converts lpszWide to ansi * * RETURNS: string length * */ HRESULT OSAL_AllocAndConvertToANSI(LPSTR * ppszAnsi,LPCWSTR lpszWide) { int iStrLen; DNASSERT(ppszAnsi);
if (!lpszWide) { *ppszAnsi = NULL; return S_OK; }
// call wide to ansi to find out how big +1 for terminating NULL
iStrLen = OSAL_WideToAnsi(NULL,lpszWide,0) + 1; DNASSERT(iStrLen > 0);
*ppszAnsi = new char[iStrLen]; if (!*ppszAnsi) { DPF(DVF_ERRORLEVEL, "could not get ansi string -- out of memory"); return E_OUTOFMEMORY; } OSAL_WideToAnsi(*ppszAnsi,lpszWide,iStrLen);
return S_OK; } // GetAnsiString
#undef DPF_MODNAME
#define DPF_MODNAME "OSAL_WideToAnsi"
/*
** WideToAnsi * * CALLED BY: everywhere * * PARAMETERS: lpStr - destination string * lpWStr - string to convert * cchStr - size of dest buffer * * DESCRIPTION: * converts unicode lpWStr to ansi lpStr. * fills in unconvertable chars w/ DPLAY_DEFAULT_CHAR "-" * * * RETURNS: if cchStr is 0, returns the size required to hold the string * otherwise, returns the number of chars converted * */ int OSAL_WideToAnsi(LPSTR lpStr,LPCWSTR lpWStr,int cchStr) { int rval; //PREFIX: using uninitialized memory 'bDefault', Mill Bug#129165
// bDefault is passed by reference to WideCharToMultiByte, but we will keep prefix happy
BOOL bDefault = 0x0;
if (!lpWStr && cchStr) { // can't call us w/ null pointer & non-zero cch
DNASSERT(FALSE); return 0; } // use the default code page (CP_ACP)
// -1 indicates WStr must be null terminated
rval = WideCharToMultiByte(CP_ACP,0,lpWStr,-1,lpStr,cchStr, DVOSAL_DEFAULT_CHAR,&bDefault);
if (bDefault) { DPF(DVF_WARNINGLEVEL,"!!! WARNING - used default string in WideToAnsi conversion.!!!"); DPF(DVF_WARNINGLEVEL,"!!! Possible bad unicode string - (you're not hiding ansi in there are you?) !!! "); } return rval;
} // WideToAnsi
#undef DPF_MODNAME
#define DPF_MODNAME "OSAL_AnsiToWide"
/*
** AnsiToWide * * CALLED BY: everywhere * * PARAMETERS: lpWStr - dest string * lpStr - string to convert * cchWstr - size of dest buffer * * DESCRIPTION: converts Ansi lpStr to Unicode lpWstr * * * RETURNS: if cchStr is 0, returns the size required to hold the string * otherwise, returns the number of chars converted * */ int OSAL_AnsiToWide(LPWSTR lpWStr,LPCSTR lpStr,int cchWStr) { int rval;
if (!lpStr && cchWStr) { // can't call us w/ null pointer & non-zero cch
DNASSERT(FALSE); return 0; }
rval = MultiByteToWideChar(CP_ACP,0,lpStr,-1,lpWStr,cchWStr);
return rval; } // AnsiToWide
/*
** WideToTChar * * CALLED BY: everywhere * * PARAMETERS: lpTStr - destination string * lpWStr - string to convert * cchTStr - size of dest buffer * * DESCRIPTION: * converts unicode lpWStr to TCHAR lpTStr. * fills in unconvertable chars w/ DPLAY_DEFAULT_CHAR "-" * * * RETURNS: if cchTStr is 0, returns the size required to hold the string * otherwise, returns the number of chars converted * */ int OSAL_WideToTChar(LPTSTR lpTStr,LPCWSTR lpWStr,int cchTStr) { #if defined(UNICODE)
// no conversion required, just copy the string over
if (!lpWStr && cchTStr) { // can't call us w/ null pointer & non-zero cch
DNASSERT(FALSE); return 0; }
if (cchTStr == 0) { return (wcslen(lpWStr)+1)*sizeof(TCHAR); }
wcsncpy(lpTStr, lpWStr, cchTStr/sizeof(TCHAR));
return (wcslen(lpTStr)+1)*sizeof(TCHAR); #else
// call the conversion function
return OSAL_WideToAnsi(lpTStr, lpWStr, cchTStr); #endif
} // WideToTChar
/*
** TCharToWide * * CALLED BY: everywhere * * PARAMETERS: lpWStr - destination string * lpTStr - string to convert * cchWStr - size of dest buffer * * DESCRIPTION: * converts TCHAR lpTStr to unicode lpWStr. * * * RETURNS: if cchWStr is 0, returns the size required to hold the string * otherwise, returns the number of chars converted * */ int OSAL_TCharToWide(LPWSTR lpWStr,LPCTSTR lpTStr,int cchWStr) { #if defined(UNICODE)
// no conversion required, just copy the string over
if (!lpTStr && cchWStr) { // can't call us w/ null pointer & non-zero cch
DNASSERT(FALSE); return 0; }
if (cchWStr == 0) { return (wcslen(lpTStr)+1)*sizeof(WCHAR); }
wcsncpy(lpWStr, lpTStr, cchWStr/sizeof(WCHAR));
return (wcslen(lpWStr)+1)*sizeof(WCHAR); #else
// call the conversion function
return OSAL_AnsiToWide(lpWStr, lpTStr, cchWStr); #endif
} // TCharToWide
|