fbfcd56021
This CL is part I of IV (I broke down the 1280 files into 4 CLs). Review URL: https://codereview.appspot.com/6485054 git-svn-id: http://skia.googlecode.com/svn/trunk@5262 2bbb7eff-a529-9590-31e7-b0007b416f81
132 lines
4.0 KiB
C++
132 lines
4.0 KiB
C++
|
|
/*
|
|
* 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
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <Windows.h>
|
|
#include <ole2.h>
|
|
|
|
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 {
|
|
private:
|
|
LONG _refcount;
|
|
|
|
protected:
|
|
explicit SkBaseIStream();
|
|
virtual ~SkBaseIStream();
|
|
|
|
public:
|
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid
|
|
, void ** ppvObject);
|
|
virtual ULONG STDMETHODCALLTYPE AddRef(void);
|
|
virtual ULONG STDMETHODCALLTYPE Release(void);
|
|
|
|
// ISequentialStream Interface
|
|
public:
|
|
virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
|
|
, ULONG cb
|
|
, ULONG* pcbWritten);
|
|
|
|
// IStream Interface
|
|
public:
|
|
virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*
|
|
, ULARGE_INTEGER
|
|
, ULARGE_INTEGER*
|
|
, ULARGE_INTEGER*);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Revert(void);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER
|
|
, ULARGE_INTEGER
|
|
, DWORD);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER
|
|
, ULARGE_INTEGER
|
|
, DWORD);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Clone(IStream **);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
|
|
, DWORD dwOrigin
|
|
, ULARGE_INTEGER* lpNewFilePointer);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
|
|
, DWORD grfStatFlag);
|
|
};
|
|
|
|
/**
|
|
* A minimal read-only IStream implementation which wraps an SkIStream.
|
|
*/
|
|
class SkIStream : public SkBaseIStream {
|
|
private:
|
|
SkStream *fSkStream;
|
|
bool fUnrefOnRelease;
|
|
ULARGE_INTEGER fLocation;
|
|
|
|
SkIStream(SkStream* stream, bool unrefOnRelease);
|
|
virtual ~SkIStream();
|
|
|
|
public:
|
|
HRESULT static CreateFromSkStream(SkStream* stream
|
|
, bool unrefOnRelease
|
|
, IStream ** ppStream);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
|
|
, ULONG cb
|
|
, ULONG* pcbWritten);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
|
|
, DWORD dwOrigin
|
|
, ULARGE_INTEGER* lpNewFilePointer);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
|
|
, DWORD grfStatFlag);
|
|
};
|
|
|
|
/**
|
|
* A minimal write-only IStream implementation which wraps an SkWIStream.
|
|
*/
|
|
class SkWIStream : public SkBaseIStream {
|
|
private:
|
|
SkWStream *fSkWStream;
|
|
|
|
SkWIStream(SkWStream* stream);
|
|
virtual ~SkWIStream();
|
|
|
|
public:
|
|
HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
|
|
, ULONG cb
|
|
, ULONG* pcbWritten);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
|
|
|
|
virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
|
|
, DWORD grfStatFlag);
|
|
};
|
|
|
|
#endif
|