blob: 6dc8579039b8956d4ec7fc5f629feecd195e2ce2 [file] [log] [blame]
Patrick Williamsbf0283a2023-08-19 07:18:04 -05001#include <net/poettering/Calculator/aserver.hpp>
2#include <sdbusplus/async.hpp>
3
4class Calculator :
5 public sdbusplus::aserver::net::poettering::Calculator<Calculator>
6{
7 public:
8 explicit Calculator(sdbusplus::async::context& ctx) :
9 sdbusplus::aserver::net::poettering::Calculator<Calculator>(
10 ctx, "/net/poettering/calculator"),
11 manager(ctx, "/")
12 {
13 ctx.spawn(startup());
14 }
15
Patrick Williamsf84f1112023-08-20 19:03:08 -050016 auto get_property(last_result_t) const
17 {
Patrick Williamsf07cad92023-08-21 14:41:19 -050018 return _last_result;
Patrick Williamsf84f1112023-08-20 19:03:08 -050019 }
20
Patrick Williamsf07cad92023-08-21 14:41:19 -050021 bool set_property(last_result_t, int64_t v)
Patrick Williams72f71162023-08-20 21:36:14 -050022 {
Patrick Williamsf07cad92023-08-21 14:41:19 -050023 if (v % 2 == 0)
24 {
25 std::swap(_last_result, v);
26 return v != _last_result;
27 }
Patrick Williams72f71162023-08-20 21:36:14 -050028 return false;
29 }
30
Patrick Williamse15ff882023-08-22 16:59:16 -050031 auto method_call(multiply_t, auto x, auto y)
32 {
33 auto r = x * y;
34 last_result(r);
35 return r;
36 }
37
38 auto method_call(divide_t, auto x, auto y)
39 -> sdbusplus::async::task<divide_t::return_type>
40 {
41 auto r = x / y;
42 last_result(r);
43 co_return r;
44 }
45
46 auto method_call(clear_t) -> sdbusplus::async::task<>
47 {
48 last_result(0);
49 co_return;
50 }
51
Patrick Williamsbf0283a2023-08-19 07:18:04 -050052 private:
53 auto startup() -> sdbusplus::async::task<>
54 {
Patrick Williamsf07cad92023-08-21 14:41:19 -050055 last_result(123);
Patrick Williamsbf0283a2023-08-19 07:18:04 -050056 ctx.get_bus().request_name("net.poettering.Calculator");
57
Patrick Williams72f71162023-08-20 21:36:14 -050058 status(State::Error);
59
Patrick Williamse15ff882023-08-22 16:59:16 -050060 while (!ctx.stop_requested())
Patrick Williamsbf0283a2023-08-19 07:18:04 -050061 {
62 using namespace std::literals;
63 co_await sdbusplus::async::sleep_for(ctx, 10s);
64
65 cleared(42);
66 }
67 co_return;
68 }
69
70 sdbusplus::server::manager_t manager;
71};
72
73int main()
74{
75 sdbusplus::async::context ctx;
76 [[maybe_unused]] Calculator c(ctx);
77
78 ctx.run();
79
80 return 0;
81}