Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

121 lines
2.7 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: tfc.cpp
//
//--------------------------------------------------------------------------
#include <pch.cpp>
#pragma hdrstop
#include "tfc.h"
#include "multisz.h"
#define __dwFILE__ __dwFILE_CERTLIB_MULTISZ_CPP__
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
// CMultiSz
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//
// Marshals the list into a multisz buffer. The function allocates space, caller
// is responsible for LocalFree'ing rpBuffer.
//
// Also returns the buffer size in bytes.
//
HRESULT CMultiSz::Marshal(void *&rpBuffer, DWORD &rcbBuffer)
{
HRESULT hr;
CMultiSzEnum Enum(*this);
DWORD cbBuffer;
void *pBuffer;
WCHAR *pwszBuf;
rcbBuffer = 0;
rpBuffer = NULL;
cbBuffer = 1; // trailing empty string
for(CString *pStr=Enum.Next();
pStr;
pStr=Enum.Next())
{
cbBuffer += pStr->GetLength()+1;
}
cbBuffer *= sizeof(WCHAR);
pBuffer = LocalAlloc(LMEM_FIXED, cbBuffer);
_JumpIfAllocFailed(pBuffer, error);
pwszBuf = (WCHAR*)pBuffer;
Enum.Reset();
for(CString *pStr=Enum.Next();
pStr;
pStr=Enum.Next())
{
wcscpy(pwszBuf, *pStr);
pwszBuf += wcslen(*pStr)+1;
}
*pwszBuf = L'\0';
rcbBuffer = cbBuffer;
rpBuffer = pBuffer;
hr = S_OK;
error:
return hr;
}
HRESULT CMultiSz::Unmarshal(void *pBuffer)
{
HRESULT hr;
WCHAR *pchCrt;
CSASSERT(IsEmpty()); // warn if used on a prepopulated CMultiSz
for(pchCrt = (WCHAR*)pBuffer;
L'\0' != *pchCrt;
pchCrt += wcslen(pchCrt)+1)
{
CString *pStr = new CString(pchCrt);
if(!pStr ||
pStr->IsEmpty() ||
!AddTail(pStr))
{
hr = E_OUTOFMEMORY;
_JumpError(hr, error, "");
}
}
hr = S_OK;
error:
return hr;
}
bool CMultiSz::Find(LPCWSTR pcwszValue, bool fCaseSensitive)
{
CMultiSzEnum ISAPIDependListEnum(*this);
const CString *pStr;
for(pStr = ISAPIDependListEnum.Next();
pStr;
pStr = ISAPIDependListEnum.Next())
{
if(0 == (fCaseSensitive?
wcscmp(pcwszValue, *pStr):
_wcsicmp(pcwszValue, *pStr)))
return true;
}
return false;
}