1 #include <net/poettering/Calculator/client.hpp>
2 #include <net/poettering/Calculator/error.hpp>
3 #include <net/poettering/Calculator/server.hpp>
4 #include <sdbusplus/server.hpp>
5 
6 #include <iostream>
7 #include <string_view>
8 
9 using Calculator_inherit =
10     sdbusplus::server::object_t<sdbusplus::net::poettering::server::Calculator>;
11 
12 /** Example implementation of net.poettering.Calculator */
13 struct Calculator : Calculator_inherit
14 {
15     /** Constructor */
16     Calculator(sdbusplus::bus_t& bus, const char* path) :
17         Calculator_inherit(bus, path)
18     {}
19 
20     /** Multiply (x*y), update lastResult */
21     int64_t multiply(int64_t x, int64_t y) override
22     {
23         return lastResult(x * y);
24     }
25 
26     /** Divide (x/y), update lastResult
27      *
28      *  Throws DivisionByZero on error.
29      */
30     int64_t divide(int64_t x, int64_t y) override
31     {
32         using sdbusplus::net::poettering::Calculator::Error::DivisionByZero;
33         if (y == 0)
34         {
35             status(State::Error);
36             throw DivisionByZero();
37         }
38 
39         return lastResult(x / y);
40     }
41 
42     /** Clear lastResult, broadcast 'Cleared' signal */
43     void clear() override
44     {
45         auto v = lastResult();
46         lastResult(0);
47         cleared(v);
48         return;
49     }
50 };
51 
52 int main()
53 {
54     // Define a dbus path location to place the object.
55     constexpr auto path = "/net/poettering/calculator";
56 
57     static_assert(
58         std::string_view(
59             sdbusplus::net::poettering::client::Calculator::interface) ==
60         std::string_view(Calculator::interface));
61 
62     // Create a new bus and affix an object manager for the subtree path we
63     // intend to place objects at..
64     auto b = sdbusplus::bus::new_default();
65     sdbusplus::server::manager_t m{b, path};
66 
67     // Reserve the dbus service name : net.poettering.Calculator
68     b.request_name("net.poettering.Calculator");
69 
70     // Create a calculator object at /net/poettering/calculator
71     Calculator c1{b, path};
72 
73     // Handle dbus processing forever.
74     while (1)
75     {
76         b.process_discard(); // discard any unhandled messages
77         b.wait();
78     }
79 
80     return 0;
81 }
82