windows-nt/Source/XPSP1/NT/inetsrv/query/fsci/indexing/docname.cxx
2020-09-26 16:20:57 +08:00

443 lines
10 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1998
//
// File: docname.cxx
//
// Contents: Storage Client for document
//
// History: 11-22-96 srikants Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <docname.hxx>
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::CCiCDocName
//
// Synopsis: Constructor which takes a path
//
// Arguments: [pwszPath] - Pointer to a NULL terminated path.
//
// History: 11-22-96 srikants Created
//
//----------------------------------------------------------------------------
CCiCDocName::CCiCDocName( WCHAR const * pwszPath )
:_pwszPath(_wszBuffer),
_refCount(1),
_fIsInit(FALSE),
_cwcMax(MAX_PATH-1),
_cwcPath(0)
{
if ( pwszPath )
{
ULONG cwc = wcslen( pwszPath );
SetPath( pwszPath, cwc );
}
}
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::CCiCDocName
//
// Synopsis: Constructor which takes a path and length
//
// Arguments: [pwszPath] - Pointer to a NULL terminated path.
//
// History: 11-22-96 srikants Created
//
//----------------------------------------------------------------------------
CCiCDocName::CCiCDocName( WCHAR const * pwszPath, ULONG cwc )
:_pwszPath(_wszBuffer),
_refCount(1),
_fIsInit(FALSE),
_cwcMax(MAX_PATH-1),
_cwcPath(0)
{
if ( pwszPath )
SetPath( pwszPath, cwc );
}
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::SetPath
//
// Synopsis: Stores the given path
//
// Arguments: [pwszPath] - Pointer to the path
// [cwc] - Number of characters in the path.
//
// History: 11-22-96 srikants Created
//
//----------------------------------------------------------------------------
void CCiCDocName::SetPath( WCHAR const * pwszPath, ULONG cwc )
{
if ( cwc && 0 != pwszPath )
{
if ( cwc > _cwcMax )
{
FreeResources();
ULONG cwcMax = cwc + CWC_DELTA;
_pwszPath = new WCHAR [cwcMax+1];
_cwcMax = cwcMax;
}
RtlCopyMemory( _pwszPath, pwszPath, cwc*sizeof(WCHAR) );
_cwcPath = cwc;
}
else
{
_cwcPath = 0;
}
_pwszPath[_cwcPath] = 0;
_fIsInit = TRUE;
}
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::QueryInterface
//
// Synopsis: Supports IID_IUnknown and IID_ICiCDocName
//
// Arguments: [riid] -
// [ppvObject] -
//
// History: 11-22-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::QueryInterface(
REFIID riid,
void **ppvObject)
{
Win4Assert( 0 != ppvObject );
*ppvObject = 0;
if ( IID_ICiCDocName == riid )
*ppvObject = (void *)((ICiCDocName *)this);
else if ( IID_IUnknown == riid )
*ppvObject = (void *)((IUnknown *)this);
else
return E_NOINTERFACE;
AddRef();
return S_OK;
} //QueryInterface
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::AddRef
//
// History: 11-22-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CCiCDocName::AddRef()
{
return InterlockedIncrement(&_refCount);
} //AddRef
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::Release
//
// History: 11-22-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP_(ULONG) CCiCDocName::Release()
{
Win4Assert( _refCount > 0 );
LONG refCount = InterlockedDecrement(&_refCount);
if ( refCount <= 0 )
delete this;
return (ULONG) refCount;
} //Release
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::Init
//
// Synopsis: Intiailizes with the given name data. The name must be a
// serialized form of a WIDE-CHAR string. It MUST be a
// NULL terminated string.
//
// Arguments: [pbData] - Pointer to the path.
// [cbData] - Number of valid bytes, including the NULL
// termination.
//
// Returns:
//
// History: 11-26-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::Init(
const BYTE * pbData,
ULONG cbData )
{
//
// The number of bytes must be even.
//
Win4Assert( (cbData & 0x1) == 0 );
if ( 0 != cbData%sizeof(WCHAR) )
return E_INVALIDARG;
if ( _fIsInit )
return CI_E_ALREADY_INITIALIZED;
WCHAR const * pwszPath = (WCHAR const *) pbData;
ULONG cwc = cbData/sizeof(WCHAR);
//
// The data must be NULL terminated.
//
if ( cwc > 0 && 0 != pwszPath[cwc-1] )
return E_INVALIDARG;
SetPath( pwszPath, cwc-1 );
return S_OK;
} //Init
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::Set
//
// Synopsis: Initializes this object with the given document name.
//
// Arguments: [pICiCDocName] - Pointer to the source document name.
//
// Returns:
//
// History: 11-26-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::Set(
const ICiCDocName * pICiCDocName )
{
const CCiCDocName * pRhs = (CCiCDocName *) pICiCDocName;
if ( !pRhs )
return E_INVALIDARG;
if ( _fIsInit )
return CI_E_ALREADY_INITIALIZED;
if ( pRhs->_fIsInit )
SetPath( pRhs->_pwszPath, pRhs->_cwcPath );
else
_fIsInit = FALSE;
return S_OK;
} //Set
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::Clear
//
// Synopsis: Clears the data. The document name is "invalid" after this.
//
// History: 11-26-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::Clear()
{
if ( !_fIsInit )
return CI_E_NOT_INITIALIZED;
_cwcPath = 0;
_fIsInit = FALSE;
return S_OK;
} //Clear
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::IsValid
//
// Synopsis: Tests if the document name is properly initialized or not.
//
// History: 11-26-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::IsValid(void)
{
if ( _fIsInit )
return S_OK;
else return CI_E_NOT_INITIALIZED;
}
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::Duplicate
//
// Synopsis: Makes a duplicate copy of the data in this object.
//
// Arguments: [ppICiCDocName] -
//
// History: 11-26-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::Duplicate(
ICiCDocName ** ppICiCDocName )
{
if ( 0 == ppICiCDocName )
return E_INVALIDARG;
CCiCDocName * pRhs = 0;
SCODE sc = S_OK;
TRY
{
if ( _fIsInit )
pRhs = new CCiCDocName( _pwszPath, _cwcPath );
else
pRhs = new CCiCDocName();
}
CATCH( CException,e )
{
sc = e.GetErrorCode();
}
END_CATCH
*ppICiCDocName = pRhs;
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::GetBufSizeNeeded
//
// Synopsis:
//
// Arguments: [pcbName] -
//
// Returns:
//
// Modifies:
//
// History: 11-26-96 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::GetBufSizeNeeded(
ULONG * pcbName )
{
if ( !_fIsInit )
return CI_E_NOT_INITIALIZED;
Win4Assert( pcbName );
*pcbName = ComputeBufSize();
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::Get
//
// Synopsis: Serializes the name into the buffers provided.
//
// Arguments: [pbName] - Pointer to the buffer to copy.
// [pcbName] - [in/out] In - Max Bytes to Copy
// [out] - Bytes copied or to be copied.
//
// Returns: S_OK if successful;
// CI_E_BUFFERTOOSMALL if the buffer is not big enough.
//
// History: 11-26-96 srikants Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::Get(
BYTE * pbName,
ULONG * pcbName )
{
Win4Assert( pcbName );
if ( !_fIsInit )
return CI_E_NOT_INITIALIZED;
ULONG cbToCopy = ComputeBufSize();
if ( *pcbName < cbToCopy )
{
*pcbName = cbToCopy;
return CI_E_BUFFERTOOSMALL;
}
RtlCopyMemory( pbName, _pwszPath, cbToCopy );
*pcbName = cbToCopy;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Member: CCiCDocName::GetNameBuffer
//
// Synopsis: Returns the internal buffer containing the name.
//
// Arguments: [ppbName] - On output, will point to the name buffer
// [pcbName] - Number of valid bytes in the buffer
//
// Returns: S_OK if successful;
// CI_E_NOT_INITIALIZED if not initialized.
//
// History: 1-21-97 srikants Created
//
// Notes: The buffer should not be written by the caller.
//
//----------------------------------------------------------------------------
STDMETHODIMP CCiCDocName::GetNameBuffer(
BYTE const * * ppbName,
ULONG * pcbName )
{
Win4Assert( pcbName );
Win4Assert( ppbName );
if ( !_fIsInit )
return CI_E_NOT_INITIALIZED;
*ppbName = (BYTE *) _pwszPath;
*pcbName = ComputeBufSize();
return S_OK;
}