1 2/* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#ifndef SkIStream_DEFINED 11#define SkIStream_DEFINED 12 13#include "SkTypes.h" 14 15#ifdef SK_BUILD_FOR_WIN 16 17#define WIN32_LEAN_AND_MEAN 18#include <windows.h> 19#include <ole2.h> 20 21class SkStream; 22class SkWStream; 23 24/** 25 * A bare IStream implementation which properly reference counts 26 * but returns E_NOTIMPL for all ISequentialStream and IStream methods. 27 */ 28class SkBaseIStream : public IStream { 29private: 30 LONG _refcount; 31 32protected: 33 explicit SkBaseIStream(); 34 virtual ~SkBaseIStream(); 35 36public: 37 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid 38 , void ** ppvObject); 39 virtual ULONG STDMETHODCALLTYPE AddRef(void); 40 virtual ULONG STDMETHODCALLTYPE Release(void); 41 42 // ISequentialStream Interface 43public: 44 virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead); 45 46 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv 47 , ULONG cb 48 , ULONG* pcbWritten); 49 50 // IStream Interface 51public: 52 virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER); 53 54 virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream* 55 , ULARGE_INTEGER 56 , ULARGE_INTEGER* 57 , ULARGE_INTEGER*); 58 59 virtual HRESULT STDMETHODCALLTYPE Commit(DWORD); 60 61 virtual HRESULT STDMETHODCALLTYPE Revert(void); 62 63 virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER 64 , ULARGE_INTEGER 65 , DWORD); 66 67 virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER 68 , ULARGE_INTEGER 69 , DWORD); 70 71 virtual HRESULT STDMETHODCALLTYPE Clone(IStream **); 72 73 virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove 74 , DWORD dwOrigin 75 , ULARGE_INTEGER* lpNewFilePointer); 76 77 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg 78 , DWORD grfStatFlag); 79}; 80 81/** 82 * A minimal read-only IStream implementation which wraps an SkStream. 83 */ 84class SkIStream : public SkBaseIStream { 85private: 86 SkStream *fSkStream; 87 const bool fDeleteOnRelease; 88 ULARGE_INTEGER fLocation; 89 90 SkIStream(SkStream* stream, bool fDeleteOnRelease); 91 virtual ~SkIStream(); 92 93public: 94 HRESULT static CreateFromSkStream(SkStream* stream 95 , bool fDeleteOnRelease 96 , IStream ** ppStream); 97 98 virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead); 99 100 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv 101 , ULONG cb 102 , ULONG* pcbWritten); 103 104 virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove 105 , DWORD dwOrigin 106 , ULARGE_INTEGER* lpNewFilePointer); 107 108 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg 109 , DWORD grfStatFlag); 110}; 111 112/** 113 * A minimal write-only IStream implementation which wraps an SkWIStream. 114 */ 115class SkWIStream : public SkBaseIStream { 116private: 117 SkWStream *fSkWStream; 118 119 SkWIStream(SkWStream* stream); 120 virtual ~SkWIStream(); 121 122public: 123 HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream); 124 125 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv 126 , ULONG cb 127 , ULONG* pcbWritten); 128 129 virtual HRESULT STDMETHODCALLTYPE Commit(DWORD); 130 131 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg 132 , DWORD grfStatFlag); 133}; 134 135#endif // SK_BUILD_FOR_WIN 136#endif // SkIStream_DEFINED 137