180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkIStream_DEFINED
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkIStream_DEFINED
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define WIN32_LEAN_AND_MEAN
14910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#include <windows.h>
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <ole2.h>
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkStream;
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkWStream;
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * A bare IStream implementation which properly reference counts
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * but returns E_NOTIMPL for all ISequentialStream and IStream methods.
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkBaseIStream : public IStream {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    LONG _refcount;
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    explicit SkBaseIStream();
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~SkBaseIStream();
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                                   , void ** ppvObject);
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ULONG STDMETHODCALLTYPE AddRef(void);
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ULONG STDMETHODCALLTYPE Release(void);
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // ISequentialStream Interface
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                          , ULONG cb
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                          , ULONG* pcbWritten);
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // IStream Interface
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER);
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                           , ULARGE_INTEGER
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                           , ULARGE_INTEGER*
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                           , ULARGE_INTEGER*);
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Revert(void);
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                               , ULARGE_INTEGER
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                               , DWORD);
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                                 , ULARGE_INTEGER
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                                 , DWORD);
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Clone(IStream **);
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                         , DWORD dwOrigin
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                         , ULARGE_INTEGER* lpNewFilePointer);
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                         , DWORD grfStatFlag);
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * A minimal read-only IStream implementation which wraps an SkIStream.
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkIStream : public SkBaseIStream {
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkStream *fSkStream;
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool fUnrefOnRelease;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ULARGE_INTEGER fLocation;
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkIStream(SkStream* stream, bool unrefOnRelease);
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~SkIStream();
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    HRESULT static CreateFromSkStream(SkStream* stream
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                    , bool unrefOnRelease
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                    , IStream ** ppStream);
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                          , ULONG cb
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                          , ULONG* pcbWritten);
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                         , DWORD dwOrigin
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                         , ULARGE_INTEGER* lpNewFilePointer);
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                         , DWORD grfStatFlag);
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * A minimal write-only IStream implementation which wraps an SkWIStream.
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkWIStream : public SkBaseIStream {
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkWStream *fSkWStream;
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkWIStream(SkWStream* stream);
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~SkWIStream();
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream);
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                          , ULONG cb
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                          , ULONG* pcbWritten);
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                         , DWORD grfStatFlag);
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
132