xref: /openbmc/sdbusplus/example/calculator-aserver.cpp (revision e15ff88b78965d6048148468f5208d3738cb24af)
1bf0283aeSPatrick Williams #include <net/poettering/Calculator/aserver.hpp>
2bf0283aeSPatrick Williams #include <sdbusplus/async.hpp>
3bf0283aeSPatrick Williams 
4bf0283aeSPatrick Williams class Calculator :
5bf0283aeSPatrick Williams     public sdbusplus::aserver::net::poettering::Calculator<Calculator>
6bf0283aeSPatrick Williams {
7bf0283aeSPatrick Williams   public:
8bf0283aeSPatrick Williams     explicit Calculator(sdbusplus::async::context& ctx) :
9bf0283aeSPatrick Williams         sdbusplus::aserver::net::poettering::Calculator<Calculator>(
10bf0283aeSPatrick Williams             ctx, "/net/poettering/calculator"),
11bf0283aeSPatrick Williams         manager(ctx, "/")
12bf0283aeSPatrick Williams     {
13bf0283aeSPatrick Williams         ctx.spawn(startup());
14bf0283aeSPatrick Williams     }
15bf0283aeSPatrick Williams 
16f84f1117SPatrick Williams     auto get_property(last_result_t) const
17f84f1117SPatrick Williams     {
18f07cad93SPatrick Williams         return _last_result;
19f84f1117SPatrick Williams     }
20f84f1117SPatrick Williams 
21f07cad93SPatrick Williams     bool set_property(last_result_t, int64_t v)
2272f7116aSPatrick Williams     {
23f07cad93SPatrick Williams         if (v % 2 == 0)
24f07cad93SPatrick Williams         {
25f07cad93SPatrick Williams             std::swap(_last_result, v);
26f07cad93SPatrick Williams             return v != _last_result;
27f07cad93SPatrick Williams         }
2872f7116aSPatrick Williams         return false;
2972f7116aSPatrick Williams     }
3072f7116aSPatrick Williams 
31*e15ff88bSPatrick Williams     auto method_call(multiply_t, auto x, auto y)
32*e15ff88bSPatrick Williams     {
33*e15ff88bSPatrick Williams         auto r = x * y;
34*e15ff88bSPatrick Williams         last_result(r);
35*e15ff88bSPatrick Williams         return r;
36*e15ff88bSPatrick Williams     }
37*e15ff88bSPatrick Williams 
38*e15ff88bSPatrick Williams     auto method_call(divide_t, auto x, auto y)
39*e15ff88bSPatrick Williams         -> sdbusplus::async::task<divide_t::return_type>
40*e15ff88bSPatrick Williams     {
41*e15ff88bSPatrick Williams         auto r = x / y;
42*e15ff88bSPatrick Williams         last_result(r);
43*e15ff88bSPatrick Williams         co_return r;
44*e15ff88bSPatrick Williams     }
45*e15ff88bSPatrick Williams 
46*e15ff88bSPatrick Williams     auto method_call(clear_t) -> sdbusplus::async::task<>
47*e15ff88bSPatrick Williams     {
48*e15ff88bSPatrick Williams         last_result(0);
49*e15ff88bSPatrick Williams         co_return;
50*e15ff88bSPatrick Williams     }
51*e15ff88bSPatrick Williams 
52bf0283aeSPatrick Williams   private:
53bf0283aeSPatrick Williams     auto startup() -> sdbusplus::async::task<>
54bf0283aeSPatrick Williams     {
55f07cad93SPatrick Williams         last_result(123);
56bf0283aeSPatrick Williams         ctx.get_bus().request_name("net.poettering.Calculator");
57bf0283aeSPatrick Williams 
5872f7116aSPatrick Williams         status(State::Error);
5972f7116aSPatrick Williams 
60*e15ff88bSPatrick Williams         while (!ctx.stop_requested())
61bf0283aeSPatrick Williams         {
62bf0283aeSPatrick Williams             using namespace std::literals;
63bf0283aeSPatrick Williams             co_await sdbusplus::async::sleep_for(ctx, 10s);
64bf0283aeSPatrick Williams 
65bf0283aeSPatrick Williams             cleared(42);
66bf0283aeSPatrick Williams         }
67bf0283aeSPatrick Williams         co_return;
68bf0283aeSPatrick Williams     }
69bf0283aeSPatrick Williams 
70bf0283aeSPatrick Williams     sdbusplus::server::manager_t manager;
71bf0283aeSPatrick Williams };
72bf0283aeSPatrick Williams 
73bf0283aeSPatrick Williams int main()
74bf0283aeSPatrick Williams {
75bf0283aeSPatrick Williams     sdbusplus::async::context ctx;
76bf0283aeSPatrick Williams     [[maybe_unused]] Calculator c(ctx);
77bf0283aeSPatrick Williams 
78bf0283aeSPatrick Williams     ctx.run();
79bf0283aeSPatrick Williams 
80bf0283aeSPatrick Williams     return 0;
81bf0283aeSPatrick Williams }
82