SkIStream.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. * Copyright 2011 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #ifndef SkIStream_DEFINED
  8. #define SkIStream_DEFINED
  9. #include "include/core/SkTypes.h"
  10. #ifdef SK_BUILD_FOR_WIN
  11. #include "src/core/SkLeanWindows.h"
  12. #include <ole2.h>
  13. class SkStream;
  14. class SkWStream;
  15. /**
  16. * A bare IStream implementation which properly reference counts
  17. * but returns E_NOTIMPL for all ISequentialStream and IStream methods.
  18. */
  19. class SkBaseIStream : public IStream {
  20. private:
  21. LONG _refcount;
  22. protected:
  23. explicit SkBaseIStream();
  24. virtual ~SkBaseIStream();
  25. public:
  26. virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid
  27. , void ** ppvObject);
  28. virtual ULONG STDMETHODCALLTYPE AddRef(void);
  29. virtual ULONG STDMETHODCALLTYPE Release(void);
  30. // ISequentialStream Interface
  31. public:
  32. virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
  33. virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
  34. , ULONG cb
  35. , ULONG* pcbWritten);
  36. // IStream Interface
  37. public:
  38. virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER);
  39. virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*
  40. , ULARGE_INTEGER
  41. , ULARGE_INTEGER*
  42. , ULARGE_INTEGER*);
  43. virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
  44. virtual HRESULT STDMETHODCALLTYPE Revert(void);
  45. virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER
  46. , ULARGE_INTEGER
  47. , DWORD);
  48. virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER
  49. , ULARGE_INTEGER
  50. , DWORD);
  51. virtual HRESULT STDMETHODCALLTYPE Clone(IStream **);
  52. virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
  53. , DWORD dwOrigin
  54. , ULARGE_INTEGER* lpNewFilePointer);
  55. virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
  56. , DWORD grfStatFlag);
  57. };
  58. /**
  59. * A minimal read-only IStream implementation which wraps an SkStream.
  60. */
  61. class SkIStream : public SkBaseIStream {
  62. private:
  63. SkStream *fSkStream;
  64. const bool fDeleteOnRelease;
  65. ULARGE_INTEGER fLocation;
  66. SkIStream(SkStream* stream, bool fDeleteOnRelease);
  67. virtual ~SkIStream();
  68. public:
  69. HRESULT static CreateFromSkStream(SkStream* stream
  70. , bool fDeleteOnRelease
  71. , IStream ** ppStream);
  72. virtual HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead);
  73. virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
  74. , ULONG cb
  75. , ULONG* pcbWritten);
  76. virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove
  77. , DWORD dwOrigin
  78. , ULARGE_INTEGER* lpNewFilePointer);
  79. virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
  80. , DWORD grfStatFlag);
  81. };
  82. /**
  83. * A minimal write-only IStream implementation which wraps an SkWIStream.
  84. */
  85. class SkWIStream : public SkBaseIStream {
  86. private:
  87. SkWStream *fSkWStream;
  88. SkWIStream(SkWStream* stream);
  89. virtual ~SkWIStream();
  90. public:
  91. HRESULT static CreateFromSkWStream(SkWStream* stream, IStream ** ppStream);
  92. virtual HRESULT STDMETHODCALLTYPE Write(void const* pv
  93. , ULONG cb
  94. , ULONG* pcbWritten);
  95. virtual HRESULT STDMETHODCALLTYPE Commit(DWORD);
  96. virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg
  97. , DWORD grfStatFlag);
  98. };
  99. #endif // SK_BUILD_FOR_WIN
  100. #endif // SkIStream_DEFINED