/*++ Copyright (c) 1996 Microsoft Corporation Module Name: Utils95.c Abstract: Utilities for Win95 OLEDS support in NWAPI32 Author: Felix Wong [t-felixw] 23-Sept-1996 --*/ #include #include #define NULL_TERMINATED 0 // // define error mapping structure // typedef struct _NWSTATUS_TO_NTSTATUS { NTSTATUS NtStatus; NW_STATUS NwStatus; } NWSTATUS_TO_NTSTATUS, *LPNWSTATUS_TO_NTSTATUS; // // Error mappings for bindery errors // NWSTATUS_TO_NTSTATUS MapNtErrors[] = { {STATUS_ACCESS_DENIED, NO_OBJECT_READ_PRIVILEGE}, {STATUS_NO_MORE_ENTRIES, UNKNOWN_FILE_SERVER}, {STATUS_NO_MORE_ENTRIES, NO_SUCH_OBJECT}, {STATUS_INVALID_PARAMETER, NO_SUCH_PROPERTY}, {STATUS_UNSUCCESSFUL, INVALID_CONNECTION}, {STATUS_INSUFF_SERVER_RESOURCES, SERVER_OUT_OF_MEMORY}, {STATUS_NO_SUCH_DEVICE, VOLUME_DOES_NOT_EXIST}, {STATUS_INVALID_HANDLE, BAD_DIRECTORY_HANDLE}, {STATUS_OBJECT_PATH_NOT_FOUND, INVALID_PATH}, { 0, 0 } } ; NTSTATUS MapNwToNtStatus( const NW_STATUS nwstatus ) { LPNWSTATUS_TO_NTSTATUS pErrorMap ; if (nwstatus == SUCCESSFUL) return STATUS_SUCCESS; pErrorMap = MapNtErrors ; while (pErrorMap->NwStatus) { if (pErrorMap->NwStatus == nwstatus) return (pErrorMap->NtStatus) ; pErrorMap++ ; } return STATUS_UNSUCCESSFUL; } 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 ) { #ifdef DBCS pTempBuf = (LPSTR)LocalAlloc( LPTR, StringLength * 2 ); #else pTempBuf = (LPSTR)LocalAlloc( LPTR, StringLength ); #endif pAnsi = pTempBuf; } if( pAnsi ) { rc = WideCharToMultiByte( CP_ACP, 0, pUnicode, StringLength, pAnsi, #ifdef DBCS StringLength*2, #else StringLength, #endif 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; } LPSTR AllocateAnsiString( LPWSTR pPrinterName ) { LPSTR pAnsiString; if (!pPrinterName) return NULL; pAnsiString = (LPSTR)LocalAlloc(LPTR, wcslen(pPrinterName)*sizeof(CHAR) + sizeof(CHAR)); if (pAnsiString) UnicodeToAnsiString(pPrinterName, pAnsiString, NULL_TERMINATED); return pAnsiString; } void FreeAnsiString( LPSTR pAnsiString ) { if (!pAnsiString) return; LocalFree(pAnsiString); return; } 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; } 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; }