impr: Added default saveAs implementation for all providers

This commit is contained in:
WerWolv 2023-03-17 08:15:43 +01:00
parent 7cdba75bef
commit 5097a223e3
8 changed files with 15 additions and 47 deletions

View File

@ -9,6 +9,7 @@
#include <optional>
#include <hex/helpers/magic.hpp>
#include <wolv/io/file.hpp>
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<u8> buffer(std::min<size_t>(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) {

View File

@ -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<std::pair<std::string, std::string>> getDataDescription() const override;

View File

@ -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<std::pair<std::string, std::string>> getDataDescription() const override;

View File

@ -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<std::pair<std::string, std::string>> getDataDescription() const override { return { }; }

View File

@ -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<u8> buffer(std::min<size_t>(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();

View File

@ -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;
}

View File

@ -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<u8> buffer(std::min<size_t>(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);

View File

@ -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<std::pair<std::string, std::string>> getDataDescription() const override {