#include "helpers/project_file_handler.hpp" #include #include #include using json = nlohmann::json; namespace hex { void to_json(json& j, const ImHexApi::Bookmarks::Entry& b) { j = json{ { "address", b.region.address }, { "size", b.region.size }, { "name", b.name.data() }, { "comment", b.comment.data() }, { "locked", b.locked }, { "color", b.color } }; } void from_json(const json& j, ImHexApi::Bookmarks::Entry& b) { std::string name, comment; j.at("address").get_to(b.region.address); j.at("size").get_to(b.region.size); j.at("name").get_to(name); j.at("comment").get_to(comment); j.at("locked").get_to(b.locked); j.at("color").get_to(b.color); std::copy(name.begin(), name.end(), std::back_inserter(b.name)); b.name.push_back('\0'); std::copy(comment.begin(), comment.end(), std::back_inserter(b.comment)); b.comment.push_back('\0'); } bool ProjectFile::load(const std::string &filePath) { ProjectFile::s_hasUnsavedChanged = false; json projectFileData; try { std::ifstream projectFile(filePath.c_str()); projectFile >> projectFileData; ProjectFile::s_filePath = projectFileData["filePath"]; ProjectFile::s_pattern = projectFileData["pattern"]; ProjectFile::s_patches = projectFileData["patches"].get(); ProjectFile::s_dataProcessorContent = projectFileData["dataProcessor"]; ProjectFile::s_bookmarks.clear(); for (auto &element : projectFileData["bookmarks"].items()) { ImHexApi::Bookmarks::Entry entry; from_json(element.value(), entry); ProjectFile::s_bookmarks.push_back(entry); } } catch (json::exception &e) { return false; } catch (std::ofstream::failure &e) { return false; } ProjectFile::s_currProjectFilePath = filePath; EventManager::post(); return true; } bool ProjectFile::store(std::string filePath) { EventManager::post(); json projectFileData; if (filePath.empty()) filePath = ProjectFile::s_currProjectFilePath; try { projectFileData["filePath"] = ProjectFile::s_filePath; projectFileData["pattern"] = ProjectFile::s_pattern; projectFileData["patches"] = ProjectFile::s_patches; projectFileData["dataProcessor"] = ProjectFile::s_dataProcessorContent; for (auto &bookmark : ProjectFile::s_bookmarks) { to_json(projectFileData["bookmarks"].emplace_back(), bookmark); } std::ofstream projectFile(filePath.c_str(), std::fstream::trunc); projectFile << projectFileData; } catch (json::exception &e) { return false; } catch (std::ifstream::failure &e) { return false; } ProjectFile::s_hasUnsavedChanged = false; ProjectFile::s_currProjectFilePath = filePath; return true; } }