1 #include <net/poettering/Calculator/aserver.hpp> 2 #include <sdbusplus/async.hpp> 3 4 class 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 16 auto get_property(last_result_t) const 17 { 18 return _last_result; 19 } 20 21 bool set_property(last_result_t, int64_t v) 22 { 23 if (v % 2 == 0) 24 { 25 std::swap(_last_result, v); 26 return v != _last_result; 27 } 28 return false; 29 } 30 31 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 52 private: 53 auto startup() -> sdbusplus::async::task<> 54 { 55 last_result(123); 56 ctx.get_bus().request_name("net.poettering.Calculator"); 57 58 status(State::Error); 59 60 while (!ctx.stop_requested()) 61 { 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 73 int main() 74 { 75 sdbusplus::async::context ctx; 76 [[maybe_unused]] Calculator c(ctx); 77 78 ctx.run(); 79 80 return 0; 81 } 82