aboutsummaryrefslogtreecommitdiff
path: root/src/base/platform/win/StreamConvert.cpp
blob: f7a0537c6df06b06bf7e30cd54ef62cb1e7b0ac4 (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
#include "cru/base/platform/win/StreamConvert.h"
#include "BrigdeComStream.h"
#include "Win32FileStreamPrivate.h"
#include "cru/base/Exception.h"
#include "cru/base/io/MemoryStream.h"
#include "cru/base/io/OpenFileFlag.h"
#include "cru/base/platform/win/ComAutoInit.h"
#include "cru/base/platform/win/Exception.h"
#include "cru/base/platform/win/Win32FileStream.h"

#include <shlwapi.h>
#include <winnt.h>

namespace cru::platform::win {
IStream* ConvertStreamToComStream(io::Stream* stream) {
  static ComAutoInit com_auto_init;

  if (auto memory_stream = dynamic_cast<io::MemoryStream*>(stream)) {
    return SHCreateMemStream(
        reinterpret_cast<const BYTE*>(memory_stream->GetBuffer()),
        memory_stream->GetSize());
  } else if (auto file_stream = dynamic_cast<Win32FileStream*>(stream)) {
    return file_stream->GetPrivate_()->stream_;
  } else {
    return new BridgeComStream(stream);
  }
}
}  // namespace cru::platform::win