|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1992.
//
// File: tstream.hxx
//
// Contents: Transacted stream class definition
//
// Classes: CTransactedStream - Transacted stream object
// CDeltaList - Delta list object
//
// History: 23-Jan-92 PhilipLa Created.
//
//--------------------------------------------------------------------------
#ifndef __TSTREAM_HXX__
#define __TSTREAM_HXX__
#include <msf.hxx>
#include <tset.hxx>
#include <psstream.hxx>
#include <dfbasis.hxx>
#include <freelist.hxx>
#include <dl.hxx>
//+-------------------------------------------------------------------------
//
// Class: CTransactedStream (ts)
//
// Purpose: Transacted stream object
//
// Interface:
//
// History: 21-Jan-92 PhilipLa Created.
//
// Notes:
//
//--------------------------------------------------------------------------
class CTransactedStream : public PSStream, public PTSetMember, public CMallocBased {
public: inline void *operator new(size_t size, IMalloc * const pMalloc); inline void *operator new(size_t size, CDFBasis * const pdfb); inline void ReturnToReserve(CDFBasis * const pdfb);
inline static SCODE Reserve(UINT cItems, CDFBasis * const pdfb); inline static void Unreserve(UINT cItems, CDFBasis * const pdfb);
CTransactedStream(CDfName const *pdfn, DFLUID dl, DFLAGS df, #ifdef USE_NOSCRATCH
CMStream *pms, #endif
CMStream *pmsScratch); SCODE Init(PSStream *pssBase);
~CTransactedStream();
inline void DecRef(VOID); inline void AddRef () { PBasicEntry::AddRef(); }; inline void Release () { PBasicEntry::Release(); };
SCODE ReadAt( #ifdef LARGE_STREAMS
ULONGLONG ulOffset, #else
ULONG ulOffset, #endif
VOID *pBuffer, ULONG ulCount, ULONG STACKBASED *pulRetval);
SCODE WriteAt( #ifdef LARGE_STREAMS
ULONGLONG ulOffset, #else
ULONG ulOffset, #endif
VOID const *pBuffer, ULONG ulCount, ULONG STACKBASED *pulRetval);
#ifdef LARGE_STREAMS
SCODE SetSize(ULONGLONG ulNewSize);
void GetSize(ULONGLONG *pulSize); #else
SCODE SetSize(ULONG ulNewSize);
void GetSize(ULONG *pulSize); #endif
SCODE BeginCommitFromChild( #ifdef LARGE_STREAMS
ULONGLONG ulSize, #else
ULONG ulSize, #endif
CDeltaList *pDelta, CTransactedStream *pstChild);
void EndCommitFromChild(DFLAGS df, CTransactedStream *pstChild);
CDeltaList * GetDeltaList(void);
//Inherited from PTSetMember:
SCODE BeginCommit(DWORD const dwFlags); void EndCommit(DFLAGS const df); void Revert(void); #ifdef LARGE_STREAMS
void GetCommitInfo(ULONGLONG *pulRet1, ULONGLONG *pulRet2); #else
void GetCommitInfo(ULONG *pulRet1, ULONG *pulRet2); #endif
inline void EmptyCache ();
// PBasicEntry
SCODE SetBase(PSStream *psst); inline PSStream* GetBase(); inline void SetClean(void); inline void SetDirty(UINT fDirty); inline UINT GetDirty(void) const;
private:
SCODE PartialWrite( ULONG ulBasePos, ULONG ulDirtyPos, BYTE const HUGEP *pb, USHORT offset, USHORT uLen); SCODE SetInitialState(PSStream *pssBase);
#ifdef LARGE_STREAMS
ULONGLONG _ulSize; #else
ULONG _ulSize; #endif
CBasedSStreamPtr _pssBase; SECT _sectLastUsed; CDeltaList _dl; DFLAGS _df; UINT _fDirty; BOOL _fBeginCommit;
CBasedDeltaListPtr _pdlOld; #ifdef LARGE_STREAMS
ULONGLONG _ulOldSize; #else
ULONG _ulOldSize; #endif
#ifdef INDINST
DFSIGNATURE _sigOldBase; DFSIGNATURE _sigOldSelf; #endif
};
//+--------------------------------------------------------------
//
// Member: CTransactedStream::operator new, public
//
// Synopsis: Unreserved object allocator
//
// Arguments: [size] -- byte count to allocate
// [pMalloc] -- allocator
//
// History: 25-May-93 AlexT Created
//
//---------------------------------------------------------------
inline void *CTransactedStream::operator new(size_t size, IMalloc * const pMalloc) { return(CMallocBased::operator new(size, pMalloc)); }
//+--------------------------------------------------------------
//
// Member: CTransactedStream::operator new, public
//
// Synopsis: Reserved object allocator
//
// Arguments: [size] -- byte count to allocate
// [pdfb] -- basis
//
// History: 25-May-93 AlexT Created
//
//---------------------------------------------------------------
inline void *CTransactedStream::operator new(size_t size, CDFBasis * const pdfb) { olAssert(size == sizeof(CTransactedStream));
return pdfb->GetFreeList(CDFB_TRANSACTEDSTREAM)->GetReserved(); }
//+--------------------------------------------------------------
//
// Member: CTransactedStream::ReturnToReserve, public
//
// Synopsis: Reserved object return
//
// Arguments: [pdfb] -- basis
//
// History: 25-May-93 AlexT Created
//
//---------------------------------------------------------------
inline void CTransactedStream::ReturnToReserve(CDFBasis * const pdfb) { CTransactedStream::~CTransactedStream(); pdfb->GetFreeList(CDFB_TRANSACTEDSTREAM)->ReturnToReserve(this); }
//+--------------------------------------------------------------
//
// Member: CTransactedStream::Reserve, public
//
// Synopsis: Reserve instances
//
// Arguments: [cItems] -- count of items
// [pdfb] -- basis
//
// History: 25-May-93 AlexT Created
//
//---------------------------------------------------------------
inline SCODE CTransactedStream::Reserve(UINT cItems, CDFBasis * const pdfb) { return pdfb->Reserve(cItems, CDFB_TRANSACTEDSTREAM); }
//+--------------------------------------------------------------
//
// Member: CTransactedStream::Unreserve, public
//
// Synopsis: Unreserve instances
//
// Arguments: [cItems] -- count of items
// [pdfb] -- basis
//
// History: 25-May-93 AlexT Created
//
//---------------------------------------------------------------
inline void CTransactedStream::Unreserve(UINT cItems, CDFBasis * const pdfb) { pdfb->Unreserve(cItems, CDFB_TRANSACTEDSTREAM); }
//+--------------------------------------------------------------
//
// Member: CTransactedStream::GetBase, public
//
// Synopsis: Returns base; used for debug checks
//
// History: 15-Sep-92 AlexT Created
//
//---------------------------------------------------------------
inline PSStream *CTransactedStream::GetBase() { return BP_TO_P(PSStream *, _pssBase); }
//+---------------------------------------------------------------------------
//
// Member: CTransactedStream::SetClean, public
//
// Synopsis: Resets dirty flags
//
// History: 11-Nov-92 DrewB Created
//
//----------------------------------------------------------------------------
inline void CTransactedStream::SetClean(void) { _fDirty = 0; }
//+---------------------------------------------------------------------------
//
// Member: CTransactedStream::SetDirty, public
//
// Synopsis: Sets dirty flags
//
// History: 11-Nov-92 DrewB Created
//
//----------------------------------------------------------------------------
inline void CTransactedStream::SetDirty(UINT fDirty) { _fDirty |= fDirty; }
//+---------------------------------------------------------------------------
//
// Member: CTransactedStream::DecRef, public
//
// Synopsis: Decrements the ref count
//
// History: 25-Nov-92 DrewB Created
//
//----------------------------------------------------------------------------
inline void CTransactedStream::DecRef(void) { AtomicDec(&_cReferences); }
//+---------------------------------------------------------------------------
//
// Member: CTransactedStream::GetDirty, public
//
// Synopsis: Returns the dirty flags
//
// History: 17-Dec-92 DrewB Created
//
//----------------------------------------------------------------------------
inline UINT CTransactedStream::GetDirty(void) const { return _fDirty; }
//+---------------------------------------------------------------------------
//
// Member: CTransactedStream::EmptyCache, public
//
// Synopsis: Empties the stream cache
//
// History: 27-Jul-1999 HenryLee Created
//
//----------------------------------------------------------------------------
inline void CTransactedStream::EmptyCache (void) { PSStream * const pssBase = _pssBase; if (pssBase != NULL) pssBase->EmptyCache(); }
#endif //__TSTREAM_HXX__
|