Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

106 lines
2.6 KiB

#pragma once
///////////////////////////////////////////////////////////////////////////////
// Memory stream implementations for DS OLE DB PROVIDER
//
// copied from cdopt\src\cdo\mystream.* and modified.
class ATL_NO_VTABLE CStreamMem :
INHERIT_TRACKING,
public CComObjectRootEx<CComMultiThreadModel>,
public IStream,
public IGetSourceRow
{
public:
DECLARE_GET_CONTROLLING_UNKNOWN()
BEGIN_COM_MAP(CStreamMem)
COM_INTERFACE_ENTRY(IStream)
COM_INTERFACE_ENTRY(ISequentialStream)
COM_INTERFACE_ENTRY(IGetSourceRow)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
END_COM_MAP()
HRESULT FinalConstruct()
{
RRETURN( CoCreateFreeThreadedMarshaler(
GetControllingUnknown(), &m_pUnkMarshaler.p));
}
void FinalRelease()
{
m_pUnkMarshaler.Release();
}
CComPtr<IUnknown> m_pUnkMarshaler;
private:
auto_cs m_cs; // critical section
ULONG m_cbSeek;
STATSTG m_statstg;
CComVariant m_pVar;
auto_rel<IRow> m_pSourceRow;
HROW m_hRow;
PVOID m_pvData;
DWORD m_cbBufferSize;
bool m_fExternalData;
public:
CStreamMem(void);
~CStreamMem(void);
//internal methods
HRESULT Initialize(VARIANT *pVar, IRow* pSourceRow, HROW hRow);
// IStream
STDMETHODIMP Read(
void __RPC_FAR *pv,
ULONG cb,
ULONG __RPC_FAR *pcbRead);
STDMETHODIMP Write(
const void __RPC_FAR *pv,
ULONG cb,
ULONG __RPC_FAR *pcbWritten);
STDMETHODIMP Seek(
LARGE_INTEGER dlibMove,
DWORD dwOrigin,
ULARGE_INTEGER __RPC_FAR *plibNewPosition);
STDMETHODIMP SetSize(
ULARGE_INTEGER libNewSize);
STDMETHODIMP CopyTo(
IStream __RPC_FAR *pstm,
ULARGE_INTEGER cb,
ULARGE_INTEGER __RPC_FAR *pcbRead,
ULARGE_INTEGER __RPC_FAR *pcbWritten);
STDMETHODIMP Commit(
DWORD grfCommitFlags);
STDMETHODIMP Revert( void);
STDMETHODIMP LockRegion(
ULARGE_INTEGER libOffset,
ULARGE_INTEGER cb,
DWORD dwLockType);
STDMETHODIMP UnlockRegion(
ULARGE_INTEGER libOffset,
ULARGE_INTEGER cb,
DWORD dwLockType);
STDMETHODIMP Stat(
STATSTG __RPC_FAR *pstatstg,
DWORD grfStatFlag);
STDMETHODIMP Clone(
IStream __RPC_FAR *__RPC_FAR *ppstm);
//IGetSourceRow
STDMETHODIMP GetSourceRow(REFIID riid, IUnknown **ppRow);
};