/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkIStream_DEFINED #define SkIStream_DEFINED #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <ole2.h> class SkStream; class SkWStream; /** * A bare IStream implementation which properly reference counts * but returns E_NOTIMPL for all ISequentialStream and IStream methods. */ class SkBaseIStream : public IStream { private: LONG _refcount; protected: explicit SkBaseIStream(); virtual ~SkBaseIStream(); public: virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid , void ** ppvObject); virtual ULONG STDMETHODCALLTYPE AddRef(void); virtual ULONG STDMETHODCALLTYPE Release(void); // ISequentialStream Interface public: virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead); virtual HRESULT STDMETHODCALLTYPE Write(void const* pv , ULONG cb , ULONG* pcbWritten); // IStream Interface public: virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER); virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream* , ULARGE_INTEGER , ULARGE_INTEGER* , ULARGE_INTEGER*); virtual HRESULT STDMETHODCALLTYPE Commit(DWORD); virtual HRESULT STDMETHODCALLTYPE Revert(void); virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER , ULARGE_INTEGER , DWORD); virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER , ULARGE_INTEGER , DWORD); virtual HRESULT STDMETHODCALLTYPE Clone(IStream **); virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove , DWORD dwOrigin , ULARGE_INTEGER* lpNewFilePointer); virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg , DWORD grfStatFlag); }; /** * A minimal read-only IStream implementation which wraps an SkIStream. */ class SkIStream : public SkBaseIStream { private: SkStream *fSkStream; bool fUnrefOnRelease; ULARGE_INTEGER fLocation; SkIStream(SkStream* stream, bool unrefOnRelease); virtual ~SkIStream(); public: HRESULT static CreateFromSkStream(SkStream* stream , bool unrefOnRelease , IStream ** ppStream); virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead); virtual HRESULT STDMETHODCALLTYPE Write(void const* pv , ULONG cb , ULONG* pcbWritten); virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove , DWORD dwOrigin , ULARGE_INTEGER* lpNewFilePointer); virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg , DWORD grfStatFlag); }; /** * A minimal write-only IStream implementation which wraps an SkWIStream. */ class SkWIStream : public SkBaseIStream { private: SkWStream *fSkWStream; SkWIStream(SkWStream* stream); virtual ~SkWIStream(); public: HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream); virtual HRESULT STDMETHODCALLTYPE Write(void const* pv , ULONG cb , ULONG* pcbWritten); virtual HRESULT STDMETHODCALLTYPE Commit(DWORD); virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg , DWORD grfStatFlag); }; #endif