OLD | NEW |
| (Empty) |
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 "../../private/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 | |
OLD | NEW |