1
0
mirror of synced 2024-12-01 02:37:18 +01:00

store: Added encoding files to store, fixed crash when folder doesn't exist

This commit is contained in:
WerWolv 2022-01-23 21:52:24 +01:00
parent 053c897056
commit 9cf7fc4a2e
10 changed files with 67 additions and 37 deletions

View File

@ -18,6 +18,7 @@ namespace hex {
Config, Config,
Resources, Resources,
Constants, Constants,
Encodings,
Logs Logs
}; };

View File

@ -98,6 +98,11 @@ namespace hex {
return (path / "constants").string(); return (path / "constants").string();
}); });
break; break;
case ImHexPath::Encodings:
std::transform(paths.begin(), paths.end(), std::back_inserter(result), [](auto &path){
return (path / "encodings").string();
});
break;
case ImHexPath::Logs: case ImHexPath::Logs:
std::transform(paths.begin(), paths.end(), std::back_inserter(result), [](auto &path){ std::transform(paths.begin(), paths.end(), std::back_inserter(result), [](auto &path){
return (path / "logs").string(); return (path / "logs").string();
@ -142,6 +147,9 @@ namespace hex {
case ImHexPath::Constants: case ImHexPath::Constants:
result.push_back((applicationSupportDir / "constants").string()); result.push_back((applicationSupportDir / "constants").string());
break; break;
case ImHexPath::Encodings:
result.push_back((applicationSupportDir / "encodings").string());
break;
case ImHexPath::Logs: case ImHexPath::Logs:
result.push_back((applicationSupportDir / "logs").string()); result.push_back((applicationSupportDir / "logs").string());
break; break;
@ -199,6 +207,10 @@ namespace hex {
std::transform(dataDirs.begin(), dataDirs.end(), std::back_inserter(result), std::transform(dataDirs.begin(), dataDirs.end(), std::back_inserter(result),
[](auto p) { return (p / "constants").string(); }); [](auto p) { return (p / "constants").string(); });
break; break;
case ImHexPath::Encodings:
std::transform(dataDirs.begin(), dataDirs.end(), std::back_inserter(result),
[](auto p) { return (p / "encodings").string(); });
break;
case ImHexPath::Logs: case ImHexPath::Logs:
std::transform(dataDirs.begin(), dataDirs.end(), std::back_inserter(result), std::transform(dataDirs.begin(), dataDirs.end(), std::back_inserter(result),
[](auto p) { return (p / "logs").string(); }); [](auto p) { return (p / "logs").string(); });

View File

@ -50,7 +50,7 @@ namespace hex::init {
try { try {
status = task() && status; status = task() && status;
} catch (std::exception &e) { } catch (std::exception &e) {
log::error("Init task {} threw an exception: {}", name, e.what()); log::error("Init task '{}' threw an exception: {}", name, e.what());
status = false; status = false;
} }

View File

@ -66,6 +66,7 @@ namespace hex::init {
ImHexPath::Config, ImHexPath::Config,
ImHexPath::Constants, ImHexPath::Constants,
ImHexPath::Yara, ImHexPath::Yara,
ImHexPath::Encodings,
ImHexPath::Python, ImHexPath::Python,
ImHexPath::Logs ImHexPath::Logs
}; };

View File

@ -43,15 +43,15 @@ namespace hex::plugin::builtin {
std::future<Response<void>> m_download; std::future<Response<void>> m_download;
fs::path m_downloadPath; fs::path m_downloadPath;
std::vector<StoreEntry> m_patterns, m_includes, m_magics, m_constants, m_yara; std::vector<StoreEntry> m_patterns, m_includes, m_magics, m_constants, m_yara, m_encodings;
void drawStore(); void drawStore();
void refresh(); void refresh();
void parseResponse(); void parseResponse();
void download(ImHexPath pathType, const std::string &fileName, const std::string &url, bool update); bool download(ImHexPath pathType, const std::string &fileName, const std::string &url, bool update);
void remove(ImHexPath pathType, const std::string &fileName); bool remove(ImHexPath pathType, const std::string &fileName);
}; };
} }

View File

@ -42,7 +42,7 @@ namespace hex::plugin::builtin {
this->refresh(); this->refresh();
} }
auto drawTab = [this](auto title, ImHexPath pathType, auto &content, std::function<void(const StoreEntry&)> downloadDoneCallback) { auto drawTab = [this](auto title, ImHexPath pathType, auto &content, const std::function<void(const StoreEntry&)> &downloadDoneCallback) {
if (ImGui::BeginTabItem(title)) { if (ImGui::BeginTabItem(title)) {
if (ImGui::BeginTable("##pattern_language", 3, ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_RowBg)) { if (ImGui::BeginTable("##pattern_language", 3, ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_RowBg)) {
ImGui::TableSetupScrollFreeze(0, 1); ImGui::TableSetupScrollFreeze(0, 1);
@ -116,18 +116,15 @@ namespace hex::plugin::builtin {
} else if (entry.hasUpdate) { } else if (entry.hasUpdate) {
if (ImGui::Button("hex.builtin.view.store.update"_lang)) { if (ImGui::Button("hex.builtin.view.store.update"_lang)) {
this->download(pathType, entry.fileName, entry.link, true); entry.downloading = this->download(pathType, entry.fileName, entry.link, true);
entry.downloading = true;
} }
} else if (!entry.installed) { } else if (!entry.installed) {
if (ImGui::Button("hex.builtin.view.store.download"_lang)) { if (ImGui::Button("hex.builtin.view.store.download"_lang)) {
this->download(pathType, entry.fileName, entry.link, false); entry.downloading = this->download(pathType, entry.fileName, entry.link, false);
entry.downloading = true;
} }
} else { } else {
if (ImGui::Button("hex.builtin.view.store.remove"_lang)) { if (ImGui::Button("hex.builtin.view.store.remove"_lang)) {
this->remove(pathType, entry.fileName); entry.installed = !this->remove(pathType, entry.fileName);
entry.installed = false;
} }
} }
} }
@ -143,17 +140,12 @@ namespace hex::plugin::builtin {
}; };
if (ImGui::BeginTabBar("storeTabs")) { if (ImGui::BeginTabBar("storeTabs")) {
auto extractTar = []{ drawTab("hex.builtin.view.store.tab.patterns"_lang, ImHexPath::Patterns, this->m_patterns, [](auto) {});
drawTab("hex.builtin.view.store.tab.libraries"_lang, ImHexPath::PatternsInclude, this->m_includes, [](auto) {});
}; drawTab("hex.builtin.view.store.tab.magics"_lang, ImHexPath::Magic, this->m_magics, [](auto) { magic::compile(); });
drawTab("hex.builtin.view.store.tab.constants"_lang, ImHexPath::Constants, this->m_constants, [](auto) {});
drawTab("hex.builtin.view.store.tab.patterns"_lang, ImHexPath::Patterns, this->m_patterns, [](auto){}); drawTab("hex.builtin.view.store.tab.encodings"_lang, ImHexPath::Encodings, this->m_encodings, [](auto) {});
drawTab("hex.builtin.view.store.tab.libraries"_lang, ImHexPath::PatternsInclude, this->m_includes, [](auto){}); drawTab("hex.builtin.view.store.tab.yara"_lang, ImHexPath::Yara, this->m_yara, [](auto) {});
drawTab("hex.builtin.view.store.tab.magics"_lang, ImHexPath::Magic, this->m_magics, [](auto){
magic::compile();
});
drawTab("hex.builtin.view.store.tab.constants"_lang, ImHexPath::Constants, this->m_constants, [](auto){});
drawTab("hex.builtin.view.store.tab.yara"_lang, ImHexPath::Yara, this->m_yara, [](auto){});
ImGui::EndTabBar(); ImGui::EndTabBar();
} }
@ -165,6 +157,7 @@ namespace hex::plugin::builtin {
this->m_magics.clear(); this->m_magics.clear();
this->m_constants.clear(); this->m_constants.clear();
this->m_yara.clear(); this->m_yara.clear();
this->m_encodings.clear();
this->m_apiRequest = this->m_net.getString(ImHexApiURL + "/store"s); this->m_apiRequest = this->m_net.getString(ImHexApiURL + "/store"s);
} }
@ -217,6 +210,7 @@ namespace hex::plugin::builtin {
parseStoreEntries(json, "magic", ImHexPath::Magic, this->m_magics); parseStoreEntries(json, "magic", ImHexPath::Magic, this->m_magics);
parseStoreEntries(json, "constants", ImHexPath::Constants, this->m_constants); parseStoreEntries(json, "constants", ImHexPath::Constants, this->m_constants);
parseStoreEntries(json, "yara", ImHexPath::Yara, this->m_yara); parseStoreEntries(json, "yara", ImHexPath::Yara, this->m_yara);
parseStoreEntries(json, "encodings", ImHexPath::Encodings, this->m_encodings);
} }
this->m_apiRequest = { }; this->m_apiRequest = { };
@ -241,26 +235,36 @@ namespace hex::plugin::builtin {
} }
} }
void ViewStore::download(ImHexPath pathType, const std::string &fileName, const std::string &url, bool update) { bool ViewStore::download(ImHexPath pathType, const std::string &fileName, const std::string &url, bool update) {
if (!update) { bool downloading = false;
this->m_downloadPath = hex::getPath(pathType).back() / fs::path(fileName); for (const auto &path : hex::getPath(pathType)) {
this->m_download = this->m_net.downloadFile(url, this->m_downloadPath); auto fullPath = path / fs::path(fileName);
} else { if (!update || fs::exists(fullPath)) {
for (const auto &path : hex::getPath(pathType)) { downloading = true;
auto fullPath = path / fs::path(fileName); this->m_downloadPath = fullPath;
if (fs::exists(fullPath)) { this->m_download = this->m_net.downloadFile(url, fullPath);
this->m_downloadPath = fullPath; break;
this->m_download = this->m_net.downloadFile(url, fullPath);
}
} }
} }
if (!downloading) {
View::showErrorPopup("hex.builtin.view.store.download_error"_lang);
return false;
}
return true;
} }
void ViewStore::remove(ImHexPath pathType, const std::string &fileName) { bool ViewStore::remove(ImHexPath pathType, const std::string &fileName) {
bool removed = false;
for (const auto &path : hex::getPath(pathType)) { for (const auto &path : hex::getPath(pathType)) {
fs::remove(path / fs::path(fileName)); bool removedFile = fs::remove(path / fs::path(fileName));
fs::remove(path / fs::path(fileName).stem()); bool removedFolder = fs::remove(path / fs::path(fileName).stem());
removed = removedFile || removedFolder;
} }
return removed;
} }
} }

