//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1994.
//
//  File:	simpstm.hxx
//
//  Contents:	CSimpStream class
//
//  Classes:	
//
//  Functions:	
//
//  History:	04-Aug-94	PhilipLa	Created
//
//----------------------------------------------------------------------------

#ifndef __SIMPSTM_HXX__
#define __SIMPSTM_HXX__


//+---------------------------------------------------------------------------
//
//  Class:	CSimpStream
//
//  Purpose:	
//
//  Interface:	
//
//  History:	04-Aug-94	PhilipLa	Created
//
//  Notes:	
//
//----------------------------------------------------------------------------

interface CSimpStream: public IStream, public IMarshal
{
public:
    inline CSimpStream();
    inline ~CSimpStream();

    SCODE Init(CSimpStorage *pstgParent, HANDLE hFile, ULONG ulSeekStart);
    
    // From IUnknown
    STDMETHOD(QueryInterface)(REFIID iid, void **ppvObj);
    STDMETHOD_(ULONG,AddRef)(void);
    STDMETHOD_(ULONG,Release)(void);

    // New methods
    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);
    STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);
    STDMETHOD(Clone)(IStream **ppstm);

    // IMarshal
    STDMETHOD(GetUnmarshalClass)(REFIID riid,
				 LPVOID pv,
				 DWORD dwDestContext,
				 LPVOID pvDestContext,
                                 DWORD mshlflags,
				 LPCLSID pCid);
    STDMETHOD(GetMarshalSizeMax)(REFIID riid,
				 LPVOID pv,
				 DWORD dwDestContext,
				 LPVOID pvDestContext,
                                 DWORD mshlflags,
				 LPDWORD pSize);
    STDMETHOD(MarshalInterface)(IStream *pStm,
				REFIID riid,
				LPVOID pv,
				DWORD dwDestContext,
				LPVOID pvDestContext,
                                DWORD mshlflags);
    STDMETHOD(UnmarshalInterface)(IStream *pStm,
				  REFIID riid,
				  LPVOID *ppv);
    STDMETHOD(ReleaseMarshalData)(IStream *pStm);
    STDMETHOD(DisconnectObject)(DWORD dwReserved);
    
protected:
    LONG _cReferences;
    LONG _ulSeekStart;

    ULONG _ulSeekPos;
#ifdef SECURE_SIMPLE_MODE
    ULONG _ulHighWater;

#if DBG == 1
    void CheckSeekPointer(void);
#endif // DBG    
#endif // SECURE_SIMPLE_MODE

    CSimpStorage *_pstgParent;
    HANDLE _hFile;
};


//+---------------------------------------------------------------------------
//
//  Member:	CSimpStream::CSimpStream, public
//
//  Synopsis:	Constructor
//
//  History:	04-Aug-94	PhilipLa	Created
//
//----------------------------------------------------------------------------

inline CSimpStream::CSimpStream()
{
    _cReferences = 0;
    _ulSeekStart = 0;
    _pstgParent = NULL;
    _hFile = NULL;
}

//+---------------------------------------------------------------------------
//
//  Member:	CSimpStream::~CSimpStream, public
//
//  Synopsis:	Destructor
//
//  History:	04-Aug-94	PhilipLa	Created
//
//----------------------------------------------------------------------------

inline CSimpStream::~CSimpStream()
{
}

//+---------------------------------------------------------------------------
//
//  Class:  CSimpStreamOpen
//
//  Purpose:    simple stream class for simple mode read
//
//  Interface:  IStream
//
//  History:    04-Jun-96   HenryLee    Created
//
//  Notes:      does not check for reverted state if parent storage is closed
//
//----------------------------------------------------------------------------

class CSimpStreamOpen : public CSimpStream
{
public:
    inline CSimpStreamOpen();
    inline ~CSimpStreamOpen();

    SCODE Init(CSimpStorageOpen *pstgParent, HANDLE hFile,
               ULONG ulSeekStart, DWORD grfMode, CDfNameList *pdfl);
    STDMETHOD_(ULONG, Release)(void);
    STDMETHOD(Read)(VOID *pv, ULONG cb, ULONG *pcbRead);
    STDMETHOD(Write)(VOID const *pv, ULONG cb, ULONG *pcbWritten);
    STDMETHOD(SetSize)(ULARGE_INTEGER cb);
    STDMETHOD(Seek)(LARGE_INTEGER libMove, DWORD dwOrigin,
                    ULARGE_INTEGER *plibNewPosition);
    STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);

private:
    CDfNameList * _pdfl;      // back pointer to storage's name list element
    DWORD         _grfMode;   // open mode to check for write access
};

//+---------------------------------------------------------------------------
//
//  Member: CSimpStreamOpen::CSimpStreamOpen, public
//
//  Synopsis:   Constructor
//
//  History:    04-May-96   HenryLee    Created
//
//----------------------------------------------------------------------------

inline CSimpStreamOpen::CSimpStreamOpen() : _pdfl(NULL)
{
}

//+---------------------------------------------------------------------------
//
//  Member: CSimpStreamOpen::~CSimpStreamOpen, public
//
//  Synopsis:   Destructor
//
//  History:    04-May-96   HenryLee    Created
//
//----------------------------------------------------------------------------

inline CSimpStreamOpen::~CSimpStreamOpen()
{
}
    
#endif // #ifndef __SIMPSTM_HXX__