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.
|
|
/*++
Copyright (c) 1990-1998, Microsoft Corporation All rights reserved.
Module Name:
tlog.cpp
Abstract:
This module implements the travel log functionality for file open and save as dialogs.
Revision History: 02-20-98 arulk created
--*/
// precompiled headers
#include "precomp.h"
#pragma hdrstop
#include "util.h"
#include "d32tlog.h"
//-------------------------------------------------------------------------
// Travel Log Link implementation
//-------------------------------------------------------------------------
TLogLink::TLogLink() :_cRef(1), _pidl(NULL), _ptllNext(NULL), _ptllPrev(NULL) { }
TLogLink::TLogLink(LPITEMIDLIST pidl) :_cRef(1), _pidl(NULL), _ptllNext(NULL), _ptllPrev(NULL) { _pidl = ILClone(pidl); }
TLogLink::~TLogLink() { if (_pidl) { ILFree(_pidl); }
if (_ptllNext) { _ptllNext->Release(); } }
UINT TLogLink::AddRef() { return ++_cRef; }
UINT TLogLink::Release() { if (--_cRef > 0) { return _cRef; }
delete this; return 0; }
void TLogLink::SetNextLink(TLogLink* ptllNext) { //Do we already have Next Link ?
if (_ptllNext) { // Release the next link
_ptllNext->Release(); }
//Set the given pointer as our next pointer
_ptllNext = ptllNext;
if (_ptllNext) { //Since we are caching the pointer , Add reference to it
_ptllNext->AddRef();
//Also update the prev link of our new pointer to point to us
_ptllNext->_ptllPrev = this; } }
HRESULT TLogLink::GetPidl(LPITEMIDLIST* ppidl) { *ppidl = ILClone(_pidl); if (*ppidl) return NOERROR; else { return E_OUTOFMEMORY; } }
HRESULT TLogLink::SetPidl(LPITEMIDLIST pidl) { if (_pidl) { ILFree(_pidl); } _pidl = ILClone(pidl); return NOERROR; }
BOOL TLogLink::CanTravel(int iDir) { BOOL fRet = FALSE; switch ( iDir ) { case ( TRAVEL_BACK ) : { if (_ptllPrev != NULL) { fRet = TRUE; } break; }
case ( TRAVEL_FORWARD ) : { if (_ptllNext !=NULL) { fRet = TRUE; } break; } }
return fRet; }
//----------------------------------------------------------------------------------
//Travel Log Class Implementation
//----------------------------------------------------------------------------------
TravelLog::TravelLog() :_cRef(1),_ptllCurrent(NULL), _ptllRoot(NULL) { }
TravelLog::~TravelLog() { if (_ptllRoot) { _ptllRoot->Release(); } }
UINT TravelLog::AddRef() { return ++_cRef; }
UINT TravelLog::Release() { if (--_cRef > 0 ) return _cRef;
delete this; return 0; }
HRESULT TravelLog::AddEntry(LPITEMIDLIST pidl) { TLogLink *ptll = new TLogLink(pidl); if (!ptll) return E_FAIL;
if (_ptllCurrent) { _ptllCurrent->SetNextLink(ptll); ptll->Release(); } else { _ptllRoot = ptll; }
_ptllCurrent = ptll; return NOERROR; }
BOOL TravelLog::CanTravel(int iDir) { if (_ptllCurrent) { return _ptllCurrent->CanTravel(iDir); } return FALSE; }
HRESULT TravelLog::Travel(int iDir) { HRESULT hres = E_FAIL; TLogLink *ptll; switch(iDir) { case ( TRAVEL_FORWARD ) : { if (CanTravel(iDir)) { ptll = _ptllCurrent->GetNextLink(); _ptllCurrent = ptll; hres = NOERROR; } break;
}
case ( TRAVEL_BACK ): { if (CanTravel(iDir)) { ptll = _ptllCurrent->GetPrevLink(); _ptllCurrent = ptll; hres = NOERROR; } break;
} }
return hres; }
HRESULT TravelLog::GetCurrent(LPITEMIDLIST *ppidl) { //Set the return value. Just in case
*ppidl = NULL; if (_ptllCurrent) { return _ptllCurrent->GetPidl(ppidl); } return E_FAIL; }
HRESULT Create_TravelLog(TravelLog **pptlog) { HRESULT hres = E_FAIL; *pptlog = new TravelLog();
if (*pptlog) { hres = S_OK; }
return hres; }
|