View File

@ -348,8 +348,11 @@ namespace hex::plugin::builtin {
{ "hex.builtin.view.store.tab.libraries", "Libraries" }, { "hex.builtin.view.store.tab.libraries", "Libraries" },
{ "hex.builtin.view.store.tab.magics", "Magic Files" }, { "hex.builtin.view.store.tab.magics", "Magic Files" },
{ "hex.builtin.view.store.tab.constants", "Konstanten" }, { "hex.builtin.view.store.tab.constants", "Konstanten" },
{ "hex.builtin.view.store.tab.encodings", "Encodings" },
{ "hex.builtin.view.store.tab.yara", "Yara Rules" }, { "hex.builtin.view.store.tab.yara", "Yara Rules" },
{ "hex.builtin.view.store.loading", "Store inhalt wird geladen..." }, { "hex.builtin.view.store.loading", "Store inhalt wird geladen..." },
{ "hex.builtin.view.store.download_error", "Datei konnte nicht heruntergeladen werden! Zielordner konnte nicht gefunden werden." },
{ "hex.builtin.view.diff.name", "Diffing" }, { "hex.builtin.view.diff.name", "Diffing" },
{ "hex.builtin.view.provider_settings.name", "Provider Einstellungen" }, { "hex.builtin.view.provider_settings.name", "Provider Einstellungen" },

View File

@ -352,7 +352,10 @@ namespace hex::plugin::builtin {
{ "hex.builtin.view.store.tab.magics", "Magic Files" }, { "hex.builtin.view.store.tab.magics", "Magic Files" },
{ "hex.builtin.view.store.tab.constants", "Constants" }, { "hex.builtin.view.store.tab.constants", "Constants" },
{ "hex.builtin.view.store.tab.yara", "Yara Rules" }, { "hex.builtin.view.store.tab.yara", "Yara Rules" },
{ "hex.builtin.view.store.tab.encodings", "Encodings" },
{ "hex.builtin.view.store.loading", "Loading store content..." }, { "hex.builtin.view.store.loading", "Loading store content..." },
{ "hex.builtin.view.store.download_error", "Failed to download file! Destination folder does not exist." },
{ "hex.builtin.view.diff.name", "Diffing" }, { "hex.builtin.view.diff.name", "Diffing" },
{ "hex.builtin.view.provider_settings.name", "Provider Settings" }, { "hex.builtin.view.provider_settings.name", "Provider Settings" },

View File

@ -345,8 +345,11 @@ namespace hex::plugin::builtin {
{ "hex.builtin.view.store.tab.libraries", "Librerie" }, { "hex.builtin.view.store.tab.libraries", "Librerie" },
{ "hex.builtin.view.store.tab.magics", "File Magici" }, { "hex.builtin.view.store.tab.magics", "File Magici" },
{ "hex.builtin.view.store.tab.constants", "Costanti" }, { "hex.builtin.view.store.tab.constants", "Costanti" },
//{ "hex.builtin.view.store.tab.encodings", "Encodings" },
{ "hex.builtin.view.store.tab.yara", "Regole di Yara" }, { "hex.builtin.view.store.tab.yara", "Regole di Yara" },
{ "hex.builtin.view.store.loading", "Caricamento del content store..." }, { "hex.builtin.view.store.loading", "Caricamento del content store..." },
//{ "hex.builtin.view.store.download_error", "Failed to download file! Destination folder does not exist." },
//{ "hex.builtin.view.diff.name", "Diffing" }, //{ "hex.builtin.view.diff.name", "Diffing" },
//{ "hex.builtin.view.provider_settings.name", "Provider Settings" }, //{ "hex.builtin.view.provider_settings.name", "Provider Settings" },

View File

@ -346,7 +346,10 @@ namespace hex::plugin::builtin {
{ "hex.builtin.view.store.tab.magics", "魔术数据库" }, { "hex.builtin.view.store.tab.magics", "魔术数据库" },
{ "hex.builtin.view.store.tab.constants", "常量" }, { "hex.builtin.view.store.tab.constants", "常量" },
{ "hex.builtin.view.store.tab.yara", "Yara规则" }, { "hex.builtin.view.store.tab.yara", "Yara规则" },
{ "hex.builtin.view.store.loading", "正在加载仓库内容..." }, //{ "hex.builtin.view.store.tab.encodings", "Encodings" },
{ "hex.builtin.view.store.loading", "正在加载仓库内容..." },
//{ "hex.builtin.view.store.download_error", "Failed to download file! Destination folder does not exist." },
{ "hex.builtin.view.diff.name", "差异" }, { "hex.builtin.view.diff.name", "差异" },
//{ "hex.builtin.view.provider_settings.name", "Provider Settings" }, //{ "hex.builtin.view.provider_settings.name", "Provider Settings" },