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.
 
 
 
 
 
 

276 lines
7.8 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: expst.hxx
//
// Contents: CExposedStream definition
//
// Classes: CExposedStream
//
// Notes:
// The CExposedStream class is the implementation
// of IStream. It also inherits from CMappedStream and provides
// the neccessary virtual functions to handle property set
// functions.
//
// Note that this interface is solely UNICODE, the ASCII layer
// support which is present if _UNICODE is not defined, provides
// the overloaded functions that handles the ASCII to Unicode
// conversion.
//
//--------------------------------------------------------------------------
#ifndef __EXPST_HXX__
#define __EXPST_HXX__
#include "h/dfmsp.hxx"
#include "expdf.hxx"
#include "h/sstream.hxx"
#ifdef NEWPROPS
#include "props/h/windef.h"
#include "h/propstm.hxx"
#endif // NEWPROPS
interface ILockBytes;
class CMappedStream;
//+--------------------------------------------------------------
//
// Class: CExposedStream (est)
//
// Purpose: Exposed stream interface
//
// Interface: See below
//
// Note: PRevertable is a general virtual class base that
// handles updates to the storage elements. E.g.
// when an IStorage parent is deleted, the children
// underneadth them will have the reverted state.
//
//---------------------------------------------------------------
interface CExposedStream
: public IStream,
#ifdef NEWPROPS
public CMappedStream,
#endif
public PRevertable
{
public:
CExposedStream();
SCODE Init(CDirectStream *pst,
CExposedDocFile* pdfParent,
const DFLAGS df,
const CDfName *pdfn,
const ULONGLONG ulPos);
inline ~CExposedStream(void);
// From IUnknown
STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj);
STDMETHOD_(ULONG,AddRef)(void);
STDMETHOD_(ULONG,Release)(void);
// IStream
STDMETHOD(Read)(VOID HUGEP *pv,
ULONG cb,
ULONG *pcbRead);
STDMETHOD(Write)(VOID const HUGEP *pv,
ULONG cb,
ULONG *pcbWritten);
STDMETHOD(Seek)(LARGE_INTEGER dlibMove,
DWORD dwOrigin,
ULARGE_INTEGER *plibNewPosition);
STDMETHOD(SetSize)(ULARGE_INTEGER cb);
STDMETHOD(CopyTo)(IStream *pstm,
ULARGE_INTEGER cb,
ULARGE_INTEGER *pcbRead,
ULARGE_INTEGER *pcbWritten);
STDMETHOD(Commit)(DWORD grfCommitFlags);
STDMETHOD(Revert)(void);
STDMETHOD(LockRegion)(ULARGE_INTEGER libOffset,
ULARGE_INTEGER cb,
DWORD dwLockType);
STDMETHOD(UnlockRegion)(ULARGE_INTEGER libOffset,
ULARGE_INTEGER cb,
DWORD dwLockType);
#ifndef _UNICODE
STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);
#endif
STDMETHOD_(SCODE,Stat)(STATSTGW *pstatstg, DWORD grfStatFlag);
STDMETHOD(Clone)(IStream **ppstm);
#ifdef NEWPROPS
public:
VOID Open(/*IN*/ VOID *powner, /*OUT*/ LONG *phr);
VOID Close(/* OUT */ LONG *phr);
VOID ReOpen(/*IN OUT*/ VOID **ppv, /*OUT*/ LONG *phr);
VOID Quiesce(VOID);
VOID Map(BOOLEAN fCreate, VOID **ppv);
VOID Unmap(BOOLEAN fFlush, VOID **pv);
VOID Flush(/*OUT*/ LONG *phr);
ULONG GetSize( /*OUT*/ LONG *phr);
VOID SetSize(ULONG cb, BOOLEAN fPersistent, VOID **ppv,
/*OUT*/ LONG *phr);
VOID QueryTimeStamps(STATPROPSETSTG *pspss, BOOLEAN fNonSimple) const;
BOOLEAN QueryModifyTime(/*OUT*/ LONGLONG *pll) const;
BOOLEAN QuerySecurity(/*OUT*/ ULONG *pul) const;
BOOLEAN IsWriteable(VOID) const;
BOOLEAN IsModified(VOID) const;
VOID SetModified(VOID);
HANDLE GetHandle(VOID) const;
#if DBGPROP
BOOLEAN SetChangePending(BOOLEAN fChangePending);
BOOLEAN IsNtMappedStream(VOID) const;
#endif // #if DBGPROP
#if DBG
inline ULONG BytesCommitted(VOID) { return _cbUsed; }
VOID DfpdbgFillUnusedMemory(VOID);
VOID DfpdbgCheckUnusedMemory(VOID);
#else
VOID DfpdbgFillUnusedMemory(VOID) {}
VOID DfpdbgCheckUnusedMemory(VOID) {}
#endif // DBG
private:
HRESULT Write(VOID);
#endif // #ifdef NEWPROPS
public:
inline SCODE Validate(void) const;
inline CDirectStream *GetDirectStream(void) const;
inline SCODE GetSize(ULONGLONG *pcb);
SCODE SetSize(ULONGLONG cb);
inline void SetDirty(void)
{ _fDirty = TRUE; }
// PRevertable
virtual void RevertFromAbove(void);
inline SCODE CheckReverted(void) const;
#ifdef NEWPROPS
virtual SCODE FlushBufferedData();
#endif
private:
CDirectStream *_pst;
CExposedDocFile *_pdfParent;
ULONG _ulAccessLockBase;
ULONG _sig;
LONG _cReferences;
ULONGLONG _ulPos;
BOOL _fDirty;
#ifdef NEWPROPS
private:
BYTE *_pb;
BYTE *_powner; // owner of this mapped stream
ULONG _cbUsed;
ULONG _cbOriginalStreamSize;
BOOL _fChangePending;
#endif
};
#define CEXPOSEDSTREAM_SIG LONGSIG('E', 'X', 'S', 'T')
#define CEXPOSEDSTREAM_SIGDEL LONGSIG('E', 'x', 'S', 't')
//+--------------------------------------------------------------
//
// Member: CExposedStream::Validate, public
//
// Synopsis: Validates the object signature
//
// Returns: Returns STG_E_INVALIDHANDLE for bad signatures
//
//---------------------------------------------------------------
inline SCODE CExposedStream::Validate(void) const
{
return (this == NULL || _sig != CEXPOSEDSTREAM_SIG) ?
STG_E_INVALIDHANDLE : S_OK;
}
//+--------------------------------------------------------------
//
// Member: CExposedStream::GetPub, public
//
// Synopsis: Returns the public
//
//---------------------------------------------------------------
inline CDirectStream *CExposedStream::GetDirectStream(void) const
{
return _pst;
}
//+--------------------------------------------------------------
//
// Member: CExposedStream::GetSize, public
//
// Synopsis: Gets the size of the stream
//
// Arguments: [pcb] - Stream size return
//
// Returns: Appropriate status code
//
// Modifies: [pcb]
//
//---------------------------------------------------------------
inline SCODE CExposedStream::GetSize(ULONGLONG *pcb)
{
SCODE sc;
if (SUCCEEDED(sc = CheckReverted()))
_pst->GetSize(pcb);
return sc;
}
//+--------------------------------------------------------------
//
// Member: CExposedStream::CheckReverted, public
//
// Synopsis: Returns revertedness
//
//---------------------------------------------------------------
inline SCODE CExposedStream::CheckReverted(void) const
{
return P_REVERTED(_df) ? STG_E_REVERTED : S_OK;
}
//+--------------------------------------------------------------
//
// Member: CExposedStream::~CExposedStream, public
//
// Synopsis: Destructor
//
// Returns: Appropriate status code
////---------------------------------------------------------------
inline CExposedStream::~CExposedStream(void)
{
olDebugOut((DEB_ITRACE, "In CExposedStream::~CExposedStream\n"));
olAssert(_cReferences == 0);
_sig = CEXPOSEDSTREAM_SIGDEL;
if (SUCCEEDED(CheckReverted()))
{
if (_pdfParent) _pdfParent->ReleaseChild(this);
if (_pst) _pst->Release();
}
#ifdef NEWPROPS
delete[] _pb;
_pb = NULL;
_powner = NULL;
#endif
olDebugOut((DEB_ITRACE, "Out CExposedStream::~CExposedStream\n"));
}
#endif // #ifndef __EXPST_HXX__