From ecb04c6b7fbf5d06c2fdce5128e83575cac2bd21 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Fri, 23 May 2025 17:06:02 +0200 Subject: Web version (work in progress) --- web/storage.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 web/storage.cpp (limited to 'web/storage.cpp') diff --git a/web/storage.cpp b/web/storage.cpp new file mode 100644 index 0000000..4be3066 --- /dev/null +++ b/web/storage.cpp @@ -0,0 +1,67 @@ +#include "storage.h" + +#include "emscripten.h" +#include +#include + +EM_JS(int, inbrowser, (), { return typeof window !== 'undefined'; }); +EM_JS(int, inworker, (), { return typeof WorkerGlobalScope !== 'undefined' && + self instanceof WorkerGlobalScope; }); + +std::string getprefix() { + return inbrowser() || inworker() ? "/tables/" : "./tables/"; +} + +EM_ASYNC_JS(int, loadfs, (), { + const dir = '/tables'; + const inBrowser = typeof window !== 'undefined'; + const inWorker = typeof WorkerGlobalScope !== 'undefined' && + self instanceof WorkerGlobalScope; + + if (!(inBrowser || inWorker)) return; + + if (!FS.analyzePath(dir).exists) + FS.mkdir(dir); + + if (FS.analyzePath(dir).object.mount.mountpoint != dir) { + FS.mount(IDBFS, { autoPersist: true }, dir); + + await new Promise((resolve, reject) => { + FS.syncfs(true, function (err) { + if (err) { + reject(err); + } else { + resolve(true); + } + }); + }); + } +}); + +bool storage::read(std::string key, size_t data_size, char *data) +{ + loadfs(); + + std::filesystem::path path(getprefix() + key); + if (!std::filesystem::exists(path)) + return false; + + std::ifstream ifs(path, std::ios::binary); + ifs.read(data, data_size); + ifs.close(); + + return !ifs.fail(); +} + +bool storage::write(std::string key, size_t data_size, const char *data) +{ + loadfs(); + + std::filesystem::path path(getprefix() + key); + + std::ofstream ofs(path, std::ios::binary); + ofs.write(data, data_size); + ofs.close(); + + return !ofs.fail(); +} -- cgit v1.3