diff --git a/src/common/file_system.cpp b/src/common/file_system.cpp index d23e0fea5..289c7c5c6 100644 --- a/src/common/file_system.cpp +++ b/src/common/file_system.cpp @@ -591,6 +591,39 @@ bool WriteStreamToString(const std::string_view& sv, ByteStream* stream) return stream->Write2(sv.data(), static_cast(sv.size())); } +std::vector ReadBinaryStream(ByteStream* stream, bool seek_to_start /*= true*/) +{ + u64 pos = stream->GetPosition(); + u64 size = stream->GetSize(); + if (pos > 0 && seek_to_start) + { + if (!stream->SeekAbsolute(0)) + return {}; + + pos = 0; + } + + Assert(size >= pos); + size -= pos; + if (size == 0 || size > std::numeric_limits::max()) + return {}; + + std::vector ret; + ret.resize(static_cast(size)); + if (!stream->Read2(ret.data(), static_cast(size))) + return {}; + + return ret; +} + +bool WriteBinaryToSTream(ByteStream* stream, const void* data, size_t data_length) +{ + if (data_length > std::numeric_limits::max()) + return false; + + return stream->Write2(data, static_cast(data_length)); +} + void BuildOSPath(char* Destination, u32 cbDestination, const char* Path) { u32 i; diff --git a/src/common/file_system.h b/src/common/file_system.h index b8315ae55..29bc6c77e 100644 --- a/src/common/file_system.h +++ b/src/common/file_system.h @@ -187,6 +187,9 @@ bool WriteFileToString(const char* filename, const std::string_view& sv); std::string ReadStreamToString(ByteStream* stream, bool seek_to_start = true); bool WriteStreamToString(const std::string_view& sv, ByteStream* stream); +std::vector ReadBinaryStream(ByteStream* stream, bool seek_to_start = true); +bool WriteBinaryToSTream(ByteStream* stream, const void* data, size_t data_length); + // creates a directory in the local filesystem // if the directory already exists, the return value will be true. // if Recursive is specified, all parent directories will be created