diff --git a/lib/libimhex/source/providers/provider.cpp b/lib/libimhex/source/providers/provider.cpp index 01baf1e63..c1808158b 100644 --- a/lib/libimhex/source/providers/provider.cpp +++ b/lib/libimhex/source/providers/provider.cpp @@ -9,6 +9,7 @@ #include #include +#include namespace hex::prv { @@ -36,7 +37,20 @@ namespace hex::prv { void Provider::save() { } void Provider::saveAs(const std::fs::path &path) { - hex::unused(path); + wolv::io::File file(path, wolv::io::File::Mode::Create); + + if (file.isValid()) { + std::vector buffer(std::min(0xFF'FFFF, this->getActualSize()), 0x00); + size_t bufferSize = buffer.size(); + + for (u64 offset = 0; offset < this->getActualSize(); offset += bufferSize) { + if (bufferSize > this->getActualSize() - offset) + bufferSize = this->getActualSize() - offset; + + this->read(offset + this->getBaseAddress(), buffer.data(), bufferSize, true); + file.write(buffer.data(), bufferSize); + } + } } void Provider::resize(size_t newSize) { diff --git a/plugins/builtin/include/content/providers/file_provider.hpp b/plugins/builtin/include/content/providers/file_provider.hpp index d58cfba80..cea8a9241 100644 --- a/plugins/builtin/include/content/providers/file_provider.hpp +++ b/plugins/builtin/include/content/providers/file_provider.hpp @@ -32,7 +32,6 @@ namespace hex::plugin::builtin { [[nodiscard]] size_t getActualSize() const override; void save() override; - void saveAs(const std::fs::path &path) override; [[nodiscard]] std::string getName() const override; [[nodiscard]] std::vector> getDataDescription() const override; diff --git a/plugins/builtin/include/content/providers/gdb_provider.hpp b/plugins/builtin/include/content/providers/gdb_provider.hpp index 3eaee98af..04abfe94d 100644 --- a/plugins/builtin/include/content/providers/gdb_provider.hpp +++ b/plugins/builtin/include/content/providers/gdb_provider.hpp @@ -30,7 +30,6 @@ namespace hex::plugin::builtin { [[nodiscard]] size_t getActualSize() const override; void save() override; - void saveAs(const std::fs::path &path) override; [[nodiscard]] std::string getName() const override; [[nodiscard]] std::vector> getDataDescription() const override; diff --git a/plugins/builtin/include/content/providers/memory_file_provider.hpp b/plugins/builtin/include/content/providers/memory_file_provider.hpp index daa47081d..1ca6c1d3a 100644 --- a/plugins/builtin/include/content/providers/memory_file_provider.hpp +++ b/plugins/builtin/include/content/providers/memory_file_provider.hpp @@ -28,7 +28,6 @@ namespace hex::plugin::builtin { void remove(u64 offset, size_t size) override; void save() override; - void saveAs(const std::fs::path &path) override; [[nodiscard]] std::string getName() const override { return LangEntry("hex.builtin.provider.mem_file.unsaved"); } [[nodiscard]] std::vector> getDataDescription() const override { return { }; } diff --git a/plugins/builtin/source/content/providers/file_provider.cpp b/plugins/builtin/source/content/providers/file_provider.cpp index 33a7ac0e1..c8f81180f 100644 --- a/plugins/builtin/source/content/providers/file_provider.cpp +++ b/plugins/builtin/source/content/providers/file_provider.cpp @@ -91,25 +91,6 @@ namespace hex::plugin::builtin { this->applyPatches(); } - void FileProvider::saveAs(const std::fs::path &path) { - wolv::io::File file(path, wolv::io::File::Mode::Create); - - if (file.isValid()) { - auto provider = ImHexApi::Provider::get(); - - std::vector buffer(std::min(0xFF'FFFF, provider->getActualSize()), 0x00); - size_t bufferSize = buffer.size(); - - for (u64 offset = 0; offset < provider->getActualSize(); offset += bufferSize) { - if (bufferSize > provider->getActualSize() - offset) - bufferSize = provider->getActualSize() - offset; - - provider->read(offset + this->getBaseAddress(), buffer.data(), bufferSize); - file.write(buffer.data(), bufferSize); - } - } - } - void FileProvider::resize(size_t newSize) { this->close(); diff --git a/plugins/builtin/source/content/providers/gdb_provider.cpp b/plugins/builtin/source/content/providers/gdb_provider.cpp index 8cd8a8f0f..3d11bf156 100644 --- a/plugins/builtin/source/content/providers/gdb_provider.cpp +++ b/plugins/builtin/source/content/providers/gdb_provider.cpp @@ -221,10 +221,6 @@ namespace hex::plugin::builtin { this->applyPatches(); } - void GDBProvider::saveAs(const std::fs::path &path) { - hex::unused(path); - } - size_t GDBProvider::getActualSize() const { return this->m_size; } diff --git a/plugins/builtin/source/content/providers/memory_file_provider.cpp b/plugins/builtin/source/content/providers/memory_file_provider.cpp index f882afe07..5a2672ccd 100644 --- a/plugins/builtin/source/content/providers/memory_file_provider.cpp +++ b/plugins/builtin/source/content/providers/memory_file_provider.cpp @@ -50,25 +50,6 @@ namespace hex::plugin::builtin { }); } - void MemoryFileProvider::saveAs(const std::fs::path &path) { - wolv::io::File file(path, wolv::io::File::Mode::Create); - - if (file.isValid()) { - auto provider = ImHexApi::Provider::get(); - - std::vector buffer(std::min(0xFF'FFFF, provider->getActualSize()), 0x00); - size_t bufferSize = buffer.size(); - - for (u64 offset = 0; offset < provider->getActualSize(); offset += bufferSize) { - if (bufferSize > provider->getActualSize() - offset) - bufferSize = provider->getActualSize() - offset; - - provider->read(offset + this->getBaseAddress(), buffer.data(), bufferSize); - file.write(buffer); - } - } - } - void MemoryFileProvider::resize(size_t newSize) { this->m_data.resize(newSize); diff --git a/plugins/windows/include/content/providers/process_memory_provider.hpp b/plugins/windows/include/content/providers/process_memory_provider.hpp index 7682eeb98..95ac85c63 100644 --- a/plugins/windows/include/content/providers/process_memory_provider.hpp +++ b/plugins/windows/include/content/providers/process_memory_provider.hpp @@ -36,7 +36,6 @@ namespace hex::plugin::windows { [[nodiscard]] size_t getActualSize() const override { return 0xFFFF'FFFF'FFFF; } void save() override {} - void saveAs(const std::fs::path &) override {} [[nodiscard]] std::string getName() const override { return hex::format("hex.windows.provider.process_memory.name"_lang, this->m_selectedProcess != nullptr ? this->m_selectedProcess->name : ""); } [[nodiscard]] std::vector> getDataDescription() const override {