windows-nt/Source/XPSP1/NT/com/ole32/stg/simp/simpenm.cxx
2020-09-26 16:20:57 +08:00

241 lines
6.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: simpenm.cxx
//
// Contents: SimpEnumSTATSTG class implementation
//
// Classes: CSimpEnumSTATSTG
//
// Functions:
//
// History: 04-May-96 HenryLee Created
//
//----------------------------------------------------------------------------
#include "simphead.cxx"
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::QueryInterface, public
//
// Synopsis: Init function
//
// Arguments: [riid] -- reference to desired interface ID
// [ppvObj] -- output pointer to interface
//
// Returns: Appropriate status code
//
// History: 04-May-96 HenryLee Created
//
//----------------------------------------------------------------------------
STDMETHODIMP CSimpEnumSTATSTG::QueryInterface (REFIID riid, void **ppvObj)
{
simpDebugOut((DEB_ITRACE,"In CSimpEnumSTATSTG::QueryInterface %p\n",this));
SCODE sc = S_OK;
if (ppvObj == NULL)
return STG_E_INVALIDPOINTER;
*ppvObj = NULL;
if (riid == IID_IEnumSTATSTG || riid == IID_IUnknown)
{
*ppvObj = this;
AddRef ();
}
else
sc = E_NOINTERFACE;
simpDebugOut((DEB_ITRACE, "Out CSimpEnumSTATSTG::QueryInterface\n"));
return sc;
}
//+--------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::AddRef, public
//
// Synopsis:
//
// Returns: Appropriate status code
//
// History: 04-May-96 HenryLee Created
//
//---------------------------------------------------------------
STDMETHODIMP_(ULONG) CSimpEnumSTATSTG::AddRef ()
{
simpDebugOut((DEB_TRACE, "In CSimpEnumSTATSTG::AddRef()\n"));
simpAssert(_cReferences > 0);
LONG lRet = AtomicInc(&_cReferences);
simpDebugOut((DEB_TRACE, "Out CSimpEnumSTATSTG::AddRef()\n"));
return (ULONG) lRet;
}
//+--------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::Release, public
//
// Synopsis:
//
// Returns: Appropriate status code
//
// History: 04-May-96 HenryLee Created
//
//---------------------------------------------------------------
STDMETHODIMP_(ULONG) CSimpEnumSTATSTG::Release ()
{
simpDebugOut((DEB_TRACE, "In CSimpEnumSTATSTG::Release()\n"));
simpAssert(_cReferences > 0);
LONG lRet = AtomicDec(&_cReferences);
if (lRet == 0)
{
delete this;
}
simpDebugOut((DEB_TRACE, "Out CSimpEnumSTATSTG::Release()\n"));
return (ULONG) lRet;
}
//+--------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::Next, public
//
// Synopsis:
//
// Returns: Appropriate status code
//
// History: 04-May-96 HenryLee Created
//
//---------------------------------------------------------------
STDMETHODIMP CSimpEnumSTATSTG::Next (ULONG celt, STATSTG *rgelt,
ULONG *pceltFetched)
{
SCODE sc = S_OK;
simpDebugOut((DEB_TRACE, "In CSimpEnumSTATSTG::Next()\n"));
if (celt != 1 || rgelt == NULL)
return STG_E_INVALIDPARAMETER;
if (pceltFetched)
*pceltFetched = 0;
if (_pdflCurrent == _pdfl && _pdfl != NULL)
_pdflCurrent = _pdflCurrent->GetNext(); // skip the root directory
if (_pdflCurrent != NULL)
{
memset (rgelt, 0, sizeof(STATSTG));
rgelt->pwcsName = (WCHAR *) CoTaskMemAlloc (
_pdflCurrent->GetName()->GetLength()+sizeof(WCHAR));
if (rgelt->pwcsName)
{
memcpy (rgelt->pwcsName, _pdflCurrent->GetName()->GetBuffer(),
_pdflCurrent->GetName()->GetLength());
rgelt->pwcsName[_pdflCurrent->GetName()->GetLength()/
sizeof(WCHAR)] = L'\0';
rgelt->cbSize.LowPart = _pdflCurrent->GetSize();
rgelt->cbSize.HighPart = 0;
rgelt->type = STGTY_STREAM;
_pdflCurrent = _pdflCurrent->GetNext();
if (pceltFetched)
*pceltFetched = 1;
}
else
sc = STG_E_INSUFFICIENTMEMORY;
}
else // end of list
{
sc = S_FALSE;
}
simpDebugOut((DEB_TRACE, "Out CSimpEnumSTATSTG::Next()\n"));
return sc;
}
//+--------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::Skip, public
//
// Synopsis:
//
// Returns: Appropriate status code
//
// History: 04-May-96 HenryLee Created
//
//---------------------------------------------------------------
STDMETHODIMP CSimpEnumSTATSTG::Skip (ULONG celt)
{
simpDebugOut((DEB_TRACE, "In CSimpEnumSTATSTG::Skip()\n"));
SCODE sc = STG_E_INVALIDFUNCTION;
simpDebugOut((DEB_TRACE, "Out CSimpEnumSTATSTG::Skip()\n"));
return sc;
}
//+--------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::Reset, public
//
// Synopsis:
//
// Returns: Appropriate status code
//
// History: 04-May-96 HenryLee Created
//
//---------------------------------------------------------------
STDMETHODIMP CSimpEnumSTATSTG::Reset (void)
{
SCODE sc = S_OK;
simpDebugOut((DEB_TRACE, "In CSimpEnumSTATSTG::Reset()\n"));
_pdflCurrent = _pdfl;
simpDebugOut((DEB_TRACE, "Out CSimpEnumSTATSTG::Reset()\n"));
return sc;
}
//+--------------------------------------------------------------
//
// Member: CSimpEnumSTATSTG::Clone, public
//
// Synopsis:
//
// Returns: Appropriate status code
//
// History: 04-May-96 HenryLee Created
//
//---------------------------------------------------------------
STDMETHODIMP CSimpEnumSTATSTG::Clone (IEnumSTATSTG **ppenum)
{
SCODE sc = S_OK;
simpDebugOut((DEB_TRACE, "In CSimpEnumSTATSTG::Clone()\n"));
if (ppenum == NULL)
return STG_E_INVALIDPARAMETER;
if ((*ppenum = new CSimpEnumSTATSTG (_pdfl, _pdflCurrent)) == NULL)
sc = STG_E_INSUFFICIENTMEMORY;
simpDebugOut((DEB_TRACE, "Out CSimpEnumSTATSTG::Clone()\n"));
return sc;
}