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