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