|
|
//+---------------------------------------------------------------------------
//
// 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; }
|