/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkIStream_DEFINED #define SkIStream_DEFINED #include "include/core/SkTypes.h" #ifdef SK_BUILD_FOR_WIN #include "src/core/SkLeanWindows.h" #include "src/utils/win/SkObjBase.h" #include class SkStream; class SkWStream; /** * A bare IStream implementation which properly reference counts * but returns E_NOTIMPL for all ISequentialStream and IStream methods. */ class SkBaseIStream : public IStream { public: // IUnknown methods SK_STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject) override; SK_STDMETHODIMP_(ULONG) AddRef() override; SK_STDMETHODIMP_(ULONG) Release() override; // ISequentialStream methods SK_STDMETHODIMP Read(void* pv, ULONG cb, ULONG* pcbRead) override; SK_STDMETHODIMP Write(void const* pv, ULONG cb, ULONG* pcbWritten) override; // IStream methods SK_STDMETHODIMP SetSize(ULARGE_INTEGER) override; SK_STDMETHODIMP CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*) override; SK_STDMETHODIMP Commit(DWORD) override; SK_STDMETHODIMP Revert() override; SK_STDMETHODIMP LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) override; SK_STDMETHODIMP UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) override; SK_STDMETHODIMP Clone(IStream**) override; SK_STDMETHODIMP Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer) override; SK_STDMETHODIMP Stat(STATSTG* pStatstg, DWORD grfStatFlag) override; protected: explicit SkBaseIStream(); virtual ~SkBaseIStream(); private: LONG _refcount; }; /** * A minimal read-only IStream implementation which wraps an SkStream. */ class SkIStream : public SkBaseIStream { public: HRESULT static CreateFromSkStream(std::unique_ptr, IStream** ppStream); SK_STDMETHODIMP Read(void* pv, ULONG cb, ULONG* pcbRead) override; SK_STDMETHODIMP Write(void const* pv, ULONG cb, ULONG* pcbWritten) override; SK_STDMETHODIMP Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer) override; SK_STDMETHODIMP Stat(STATSTG* pStatstg, DWORD grfStatFlag) override; private: const std::unique_ptr fSkStream; ULARGE_INTEGER fLocation; explicit SkIStream(std::unique_ptr); ~SkIStream() override; }; /** * A minimal write-only IStream implementation which wraps an SkWIStream. */ class SkWIStream : public SkBaseIStream { public: HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream); SK_STDMETHODIMP Write(void const* pv, ULONG cb, ULONG* pcbWritten) override; SK_STDMETHODIMP Commit(DWORD) override; SK_STDMETHODIMP Stat(STATSTG* pStatstg, DWORD grfStatFlag) override; private: SkWStream *fSkWStream; SkWIStream(SkWStream* stream); ~SkWIStream() override; }; #endif // SK_BUILD_FOR_WIN #endif // SkIStream_DEFINED