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