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

210 lines
5.3 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 2000.
//
// File: WrapStor.cxx
//
// Contents: Persistent property store (external to docfile)
//
// Classes: CPropertyIterWrapper
//
// History: 09-Apr-97 KrishnaN Created
// 22-Apr-97 KrishnaN Modified to work with propstoremgr.
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <wrapiter.hxx>
//+---------------------------------------------------------------------------
//
// Member: CPropertyIterWrapper::CPropertyIterWrapper, public
//
// Arguments: [propstore] - Reference to the property store to iterate.
//
// Returns: Nothing.
//
// History: 09-Apr-97 KrishnaN Created.
//
//----------------------------------------------------------------------------
CPropertyIterWrapper::CPropertyIterWrapper ( CPropStoreManager & propstoremgr ) :
_lRefCount( 1 ),
_pPropStoreWids( 0 )
{
_pPropStoreWids = new CPropertyStoreWids( propstoremgr );
}
//+---------------------------------------------------------------------------
//
// Member: CPropertyIterWrapper::~CPropertyIterWrapper, public
//
// Arguments: None
//
// Returns: Nothing
//
// History: 09-Apr-97 KrishnaN Created.
//
//----------------------------------------------------------------------------
CPropertyIterWrapper::~CPropertyIterWrapper ()
{
delete _pPropStoreWids;
}
//+---------------------------------------------------------------------------
//
// Member: CPropertyIterWrapper::Reset, public
//
// Arguments: None
//
// Returns:
//
// History: 09-Apr-97 KrishnaN Created.
//
// To implement this, go to propiter.cxx and do the following
// in a new method, Reset()
// get a lock; release the buffer; set the _wid to 1
//----------------------------------------------------------------------------
//+---------------------------------------------------------------------------
//
// Member: CPropertyIterWrapper::AddRef, public
//
// Returns: Reference count on object.
//
// History: 09-Apr-97 KrishnaN Created.
//
//----------------------------------------------------------------------------
ULONG CPropertyIterWrapper::AddRef()
{
return InterlockedIncrement(&_lRefCount);
}
//+---------------------------------------------------------------------------
//
// Member: CPropertyIterWrapper::Release, public
//
// Returns: Reference count on object.
//
// History: 09-Apr-97 KrishnaN Created.
//
//----------------------------------------------------------------------------
ULONG CPropertyIterWrapper::Release()
{
LONG lRef;
lRef = InterlockedDecrement(&_lRefCount);
if ( lRef <= 0 )
delete this;
return lRef;
}
//+---------------------------------------------------------------------------
//
// Member: CPropertyIterWrapper::WorkId, public
//
// Returns: Current workid, or widInvalid if at end.
//
// History: 08-Apr-97 KrishnaN Created.
//
//----------------------------------------------------------------------------
SCODE CPropertyIterWrapper::GetWorkId(WORKID &wid)
{
SCODE sc = S_OK;
TRY
{
wid = _pPropStoreWids->WorkId();
}
CATCH(CException, e)
{
sc = e.GetErrorCode();
wid = widInvalid;
ciDebugOut((DEB_ERROR, "CPropertyIterWrapper::GetNextWorkId caught exception 0x%X\n", sc));
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CPropertyIterWrapper::GetNextWorkId, public
//
// Arguments:
//
// Returns: Next work id.
//
// History: 09-Apr-97 KrishnaN Created.
//
//----------------------------------------------------------------------------
SCODE CPropertyIterWrapper::GetNextWorkId (WORKID &wid)
{
SCODE sc = S_OK;
TRY
{
wid = _pPropStoreWids->NextWorkId();
}
CATCH(CException, e)
{
sc = e.GetErrorCode();
ciDebugOut((DEB_ERROR, "CPropertyIterWrapper::GetNextWorkId caught exception 0x%X\n", sc));
wid = widInvalid;
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CreateWrapStor, public
//
// Arguments: [pPropStore] is the property store to iterate
// [ppPropStoreIter] receives the created iterator
//
// Returns: PPropertyStorage object
//
// History: 08-Apr-97 KrishnaN Created.
//
//----------------------------------------------------------------------------
SCODE CreatePropertyStoreIter( PPropertyStore * pPropStore,
PPropertyStoreIter ** ppPropStoreIter )
{
if (0 == pPropStore || 0 == ppPropStoreIter)
return E_INVALIDARG;
*ppPropStoreIter = 0;
SCODE sc = S_OK;
TRY
{
CPropStoreManager *pcps = ((CPropertyStoreWrapper *)pPropStore)->_GetCPropertyStore();
*ppPropStoreIter = new CPropertyIterWrapper (*pcps);
}
CATCH( CException, e)
{
sc = e.GetErrorCode();
ciDebugOut((DEB_ERROR, "CreatePropertyStoreIter caught exception 0x%X\n", sc));
}
END_CATCH
return sc;
}