• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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