aboutsummaryrefslogtreecommitdiff
path: root/src/common/platform/win/BridgeComStream.cpp
blob: 48ba8154ff50b1609645485244495718d9ed8e70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "BrigdeComStream.hpp"
#include "cru/common/io/Stream.hpp"

namespace cru::platform::win {
BridgeComStream::BridgeComStream(io::Stream *stream)
    : stream_(stream), ref_count_(1) {}

BridgeComStream::~BridgeComStream() {}

ULONG BridgeComStream::AddRef() { return ++ref_count_; }

ULONG BridgeComStream::Release() {
  --ref_count_;

  if (ref_count_ == 0) {
    delete this;
    return 0;
  }

  return ref_count_;
}

HRESULT BridgeComStream::QueryInterface(const IID &riid, void **ppvObject) {
  if (riid == IID_IStream) {
    *ppvObject = static_cast<IStream *>(this);
    AddRef();
    return S_OK;
  } else if (riid == IID_ISequentialStream) {
    *ppvObject = static_cast<ISequentialStream *>(this);
    AddRef();
    return S_OK;
  } else if (riid == IID_IUnknown) {
    *ppvObject = static_cast<IUnknown *>(this);
    AddRef();
    return S_OK;
  } else {
    return E_NOINTERFACE;
  }
}

HRESULT BridgeComStream::Read(void *pv, ULONG cb, ULONG *pcbRead) {
  *pcbRead = stream_->Read(static_cast<std::byte *>(pv), cb);
  return S_OK;
}

HRESULT BridgeComStream::Write(const void *pv, ULONG cb, ULONG *pcbWritten) {
  *pcbWritten = stream_->Write(static_cast<const std::byte *>(pv), cb);
  return S_OK;
}

HRESULT BridgeComStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin,
                              ULARGE_INTEGER *plibNewPosition) {
  io::Stream::SeekOrigin so;

  switch (dwOrigin) {
    case STREAM_SEEK_SET:
      so = io::Stream::SeekOrigin::Begin;
      break;
    case STREAM_SEEK_CUR:
      so = io::Stream::SeekOrigin::Current;
      break;
    case STREAM_SEEK_END:
      so = io::Stream::SeekOrigin::End;
      break;
    default:
      return STG_E_INVALIDFUNCTION;
  };

  plibNewPosition->QuadPart = stream_->Seek(dlibMove.QuadPart, so);
  return S_OK;
}

HRESULT BridgeComStream::SetSize(ULARGE_INTEGER libNewSize) {
  return E_NOTIMPL;
}

HRESULT BridgeComStream::CopyTo(IStream *pstm, ULARGE_INTEGER cb,
                                ULARGE_INTEGER *pcbRead,
                                ULARGE_INTEGER *pcbWritten) {
  return E_NOTIMPL;
}

HRESULT BridgeComStream::Commit(DWORD grfCommitFlags) { return S_OK; }

HRESULT BridgeComStream::Revert() { return S_OK; }

HRESULT BridgeComStream::LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb,
                                    DWORD dwLockType) {
  return S_OK;
}

HRESULT BridgeComStream::UnlockRegion(ULARGE_INTEGER libOffset,
                                      ULARGE_INTEGER cb, DWORD dwLockType) {
  return S_OK;
}

HRESULT BridgeComStream::Stat(STATSTG *pstatstg, DWORD grfStatFlag) {
  return E_NOTIMPL;
}

HRESULT BridgeComStream::Clone(IStream **ppstm) {
  *ppstm = new BridgeComStream(stream_);
  return S_OK;
}

}  // namespace cru::platform::win