windows-nt/Source/XPSP1/NT/ds/adsi/router/encode.cxx

94 lines
1.8 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
encode.cxx
Abstract:
This module provides encoing functions to convert a binary blob of data so
that it can be embedded in a search filter.
Author:
Shankara Shastry (ShankSh) 12-Mar-1997
Revision History:
--*/
#include "procs.hxx"
#pragma hdrstop
#include "oleds.hxx"
WCHAR HexToWCharTable[17] = L"0123456789ABCDEF";
//
// Helper function to support allowing opaque blobs of data in search filters.
// This API takes any filter element and adds necessary escape characters
// such that when the element hits the wire in the search request, it will
// be equal to the opaque blob past in here as source.
//
//
// The destination string ppszDestData needs to be freed using FreeAdsMem after
// using it.
//
HRESULT
ADsEncodeBinaryData (
PBYTE pbSrcData,
DWORD dwSrcLen,
LPWSTR * ppszDestData
)
{
LPWSTR pszDest = NULL, pszDestPtr = NULL;
DWORD lengthRequired = 0;
DWORD dwSrcCount = 0;
WCHAR wch;
if (!ppszDestData || (!pbSrcData && dwSrcLen))
RRETURN(E_ADS_BAD_PARAMETER);
*ppszDestData = NULL;
//
// figure out how long of a buffer we need.
//
lengthRequired = ((dwSrcLen * 2) + 1) * sizeof(WCHAR);
pszDest = (LPWSTR) AllocADsMem( lengthRequired );
if (pszDest == NULL)
RRETURN (E_OUTOFMEMORY );
pszDestPtr = pszDest;
//
// For each byte in source string, copy it to dest string but we first
// expand it out such that each nibble is it's own character (UNICODE)
//
while (++dwSrcCount <= dwSrcLen) {
wch = ( (*pbSrcData) & 0xF0 ) >> 4;
*(pszDestPtr++) = HexToWCharTable[wch];
wch = (*(pbSrcData++)) & 0x0F;
*(pszDestPtr++) = HexToWCharTable[wch];
}
*pszDestPtr = '\0';
*ppszDestData = pszDest;
RRETURN (S_OK);
}