|  |  | 
|  | /* | 
|  | * 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 |