blob: 4a72f5b7290111a20b0d393284c3c5d442961754 [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
halcanary0cbe7ee2015-12-01 09:02:49 -080013#include "SkTypes.h"
14
15#ifdef SK_BUILD_FOR_WIN
16
bungeman@google.com9df621d2011-06-23 21:43:52 +000017#define WIN32_LEAN_AND_MEAN
bungeman@google.com0d9e3da2013-12-03 15:23:37 +000018#include <windows.h>
bungeman@google.com9df621d2011-06-23 21:43:52 +000019#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);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000053
bungeman@google.com9df621d2011-06-23 21:43:52 +000054 virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*
55 , ULARGE_INTEGER
56 , ULARGE_INTEGER*
57 , ULARGE_INTEGER*);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000058
bungeman@google.com9df621d2011-06-23 21:43:52 +000059 virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000060
bungeman@google.com9df621d2011-06-23 21:43:52 +000061 virtual HRESULT STDMETHODCALLTYPE Revert(void);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000062
bungeman@google.com9df621d2011-06-23 21:43:52 +000063 virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER
64 , ULARGE_INTEGER
65 , DWORD);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000066
bungeman@google.com9df621d2011-06-23 21:43:52 +000067 virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER
68 , ULARGE_INTEGER
69 , DWORD);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000070
bungeman@google.com9df621d2011-06-23 21:43:52 +000071 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/**
bungeman44af7ba2015-01-22 07:33:51 -080082 * A minimal read-only IStream implementation which wraps an SkStream.
bungeman@google.com9df621d2011-06-23 21:43:52 +000083 */
84class SkIStream : public SkBaseIStream {
85private:
86 SkStream *fSkStream;
bungeman44af7ba2015-01-22 07:33:51 -080087 const bool fDeleteOnRelease;
bungeman@google.com60157922011-08-13 00:06:17 +000088 ULARGE_INTEGER fLocation;
bungeman@google.com9df621d2011-06-23 21:43:52 +000089
bungeman2dca8172015-01-22 06:08:31 -080090 SkIStream(SkStream* stream, bool fDeleteOnRelease);
bungeman@google.com9df621d2011-06-23 21:43:52 +000091 virtual ~SkIStream();
92
93public:
94 HRESULT static CreateFromSkStream(SkStream* stream
bungeman2dca8172015-01-22 06:08:31 -080095 , bool fDeleteOnRelease
bungeman@google.com9df621d2011-06-23 21:43:52 +000096 , 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
bungeman@google.com14fc3212011-08-01 20:41:53 +0000129 virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
130
bungeman@google.com9df621d2011-06-23 21:43:52 +0000131 virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
132 , DWORD grfStatFlag);
133};
134
halcanary0cbe7ee2015-12-01 09:02:49 -0800135#endif // SK_BUILD_FOR_WIN
136#endif // SkIStream_DEFINED