| 135 | } |
| 136 | |
| 137 | void importModifiedFile() { |
| 138 | fs::openFileBrowser(fs::DialogMode::Open, {}, [](const auto &path) { |
| 139 | TaskManager::createTask("hex.ui.common.processing", TaskManager::NoProgress, [path](auto &task) { |
| 140 | auto provider = ImHexApi::Provider::get(); |
| 141 | auto patchData = wolv::io::File(path, wolv::io::File::Mode::Read).readVector(); |
| 142 | |
| 143 | if (patchData.size() != provider->getActualSize()) { |
| 144 | ui::ToastError::open("hex.builtin.menu.file.import.modified_file.popup.invalid_size"_lang); |
| 145 | return; |
| 146 | } |
| 147 | |
| 148 | const auto baseAddress = provider->getBaseAddress(); |
| 149 | |
| 150 | std::map<u64, u8> patches; |
| 151 | for (u64 i = 0; i < patchData.size(); i++) { |
| 152 | u8 value = 0; |
| 153 | provider->read(baseAddress + i, &value, 1); |
| 154 | |
| 155 | if (value != patchData[i]) |
| 156 | patches[baseAddress + i] = patchData[i]; |
| 157 | } |
| 158 | |
| 159 | task.setMaxValue(patches.size()); |
| 160 | |
| 161 | for (auto &[address, value] : patches) { |
| 162 | provider->write(address, &value, sizeof(value)); |
| 163 | task.increment(); |
| 164 | } |
| 165 | |
| 166 | provider->getUndoStack().groupOperations(patches.size(), "hex.builtin.undo_operation.patches"); |
| 167 | }); |
| 168 | }); |
| 169 | } |
| 170 | |
| 171 | } |
| 172 |
nothing calls this directly
no test coverage detected