159 lines
4.5 KiB
C++
159 lines
4.5 KiB
C++
/******************************************************************************
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
pfstm.h
|
|
|
|
Abstract:
|
|
This file contains the definitions of various stream objects
|
|
|
|
Revision History:
|
|
created derekm 01/19/00
|
|
|
|
******************************************************************************/
|
|
|
|
#ifndef PFSTM_H
|
|
#define PFSTM_H
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include "util.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CStreamBase
|
|
|
|
class CPFStreamBase :
|
|
public IStream,
|
|
public CPFGenericClassBase
|
|
{
|
|
private:
|
|
DWORD m_cRef;
|
|
|
|
public:
|
|
CPFStreamBase(void) { m_cRef = 0; }
|
|
virtual ~CPFStreamBase(void) {}
|
|
|
|
// IUnknown Interface
|
|
STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppv)
|
|
{
|
|
if (ppv == NULL)
|
|
return E_INVALIDARG;
|
|
|
|
*ppv = NULL;
|
|
|
|
if (riid == IID_IUnknown)
|
|
*ppv = (IUnknown *)this;
|
|
else if (riid == IID_IStream)
|
|
*ppv = (IStream *)this;
|
|
else if (riid == IID_ISequentialStream)
|
|
*ppv = (ISequentialStream *)this;
|
|
else
|
|
return E_NOINTERFACE;
|
|
|
|
this->AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
STDMETHOD_(ULONG, AddRef)()
|
|
{
|
|
return InterlockedIncrement((LONG *)&m_cRef);
|
|
}
|
|
|
|
STDMETHOD_(ULONG, Release)()
|
|
{
|
|
if (InterlockedDecrement((LONG *)&m_cRef) == 0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
return m_cRef;
|
|
}
|
|
|
|
// ISequentialStream Interface
|
|
STDMETHOD(Read)(void *pv, ULONG cb, LONG *pcbRead) { return E_NOTIMPL; }
|
|
STDMETHOD(Write)(const void *pv, ULONG cb, ULONG *pcbWritten) { return E_NOTIMPL; }
|
|
|
|
// IStream Interface
|
|
STDMETHOD(Seek)(LARGE_INTEGER libMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition ) { return E_NOTIMPL; }
|
|
STDMETHOD(SetSize)(ULARGE_INTEGER libNewSize) { return E_NOTIMPL; }
|
|
STDMETHOD(CopyTo)(IStream *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten ) { return E_NOTIMPL; }
|
|
STDMETHOD(Commit)(DWORD grfCommitFlags) { return E_NOTIMPL; }
|
|
STDMETHOD(Revert)(void) { return E_NOTIMPL; }
|
|
STDMETHOD(LockRegion)(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType ) { return E_NOTIMPL; }
|
|
STDMETHOD(UnlockRegion)(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType ) { return E_NOTIMPL; }
|
|
STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag) { return E_NOTIMPL; }
|
|
STDMETHOD(Clone)(IStream **ppstm) { return E_NOTIMPL; }
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CPFStreamFile
|
|
|
|
class CPFStreamFile : public CPFStreamBase
|
|
{
|
|
private:
|
|
// member data
|
|
HANDLE m_hFile;
|
|
DWORD m_dwAccess;
|
|
|
|
public:
|
|
CPFStreamFile(void);
|
|
~CPFStreamFile(void);
|
|
|
|
static CPFStreamFile *CreateInstance(void) { return new CPFStreamFile; }
|
|
|
|
HRESULT Open(LPCWSTR szFile, DWORD dwAccess, DWORD dwDisposition,
|
|
DWORD dwSharing);
|
|
HRESULT Open(HANDLE hFile, DWORD dwAccess);
|
|
HRESULT Close(void);
|
|
|
|
// ISequentialStream Interface
|
|
STDMETHOD(Read)(void *pv, ULONG cb, ULONG *pcbRead);
|
|
STDMETHOD(Write)(const void *pv, ULONG cb, ULONG *pcbWritten);
|
|
|
|
// IStream Interface
|
|
STDMETHOD(Seek)(LARGE_INTEGER libMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition);
|
|
STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);
|
|
STDMETHOD(Clone)(IStream **ppstm);
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CStreamMem
|
|
|
|
class CPFStreamMem : public CPFStreamBase
|
|
{
|
|
LPVOID m_pvData;
|
|
LPVOID m_pvPtr;
|
|
DWORD m_cb;
|
|
DWORD m_cbRead;
|
|
DWORD m_cbWrite;
|
|
DWORD m_cbGrow;
|
|
|
|
public:
|
|
CPFStreamMem(void);
|
|
~CPFStreamMem(void);
|
|
|
|
static CPFStreamMem *CreateInstance(void) { return new CPFStreamMem; }
|
|
|
|
HRESULT Init(DWORD cbStart = (DWORD)-1, DWORD cbGrowBy = (DWORD)-1);
|
|
HRESULT InitBinBlob(LPVOID pv, DWORD cb, DWORD cbGrowBy = 0);
|
|
HRESULT InitTextBlob(LPCWSTR wsz, DWORD cch, BOOL fConvertToANSI);
|
|
HRESULT InitTextBlob(LPCSTR sz, DWORD cch, BOOL fConvertToWCHAR);
|
|
HRESULT Clean(void);
|
|
|
|
// ISequentialStream Interface
|
|
STDMETHOD(Read)(void *pv, ULONG cb, ULONG *pcbRead);
|
|
STDMETHOD(Write)(const void *pv, ULONG cb, ULONG *pcbWritten);
|
|
|
|
// IStream Interface
|
|
STDMETHOD(Seek)(LARGE_INTEGER libMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition);
|
|
STDMETHOD(Stat)(STATSTG *pstatstg, DWORD grfStatFlag);
|
|
STDMETHOD(Clone)(IStream **ppstm);
|
|
};
|
|
|
|
#endif |