285 lines
6.8 KiB
C++
285 lines
6.8 KiB
C++
//+-------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1992.
|
|
//
|
|
// File: stream.hxx
|
|
//
|
|
// Contents: Stream header for mstream project
|
|
//
|
|
// Classes: CSStream - single linear stream for MSF
|
|
//
|
|
// History: 18-Jul-91 Philipla Created.
|
|
//
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
#ifndef __STREAM_HXX__
|
|
#define __STREAM_HXX__
|
|
|
|
#include <msf.hxx>
|
|
#include <handle.hxx>
|
|
#include <tset.hxx>
|
|
#include <psstream.hxx>
|
|
#include <dfbasis.hxx>
|
|
#include <cache.hxx>
|
|
#include <dl.hxx>
|
|
|
|
|
|
//+----------------------------------------------------------------------
|
|
//
|
|
// Class: CDirectStream (ds)
|
|
//
|
|
// Purpose: Direct stream class
|
|
//
|
|
// History: 18-Jul-91 PhilipLa Created.
|
|
//
|
|
// Notes:
|
|
//
|
|
//-----------------------------------------------------------------------
|
|
|
|
class CDirectStream: public PSStream, 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);
|
|
|
|
CDirectStream(DFLUID dl);
|
|
~CDirectStream(void);
|
|
|
|
void InitSystem(CMStream *pms,
|
|
SID sid,
|
|
#ifdef LARGE_STREAMS
|
|
ULONGLONG cbSize);
|
|
#else
|
|
ULONG cbSize);
|
|
#endif
|
|
SCODE Init(CStgHandle *pstgh,
|
|
CDfName const *pdfn,
|
|
BOOL const fCreate);
|
|
|
|
inline void DecRef(VOID);
|
|
|
|
SCODE BeginCommitFromChild(
|
|
#ifdef LARGE_STREAMS
|
|
ULONGLONG ulSize,
|
|
#else
|
|
ULONG ulSize,
|
|
#endif
|
|
CDeltaList *pDelta,
|
|
CTransactedStream *pstChild);
|
|
|
|
void EndCommitFromChild(DFLAGS df,
|
|
CTransactedStream *pstChild);
|
|
|
|
CDeltaList * GetDeltaList(void);
|
|
|
|
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
|
|
|
|
// PBasicEntry
|
|
|
|
inline CStmHandle *GetHandle(void);
|
|
|
|
inline void EmptyCache (void);
|
|
|
|
private:
|
|
#ifdef SECURE_STREAMS
|
|
#ifdef LARGE_STREAMS
|
|
void ClearSects(ULONGLONG ulStartOffset, ULONGLONG ulEndOffset);
|
|
|
|
ULONGLONG _ulHighWater;
|
|
#else
|
|
void ClearSects(ULONG ulStartOffset, ULONG ulEndOffset);
|
|
|
|
ULONG _ulHighWater;
|
|
#endif
|
|
#endif
|
|
|
|
CStmHandle _stmh;
|
|
CStreamCache _stmc;
|
|
#ifdef LARGE_STREAMS
|
|
ULONGLONG _ulSize;
|
|
ULONGLONG _ulOldSize;
|
|
#else
|
|
ULONG _ulSize;
|
|
ULONG _ulOldSize;
|
|
#endif
|
|
|
|
CBasedDeltaListPtr _pdlHolder;
|
|
};
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CDirectStream::operator new, public
|
|
//
|
|
// Synopsis: Unreserved object allocator
|
|
//
|
|
// Arguments: [size] -- byte count to allocate
|
|
// [pMalloc] -- allocator
|
|
//
|
|
// History: 25-May-93 AlexT Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
inline void *CDirectStream::operator new(size_t size, IMalloc * const pMalloc)
|
|
{
|
|
return(CMallocBased::operator new(size, pMalloc));
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CDirectStream::operator new, public
|
|
//
|
|
// Synopsis: Reserved object allocator
|
|
//
|
|
// Arguments: [size] -- byte count to allocate
|
|
// [pdfb] -- basis
|
|
//
|
|
// History: 25-May-93 AlexT Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
inline void *CDirectStream::operator new(size_t size, CDFBasis * const pdfb)
|
|
{
|
|
olAssert(size == sizeof(CDirectStream));
|
|
|
|
return pdfb->GetFreeList(CDFB_DIRECTSTREAM)->GetReserved();
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CDirectStream::ReturnToReserve, public
|
|
//
|
|
// Synopsis: Reserved object return
|
|
//
|
|
// Arguments: [pdfb] -- basis
|
|
//
|
|
// History: 25-May-93 AlexT Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
inline void CDirectStream::ReturnToReserve(CDFBasis * const pdfb)
|
|
{
|
|
CDirectStream::~CDirectStream();
|
|
pdfb->GetFreeList(CDFB_DIRECTSTREAM)->ReturnToReserve(this);
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CDirectStream::Reserve, public
|
|
//
|
|
// Synopsis: Reserve instances
|
|
//
|
|
// Arguments: [cItems] -- count of items
|
|
// [pdfb] -- basis
|
|
//
|
|
// History: 25-May-93 AlexT Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
inline SCODE CDirectStream::Reserve(UINT cItems, CDFBasis * const pdfb)
|
|
{
|
|
return pdfb->Reserve(cItems, CDFB_DIRECTSTREAM);
|
|
}
|
|
|
|
//+--------------------------------------------------------------
|
|
//
|
|
// Member: CDirectStream::Unreserve, public
|
|
//
|
|
// Synopsis: Unreserve instances
|
|
//
|
|
// Arguments: [cItems] -- count of items
|
|
// [pdfb] -- basis
|
|
//
|
|
// History: 25-May-93 AlexT Created
|
|
//
|
|
//---------------------------------------------------------------
|
|
|
|
inline void CDirectStream::Unreserve(UINT cItems, CDFBasis * const pdfb)
|
|
{
|
|
pdfb->Unreserve(cItems, CDFB_DIRECTSTREAM);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CDirectStream::GetHandle, public
|
|
//
|
|
// Synopsis: Returns a pointer to the stream handle
|
|
//
|
|
// History: 25-Jun-92 DrewB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline CStmHandle *CDirectStream::GetHandle(void)
|
|
{
|
|
return &_stmh;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CDirectStream::DecRef, public
|
|
//
|
|
// Synopsis: Decrements the ref count
|
|
//
|
|
// History: 25-Nov-92 DrewB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline void CDirectStream::DecRef(void)
|
|
{
|
|
AtomicDec(&_cReferences);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CDirectStream::EmptyCache, public
|
|
//
|
|
// Synopsis: Empties the stream cache
|
|
//
|
|
// History: 27-Jul-1999 HenryLee Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline void CDirectStream::EmptyCache (void)
|
|
{
|
|
_stmc.Empty();
|
|
}
|
|
|
|
#endif //__SSTREAM_HXX__
|
|
|
|
|