From 05ecd0105d4e723517bc269c9b42bc650743ee89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Wed, 20 Jan 2021 20:51:10 +0100 Subject: Changing local state via service context --- include/erebos/service.h | 4 ++++ src/network.cpp | 24 +++++++++++++++--------- src/service.cpp | 10 ++++++++++ src/service.h | 1 + 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/include/erebos/service.h b/include/erebos/service.h index 2d6fbce..fa7f105 100644 --- a/include/erebos/service.h +++ b/include/erebos/service.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -22,6 +23,9 @@ public: const class Ref & ref() const; const class Peer & peer() const; + const Stored & local() const; + void local(const LocalState &); + private: std::unique_ptr p; }; diff --git a/src/network.cpp b/src/network.cpp index eab0f67..c0bcc2a 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -550,16 +550,22 @@ void Server::Peer::updateService(ReplyBuilder & reply) for (auto & x : serviceQueue) { if (auto ref = std::get<1>(x)->check(reply)) { if (lpeer) { - Service::Context ctx(new Service::Context::Priv { - .ref = *ref, - .peer = erebos::Peer(lpeer), - }); - - for (auto & svc : server.services) - if (svc->uuid() == std::get(x)) { - svc->handle(ctx); - break; + server.localHead.update([&] (const Stored & local) { + Service::Context ctx(new Service::Context::Priv { + .ref = *ref, + .peer = erebos::Peer(lpeer), + .local = local, + }); + + for (auto & svc : server.services) { + if (svc->uuid() == std::get(x)) { + svc->handle(ctx); + break; + } } + + return ctx.local(); + }); } } else { next.push_back(std::move(x)); diff --git a/src/service.cpp b/src/service.cpp index f8217c8..c731990 100644 --- a/src/service.cpp +++ b/src/service.cpp @@ -23,3 +23,13 @@ const Peer & Service::Context::peer() const { return p->peer; } + +const Stored & Service::Context::local() const +{ + return p->local; +} + +void Service::Context::local(const LocalState & ls) +{ + p->local = p->local.ref().storage().store(ls); +} diff --git a/src/service.h b/src/service.h index 9980471..5296bb3 100644 --- a/src/service.h +++ b/src/service.h @@ -9,6 +9,7 @@ struct Service::Context::Priv { Ref ref; Peer peer; + Stored local; }; } -- cgit v1.2.3