/////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000, Microsoft Corp. All rights reserved. // // FILE // // iasattr.cpp // // SYNOPSIS // // Defines the API for manipulating IASATTRIBUTE structs. // // MODIFICATION HISTORY // // 02/02/2000 Original version. // /////////////////////////////////////////////////////////////////////////////// #include #include #include DWORD WINAPI IASAttributeAlloc( DWORD dwCount, IASATTRIBUTE** ppAttribute ) { PIASATTRIBUTE* next = ppAttribute; for ( ; dwCount; --dwCount, ++next) { if (!(*next = (PIASATTRIBUTE)CoTaskMemAlloc(sizeof(IASATTRIBUTE)))) { while (next > ppAttribute) { CoTaskMemFree(*--next); } return ERROR_NOT_ENOUGH_MEMORY; } memset(*next, 0, sizeof(IASATTRIBUTE)); (*next)->dwReserved = 1; } return NO_ERROR; } DWORD WINAPI IASAttributeAddRef( PIASATTRIBUTE pAttribute ) { if (pAttribute) { InterlockedIncrement((PLONG)&pAttribute->dwReserved); } return NO_ERROR; } DWORD WINAPI IASAttributeRelease( PIASATTRIBUTE pAttribute ) { if (pAttribute && !InterlockedDecrement((PLONG)&pAttribute->dwReserved)) { switch (pAttribute->Value.itType) { case IASTYPE_STRING: { CoTaskMemFree(pAttribute->Value.String.pszAnsi); CoTaskMemFree(pAttribute->Value.String.pszWide); break; } case IASTYPE_OCTET_STRING: { CoTaskMemFree(pAttribute->Value.OctetString.lpValue); break; } } CoTaskMemFree(pAttribute); } return ERROR_SUCCESS; } DWORD WINAPI IASAttributeUnicodeAlloc( PIASATTRIBUTE pAttribute ) { if (!pAttribute || pAttribute->Value.itType != IASTYPE_STRING || pAttribute->Value.String.pszWide != NULL || pAttribute->Value.String.pszAnsi == NULL) { return NO_ERROR; } // Find out how big a buffer we need. int lenW = MultiByteToWideChar( CP_ACP, 0, pAttribute->Value.String.pszAnsi, -1, NULL, 0); if (!lenW) { return GetLastError(); } LPWSTR wide = (LPWSTR)CoTaskMemAlloc(lenW * sizeof(WCHAR)); if (!wide) { return ERROR_NOT_ENOUGH_MEMORY; } // Do the conversion. MultiByteToWideChar( CP_ACP, 0, pAttribute->Value.String.pszAnsi, -1, wide, lenW ); CoTaskMemFree( InterlockedExchangePointer( (PVOID*)&pAttribute->Value.String.pszWide, wide ) ); return NO_ERROR; } DWORD WINAPI IASAttributeAnsiAlloc( PIASATTRIBUTE pAttribute ) { if (!pAttribute || pAttribute->Value.itType != IASTYPE_STRING || pAttribute->Value.String.pszAnsi != NULL || pAttribute->Value.String.pszWide == NULL) { return NO_ERROR; } // Find out how big a buffer we need. int lenA = WideCharToMultiByte( CP_ACP, 0, pAttribute->Value.String.pszWide, -1, NULL, 0, NULL, NULL ); if (!lenA) { return GetLastError(); } LPSTR ansi = (LPSTR)CoTaskMemAlloc(lenA * sizeof(CHAR)); if (!ansi) { return ERROR_NOT_ENOUGH_MEMORY; } // Do the conversion. WideCharToMultiByte( CP_ACP, 0, pAttribute->Value.String.pszWide, -1, ansi, lenA, NULL, NULL ); CoTaskMemFree( InterlockedExchangePointer( (PVOID*)&pAttribute->Value.String.pszAnsi, ansi ) ); return NO_ERROR; }