Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
2.4 kB · 84 lines
C++
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485#include "OpdsServerStore.h"
#include <Logging.h>#include <ObfuscationUtils.h>
#include <algorithm>#include <cstring>
void OpdsServerStore::toJson(JsonDocument& doc) const { JsonArray arr = doc["servers"].to<JsonArray>(); for (const auto& server : servers) { JsonObject obj = arr.add<JsonObject>(); obj["name"] = server.name; obj["url"] = server.url; obj["username"] = server.username; obj["password_obf"] = obfuscation::obfuscateToBase64(server.password); }}
bool OpdsServerStore::fromJson(JsonVariantConst doc) { // Tolerate a missing/invalid 'servers' key (treat as empty list); only a // JSON parse error is fatal. A null JsonArray iterates zero times. servers.clear(); JsonArrayConst arr = doc["servers"].as<JsonArrayConst>(); servers.reserve(std::min(arr.size(), MAX_SERVERS)); bool needsResave = false;
for (JsonObjectConst obj : arr) { if (servers.size() >= OpdsServerStore::MAX_SERVERS) break; OpdsServer server; server.name = obj["name"] | ""; server.url = obj["url"] | ""; server.username = obj["username"] | ""; server.password = extractPassword(obj, needsResave); servers.push_back(std::move(server)); }
LOG_DBG("OPS", "Loaded %zu OPDS servers from file", servers.size());
if (needsResave) { LOG_DBG("OPS", "Resaving JSON with obfuscated passwords"); requestResave(); }
return true;}
bool OpdsServerStore::addServer(const OpdsServer& server) { if (servers.size() >= MAX_SERVERS) { LOG_DBG("OPS", "Cannot add more servers, limit of %zu reached", MAX_SERVERS); return false; }
servers.push_back(server); LOG_DBG("OPS", "Added server: %s", server.name.c_str()); return saveToFile();}
bool OpdsServerStore::updateServer(size_t index, const OpdsServer& server) { if (index >= servers.size()) { return false; }
servers[index] = server; LOG_DBG("OPS", "Updated server: %s", server.name.c_str()); return saveToFile();}
bool OpdsServerStore::removeServer(size_t index) { if (index >= servers.size()) { return false; }
LOG_DBG("OPS", "Removed server: %s", servers[index].name.c_str()); servers.erase(servers.begin() + static_cast<ptrdiff_t>(index)); return saveToFile();}
const OpdsServer* OpdsServerStore::getServer(size_t index) const { if (index >= servers.size()) { return nullptr; } return &servers[index];}