|
|
//--------------------------------------------------------------------------
// Stream.h
//--------------------------------------------------------------------------
#pragma once
//--------------------------------------------------------------------------
// Forward Decls
//--------------------------------------------------------------------------
#include "database.h"
//--------------------------------------------------------------------------
// CDatabaseStream
//--------------------------------------------------------------------------
class CDatabaseStream : public IDatabaseStream { public: //----------------------------------------------------------------------
// Construction
//----------------------------------------------------------------------
CDatabaseStream(CDatabase *pDB, STREAMINDEX iStream, ACCESSTYPE tyAccess, FILEADDRESS faStart) : m_iStream(iStream), m_faStart(faStart), m_tyAccess(tyAccess) { TraceCall("CDatabaseStream::CDatabaseStream"); m_cRef = 1; m_cbOffset = 0; m_iCurrent = 0; m_cbCurrent = 0; m_faCurrent = m_faStart; m_pDB = pDB; m_pDB->AddRef(); } //----------------------------------------------------------------------
// De-construction
//----------------------------------------------------------------------
~CDatabaseStream(void) { TraceCall("CDatabaseStream::~CDatabaseStream"); m_pDB->StreamRelease(this); m_pDB->Release(); }
//----------------------------------------------------------------------
// IUnknown Members
//----------------------------------------------------------------------
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { TraceCall("CDatabaseStream::QueryInterface"); *ppv = NULL; if (IID_IUnknown == riid) *ppv = (IUnknown *)(IDatabaseStream *)this; else if (IID_IStream == riid) *ppv = (IStream *)this; else if (IID_IDatabaseStream == riid) *ppv = (IDatabaseStream *)this; else if (IID_CDatabaseStream == riid) *ppv = (CDatabaseStream *)this; else return TraceResult(E_NOINTERFACE); ((IUnknown *)*ppv)->AddRef(); return S_OK; }
//----------------------------------------------------------------------
// IStream::AddRef
//----------------------------------------------------------------------
STDMETHODIMP_(ULONG) AddRef(void) { TraceCall("CDatabaseStream::AddRef"); return InterlockedIncrement(&m_cRef); }
//----------------------------------------------------------------------
// IStream::Release
//----------------------------------------------------------------------
STDMETHODIMP_(ULONG) Release(void) { TraceCall("CDatabaseStream::Release"); LONG cRef = InterlockedDecrement(&m_cRef); if (0 == cRef) delete this; return (ULONG)cRef; }
//----------------------------------------------------------------------
// IStream::Read
//----------------------------------------------------------------------
STDMETHODIMP Read(LPVOID pvData, ULONG cbWanted, ULONG *pcbRead) { TraceCall("CDatabaseStream::Read"); return m_pDB->StreamRead(this, pvData, cbWanted, pcbRead); }
//----------------------------------------------------------------------
// IStream::Write
//----------------------------------------------------------------------
STDMETHODIMP Write(const void *pvData, ULONG cb, ULONG *pcbWritten) { TraceCall("CDatabaseStream::Write"); return m_pDB->StreamWrite(this, pvData, cb, pcbWritten); }
//----------------------------------------------------------------------
// IStream::Seek
//----------------------------------------------------------------------
STDMETHODIMP Seek(LARGE_INTEGER liMove, DWORD dwOrigin, ULARGE_INTEGER *pulNew) { TraceCall("CDatabaseStream::Seek"); return m_pDB->StreamSeek(this, liMove, dwOrigin, pulNew); }
//----------------------------------------------------------------------
// CDatabaseStream::GetFileAddress
//----------------------------------------------------------------------
STDMETHODIMP GetFileAddress(LPFILEADDRESS pfaStream) { TraceCall("CDatabaseStream::GetFileAddress"); return m_pDB->GetStreamAddress(this, pfaStream); }
//----------------------------------------------------------------------
// CDatabaseStream::CompareDatabase
//----------------------------------------------------------------------
STDMETHODIMP CompareDatabase(IDatabase *pDatabase) { TraceCall("CDatabaseStream::CompareDatabase"); return m_pDB->StreamCompareDatabase(this, pDatabase); }
//----------------------------------------------------------------------
// Not Implemented IStream Methods
//----------------------------------------------------------------------
STDMETHODIMP SetSize(ULARGE_INTEGER uliSize) { return E_NOTIMPL; } STDMETHODIMP Commit(DWORD) { return S_OK; } STDMETHODIMP CopyTo(LPSTREAM, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*) { return E_NOTIMPL; } STDMETHODIMP Revert(void) { return E_NOTIMPL; } STDMETHODIMP LockRegion(ULARGE_INTEGER, ULARGE_INTEGER,DWORD) { return E_NOTIMPL; } STDMETHODIMP UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { return E_NOTIMPL; } STDMETHODIMP Stat(STATSTG *, DWORD) { return E_NOTIMPL; } STDMETHODIMP Clone(LPSTREAM*) { return E_NOTIMPL; }
private: //----------------------------------------------------------------------
// Private Data
//----------------------------------------------------------------------
LONG m_cRef; STREAMINDEX m_iStream; FILEADDRESS m_faStart; ACCESSTYPE m_tyAccess; DWORD m_iCurrent; DWORD m_faCurrent; DWORD m_cbCurrent; DWORD m_cbOffset; CDatabase *m_pDB;
//----------------------------------------------------------------------
// Private Friend
//----------------------------------------------------------------------
friend CDatabase; };
|