Home | History | Annotate | Download | only in win
      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