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