Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

136 lines
3.1 KiB

/*
* D I R I T E R . C P P
*
* Sources for directory ineration object
*
* Copyright 1986-1997 Microsoft Corporation, All Rights Reserved
*/
#include "_davfs.h"
DEC_CONST WCHAR gc_wszGlobbing[] = L"**";
DEC_CONST UINT gc_cchwszGlobbing = CElems(gc_wszGlobbing) - 1;
// CDirState -----------------------------------------------------------------
//
SCODE
CDirState::ScFindNext (void)
{
SCODE sc = S_OK;
// If the find has not yet been established, then
// do so here
//
if (m_hFind == INVALID_HANDLE_VALUE)
{
// Establish the find handle
//
m_rpPathSrc.Extend (gc_wszGlobbing, gc_cchwszGlobbing, FALSE);
if (FALSE == DavFindFirstFile(m_rpPathSrc.PszPath(), &m_hFind, &m_fd))
{
sc = HRESULT_FROM_WIN32(GetLastError());
goto ret;
}
}
else
{
// Just find the next file
//
if (!FindNextFileW (m_hFind, &m_fd))
{
sc = S_FALSE;
goto ret;
}
}
// Extend the resource paths with the new values
//
Extend (m_fd);
ret:
return sc;
}
// CDirIter ------------------------------------------------------------------
//
SCODE
CDirIter::ScGetNext(
/* [in] */ BOOL fSubDirectoryAccess,
/* [in] */ LPCWSTR pwszNewDestinationPath,
/* [in] */ CVRoot* pvrDestinationTranslation)
{
SCODE sc = S_OK;
// If the current item is a directory, and we intend to
// do subdirectory iteration, then go ahead and try and
// push our context down to the child directory
//
if (m_fSubDirectoryIteration &&
fSubDirectoryAccess &&
FDirectory() &&
!FSpecial())
{
// Add a reference to the current directory state
// and push it onto the stack
//
m_pds->AddRef();
m_stack.push_back (m_pds.get());
// Replace the current directory state with the new one
//
m_pds = new CDirState (m_sbUriSrc,
m_sbPathSrc,
m_sbUriDst,
pwszNewDestinationPath
? pwszNewDestinationPath
: m_pds->PwszDestination(),
pvrDestinationTranslation
? pvrDestinationTranslation
: m_pds->PvrDestination(),
m_fd);
}
// Find the next file in the current context
//
sc = m_pds->ScFindNext();
// If S_FALSE was returned, then there were no more
// resources to process within the current context.
// Pop the previous context off the stack and use it
//
while ((S_OK != sc) && !m_stack.empty())
{
// Get a reference to the topmost context on the
// stack and pop it off
//
m_pds = const_cast<CDirState*>(m_stack.back());
m_stack.pop_back();
// Release the reference held by the stack
//
m_pds->Release();
// Clear and/or reset the find data
//
memset (&m_fd, 0, sizeof(WIN32_FIND_DATAW));
// See if this context had anything left
//
sc = m_pds->ScFindNext();
}
// If we have completely exhausted the files to process
// or encountered another error, make sure that we are
// not holding onto anything still!
//
if (sc != S_OK)
{
// This should perform the last release of anything
// we still have open.
//
m_pds.clear();
}
return sc;
}