blob: bc8aff556098c63ad866433e160f12fe8cc47257 [file] [log] [blame]
bungeman@google.com9df621d2011-06-23 21:43:52 +00001/*
2 Copyright 2011 Google Inc.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17#ifndef SkIStream_DEFINED
18#define SkIStream_DEFINED
19
20#define WIN32_LEAN_AND_MEAN
21#include <Windows.h>
22#include <ole2.h>
23
24class SkStream;
25class SkWStream;
26
27/**
28 * A bare IStream implementation which properly reference counts
29 * but returns E_NOTIMPL for all ISequentialStream and IStream methods.
30 */
31class SkBaseIStream : public IStream {
32private:
33 LONG _refcount;
34
35protected:
36 explicit SkBaseIStream();
37 virtual ~SkBaseIStream();
38
39public:
40 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid
41 , void ** ppvObject);
42 virtual ULONG STDMETHODCALLTYPE AddRef(void);
43 virtual ULONG STDMETHODCALLTYPE Release(void);
44
45 // ISequentialStream Interface
46public:
47 virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
48
49 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
50 , ULONG cb
51 , ULONG* pcbWritten);
52
53 // IStream Interface
54public:
55 virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER);
56
57 virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*
58 , ULARGE_INTEGER
59 , ULARGE_INTEGER*
60 , ULARGE_INTEGER*);
61
62 virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
63
64 virtual HRESULT STDMETHODCALLTYPE Revert(void);
65
66 virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER
67 , ULARGE_INTEGER
68 , DWORD);
69
70 virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER
71 , ULARGE_INTEGER
72 , DWORD);
73
74 virtual HRESULT STDMETHODCALLTYPE Clone(IStream **);
75
76 virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
77 , DWORD dwOrigin
78 , ULARGE_INTEGER* lpNewFilePointer);
79
80 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
81 , DWORD grfStatFlag);
82};
83
84/**
85 * A minimal read-only IStream implementation which wraps an SkIStream.
86 */
87class SkIStream : public SkBaseIStream {
88private:
89 SkStream *fSkStream;
90 bool fUnrefOnRelease;
91
92 SkIStream(SkStream* stream, bool unrefOnRelease);
93 virtual ~SkIStream();
94
95public:
96 HRESULT static CreateFromSkStream(SkStream* stream
97 , bool unrefOnRelease
98 , IStream ** ppStream);
99
100 virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
101
102 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
103 , ULONG cb
104 , ULONG* pcbWritten);
105
106 virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
107 , DWORD dwOrigin
108 , ULARGE_INTEGER* lpNewFilePointer);
109
110 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
111 , DWORD grfStatFlag);
112};
113
114/**
115 * A minimal write-only IStream implementation which wraps an SkWIStream.
116 */
117class SkWIStream : public SkBaseIStream {
118private:
119 SkWStream *fSkWStream;
120
121 SkWIStream(SkWStream* stream);
122 virtual ~SkWIStream();
123
124public:
125 HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream);
126
127 virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
128 , ULONG cb
129 , ULONG* pcbWritten);
130
131 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
132 , DWORD grfStatFlag);
133};
134
135#endif