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