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

136 lines
3.5 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: msfiter.cxx
//
// Contents: Iterator code for MSF
//
// Classes: None. (Defined in iter.hxx)
//
//--------------------------------------------------------------------------
#include "msfhead.cxx"
#include "h/dirfunc.hxx"
#include "h/msfiter.hxx"
//+-------------------------------------------------------------------------
//
// Member: CMSFIterator::GetNext, public
//
// Synposis: Fill in a stat buffer for the next iteration entry
//
// Effects: Modifies _sidCurrent
//
// Arguments: [pstat] - Stat buffer
//
// Returns: S_OK if call completed OK.
// STG_E_NOMOREFILES if no next entry was found.
//
// Notes:
//
//---------------------------------------------------------------------------
SCODE CMSFIterator::GetNext(STATSTGW *pstat)
{
SCODE sc;
SID sidNext;
msfDebugOut((DEB_TRACE,"In CMSFIterator::GetNext()\n"));
if (_sidChildRoot == NOSTREAM)
msfChk(STG_E_NOMOREFILES);
msfChk(_pdir->FindGreaterEntry(_sidChildRoot, &_dfnCurrent, &sidNext));
// We found another child
CDirEntry *pde;
msfChk(_pdir->GetDirEntry(sidNext, FB_NONE, &pde));
pstat->type = pde->GetFlags();
//Note: The casting below assumes that DfName is always a
// wide character string. If we at some point in
// the future convert to a system where this is not
// true, this code needs to be updated.
msfChk(DfAllocWCS((WCHAR *)pde->GetName()->GetBuffer(), &pstat->pwcsName));
wcscpy(pstat->pwcsName, (WCHAR *)pde->GetName()->GetBuffer());
pstat->ctime = pde->GetTime(WT_CREATION);
pstat->mtime = pde->GetTime(WT_MODIFICATION);
//Don't currently keep access times
pstat->atime = pstat->mtime;
if ((pstat->type & STGTY_REAL) == STGTY_STORAGE)
{
ULISet32(pstat->cbSize, 0);
pstat->clsid = pde->GetClassId();
pstat->grfStateBits = pde->GetUserFlags();
}
else
{
ULISet32(pstat->cbSize, pde->GetSize());
pstat->clsid = CLSID_NULL;
pstat->grfStateBits = 0;
}
// update our iterator
_dfnCurrent.Set(pde->GetName());
_pdir->ReleaseEntry(sidNext);
msfDebugOut((DEB_TRACE,"Leaving CMSFIterator::GetNext()\n"));
// Fall through
Err:
return sc;
}
//+--------------------------------------------------------------
//
// Member: CMSFIterator::BufferGetNext, public
//
// Synopsis: Fast, fixed-size buffer version of GetNext
// for iterations that don't care about having
// full stat info and an allocated name
//
// Arguments: [pib] - Buffer to fill in
//
// Returns: Appropriate status code
//
// Modifies: [pib]
//
//---------------------------------------------------------------
SCODE CMSFIterator::BufferGetNext(SIterBuffer *pib)
{
SCODE sc;
SID sidNext;
CDirEntry *pdeNext;
msfDebugOut((DEB_ITRACE, "In CMSFIterator::BufferGetNext(%p)\n", pib));
if (_sidChildRoot == NOSTREAM)
msfChk(STG_E_NOMOREFILES);
msfChk(_pdir->FindGreaterEntry(_sidChildRoot, &_dfnCurrent, &sidNext));
msfChk(_pdir->GetDirEntry(sidNext, FB_NONE, &pdeNext));
pib->type = pdeNext->GetFlags();
pib->dfnName = *(pdeNext->GetName());
// update our iterator
_dfnCurrent.Set(pdeNext->GetName());
_pdir->ReleaseEntry(sidNext);
msfDebugOut((DEB_ITRACE, "Out CMSFIterator::BufferGetNext\n"));
// Fall through
Err:
return sc;
}