windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/querylib/qcanon.cxx
2020-09-26 16:20:57 +08:00

193 lines
4.7 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995 - 1998.
//
// File: qcanon.cxx
//
// Contents: CCiCanonicalOutput class
//
// History: 6-06-95 srikants Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <qcanon.hxx>
//+---------------------------------------------------------------------------
//
// Function: CastToStorageVariant
//
// Synopsis: To treat a variant as a CStorageVariant. Because CStorageVariant
// derives from PROPVARIANT in a "protected" fashion, we cannot
// directly typecast a PROPVARIANT * to a CStorageVariant *
//
// Arguments: [varnt] - The variant that must be type casted.
//
// Returns: A pointer to varnt as a CStorageVariant.
//
// History: 6-06-95 srikants Created
//
// Notes: There are two overloaded implementations, one to convert
// a reference to const to a pointer to const.
//
//----------------------------------------------------------------------------
inline
CStorageVariant * CastToStorageVariant( PROPVARIANT & varnt )
{
return (CStorageVariant *) ((void *) &varnt);
}
inline
CStorageVariant const * CastToStorageVariant( PROPVARIANT const & varnt )
{
return (CStorageVariant *) ((void *) &varnt);
}
//+---------------------------------------------------------------------------
//
// Method: CCiCanonicalOutput::PutWString, static public
//
// Synopsis:
//
// Arguments: [stm] -
// [pwszStr] -
//
// Returns:
//
// History: 6-21-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CCiCanonicalOutput::PutWString( PSerStream & stm, WCHAR const * pwszStr )
{
ULONG cwc = (0 != pwszStr) ? wcslen( pwszStr ) : 0;
stm.PutULong( cwc );
if (cwc)
stm.PutWChar( pwszStr, cwc );
}
//+---------------------------------------------------------------------------
//
// Method: CCiCanonicalOutput::GetWString, static public
//
// Synopsis:
//
// Arguments: [stm] -
// [fSuccess] -
//
// Returns:
//
// History: 6-21-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
WCHAR * CCiCanonicalOutput::GetWString( PDeSerStream & stm, BOOL & fSuccess )
{
ULONG cwc = stm.GetULong();
fSuccess = TRUE;
if ( 0 == cwc )
{
return 0;
}
ULONG cb = (cwc+1) * sizeof(WCHAR);
WCHAR * pwszStr = (WCHAR *) CoTaskMemAlloc( cb );
if ( 0 == pwszStr )
{
fSuccess = FALSE;
return 0;
}
stm.GetWChar( pwszStr, cwc );
pwszStr[cwc] = L'\0';
return pwszStr;
}
//+---------------------------------------------------------------------------
//
// Method: CCiCanonicalOutput::AllocAndCopyWString, static public
//
// Synopsis:
//
// Arguments: [pSrc] -
//
// Returns:
//
// History: 6-22-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
WCHAR * CCiCanonicalOutput::AllocAndCopyWString( const WCHAR * pSrc )
{
WCHAR * pDst = 0;
if ( 0 != pSrc )
{
const cb = ( wcslen( pSrc ) + 1 ) * sizeof(WCHAR);
pDst = (WCHAR *) new WCHAR [ cb/sizeof(WCHAR) ];
if ( 0 != pDst )
{
RtlCopyMemory( pDst, pSrc, cb );
}
}
return pDst;
}
//+---------------------------------------------------------------------------
//
// Member: CCiCanonicalQueryRows::Init
//
// Synopsis: Initializes the query rows output structure for writing
// results out.
//
// History: 7-01-96 srikants Created
//
//----------------------------------------------------------------------------
void CCiCanonicalQueryRows::Init()
{
RtlZeroMemory( this, sizeof(CCiCanonicalQueryRows) );
InitVersion();
SetOutputType( CCiCanonicalOutput::eQueryRows );
}
//+---------------------------------------------------------------------------
//
// Member: CQuadByteAlignedBuffer::CQuadByteAlignedBuffer
//
// Synopsis: Constructor for a quad aligned buffer class.
//
// Arguments: [cbBuffer] - Number of bytes in the buffer class.
//
// History: 6-16-96 srikants Created
//
//----------------------------------------------------------------------------
CQuadByteAlignedBuffer::CQuadByteAlignedBuffer( ULONG cbBuffer )
{
// allocator guarantees 8-byte alignment
_pbAlloc = new BYTE [ cbBuffer ];
_cbAlloc = cbBuffer;
Win4Assert( ( ((ULONG_PTR) _pbAlloc) & 0x7) == 0 );
_pbAligned = _pbAlloc;
_cbAligned = _cbAlloc;
}