diff --git a/lib/libimhex/include/hex/providers/provider.hpp b/lib/libimhex/include/hex/providers/provider.hpp index b191e7e3d..79a59fe09 100644 --- a/lib/libimhex/include/hex/providers/provider.hpp +++ b/lib/libimhex/include/hex/providers/provider.hpp @@ -114,7 +114,7 @@ namespace hex::prv { * @param size number of bytes to read * @param overlays apply overlays and patches is true. Same as readRaw() if false */ - void read(u64 offset, void *buffer, size_t size, bool overlays = true); + virtual void read(u64 offset, void *buffer, size_t size, bool overlays = true); /** * @brief Write data to the patches of this provider. Will not directly modify provider. @@ -122,7 +122,7 @@ namespace hex::prv { * @param buffer buffer to take data to write from * @param size number of bytes to write */ - void write(u64 offset, const void *buffer, size_t size); + virtual void write(u64 offset, const void *buffer, size_t size); /** * @brief Read data from this provider, without applying overlays and patches @@ -194,11 +194,11 @@ namespace hex::prv { [[nodiscard]] virtual std::vector getDataDescription() const; [[nodiscard]] virtual std::variant queryInformation(const std::string &category, const std::string &argument); - void undo(); - void redo(); + virtual void undo(); + virtual void redo(); - [[nodiscard]] bool canUndo() const; - [[nodiscard]] bool canRedo() const; + [[nodiscard]] virtual bool canUndo() const; + [[nodiscard]] virtual bool canRedo() const; [[nodiscard]] virtual bool hasFilePicker() const; virtual bool handleFilePicker(); @@ -232,7 +232,7 @@ namespace hex::prv { return m_undoRedoStack.add(std::forward(args)...); } - [[nodiscard]] undo::Stack& getUndoStack() { return m_undoRedoStack; } + [[nodiscard]] virtual undo::Stack& getUndoStack() { return m_undoRedoStack; } protected: u32 m_currPage = 0; diff --git a/plugins/builtin/include/content/providers/view_provider.hpp b/plugins/builtin/include/content/providers/view_provider.hpp index 7688e27bb..6f278da04 100644 --- a/plugins/builtin/include/content/providers/view_provider.hpp +++ b/plugins/builtin/include/content/providers/view_provider.hpp @@ -23,6 +23,8 @@ namespace hex::plugin::builtin { void resizeRaw(u64 newSize) override; void insertRaw(u64 offset, u64 size) override; void removeRaw(u64 offset, u64 size) override; + void read(u64 offset, void *buffer, size_t size, bool overlays = true) override; + void write(u64 offset, const void *buffer, size_t size) override; void readRaw(u64 offset, void *buffer, size_t size) override; void writeRaw(u64 offset, const void *buffer, size_t size) override; @@ -35,6 +37,16 @@ namespace hex::plugin::builtin { void loadSettings(const nlohmann::json &settings) override; [[nodiscard]] nlohmann::json storeSettings(nlohmann::json settings) const override; + u64 getBaseAddress() const override { + u64 result = m_startAddress; + + if (m_provider != nullptr) + result += m_provider->getBaseAddress(); + + return result; + } + void setBaseAddress(u64 address) override { std::ignore = address; } + void setProvider(u64 startAddress, size_t size, hex::prv::Provider *provider); void setName(const std::string &name); @@ -43,6 +55,12 @@ namespace hex::plugin::builtin { std::vector getMenuEntries() override; + void undo() override { if (m_provider != nullptr) m_provider->undo(); } + void redo() override { if (m_provider != nullptr) m_provider->redo(); } + + bool canUndo() const override { return m_provider != nullptr && m_provider->canUndo(); } + bool canRedo() const override { return m_provider != nullptr && m_provider->canRedo(); } + private: void renameFile(); diff --git a/plugins/builtin/source/content/providers/view_provider.cpp b/plugins/builtin/source/content/providers/view_provider.cpp index 83466fab2..b0d0a60b6 100644 --- a/plugins/builtin/source/content/providers/view_provider.cpp +++ b/plugins/builtin/source/content/providers/view_provider.cpp @@ -29,7 +29,7 @@ namespace hex::plugin::builtin { return m_provider->isWritable(); } [[nodiscard]] bool ViewProvider::isResizable() const { - return true; + return false; } [[nodiscard]] bool ViewProvider::isSavable() const { @@ -71,7 +71,7 @@ namespace hex::plugin::builtin { return; m_size += size; - m_provider->insert(offset + m_startAddress, size); + m_provider->insert(offset, size); } void ViewProvider::removeRaw(u64 offset, u64 size) { @@ -79,21 +79,35 @@ namespace hex::plugin::builtin { return; m_size -= size; - m_provider->remove(offset + m_startAddress, size); + m_provider->remove(offset, size); + } + + void ViewProvider::read(u64 offset, void *buffer, size_t size, bool overlays) { + if (m_provider == nullptr) + return; + + m_provider->read(offset, buffer, size, overlays); + } + + void ViewProvider::write(u64 offset, const void *buffer, size_t size) { + if (m_provider == nullptr) + return; + + m_provider->write(offset, buffer, size); } void ViewProvider::readRaw(u64 offset, void *buffer, size_t size) { if (m_provider == nullptr) return; - m_provider->read(offset + m_startAddress, buffer, size); + m_provider->readRaw(offset, buffer, size); } void ViewProvider::writeRaw(u64 offset, const void *buffer, size_t size) { if (m_provider == nullptr) return; - m_provider->write(offset + m_startAddress, buffer, size); + m_provider->writeRaw(offset, buffer, size); } [[nodiscard]] u64 ViewProvider::getActualSize() const {