#include #include #include #include #include #include "NomadNetStorage.h" using namespace UI::LXMF::NomadNet; struct ScriptedStorage final : NomadNetStorage { bool available=true, busy=false, full=false, open=false, aborted=false, committed=false, poisoned=false; std::size_t max_write=SIZE_MAX; bool zero_progress=false; std::vector bytes; bool isAvailable() const override { return available; } StorageResult beginRead(const char*, uint32_t& size) override { if(!available)return StorageResult::UNAVAILABLE; size=bytes.size();open=true;return StorageResult::OK; } StorageResult readChunk(uint8_t* out,std::size_t cap,std::size_t& count) override { if(busy)return StorageResult::BUSY; count=std::min(cap,bytes.size());std::memcpy(out,bytes.data(),count);return StorageResult::OK; } StorageResult endRead() override {open=false;return StorageResult::OK;} StorageResult beginWrite(const char*) override { if(!available)return StorageResult::UNAVAILABLE;if(busy)return StorageResult::BUSY;if(full)return StorageResult::FULL;open=true;poisoned=false;bytes.clear();return StorageResult::OK; } StorageResult writeChunk(const uint8_t* data,std::size_t size,std::size_t& written) override { if(busy){written=0;poisoned=true;return StorageResult::BUSY;}if(full){written=0;poisoned=true;return StorageResult::FULL;}if(zero_progress){written=0;poisoned=true;return StorageResult::NO_PROGRESS;}written=std::min(size,max_write);bytes.insert(bytes.end(),data,data+written);if(written!=size)poisoned=true;return written==size?StorageResult::OK:StorageResult::PARTIAL_WRITE; } StorageResult commitWrite() override { if(!open||poisoned)return StorageResult::INVALID_STATE;open=false;committed=true;return StorageResult::OK; } StorageResult abortWrite() override {open=false;poisoned=false;aborted=true;return StorageResult::OK;} StorageResult remove(const char*) override{return StorageResult::OK;} StorageResult rename(const char*,const char*) override{return StorageResult::OK;} StorageResult stat(const char*,uint32_t&) override{return StorageResult::MISS;} StorageResult beginList(const char*) override{return StorageResult::OK;} StorageResult nextList(char*,std::size_t,bool& done) override{done=true;return StorageResult::OK;} StorageResult endList() override{return StorageResult::OK;} }; int main(){int failed=0;auto check=[&](bool c,const char*n){if(!c){++failed;std::cerr<<"FAIL: "<