blob: c31fc1919d1b620c24c2204c609b31e628dc100c [file] [log] [blame]
Lei YUddc0eba2020-02-13 16:26:46 +08001#include <net/poettering/Calculator/client.hpp>
Patrick Williams4edb7852017-07-03 11:50:11 -05002#include <net/poettering/Calculator/error.hpp>
Patrick Venture95269db2018-08-31 09:19:17 -07003#include <net/poettering/Calculator/server.hpp>
4#include <sdbusplus/server.hpp>
Patrick Williams127b8ab2020-05-21 15:24:19 -05005
6#include <iostream>
Lei YUddc0eba2020-02-13 16:26:46 +08007#include <string_view>
Patrick Williams4edb7852017-07-03 11:50:11 -05008
Andrew Geissler072da3e2018-01-18 07:21:42 -08009using Calculator_inherit =
10 sdbusplus::server::object_t<sdbusplus::net::poettering::server::Calculator>;
Patrick Williams4edb7852017-07-03 11:50:11 -050011
12/** Example implementation of net.poettering.Calculator */
13struct Calculator : Calculator_inherit
14{
15 /** Constructor */
Patrick Williams0f282c42021-11-19 11:36:18 -060016 Calculator(sdbusplus::bus_t& bus, const char* path) :
Andrew Geissler072da3e2018-01-18 07:21:42 -080017 Calculator_inherit(bus, path)
Patrick Williams127b8ab2020-05-21 15:24:19 -050018 {}
Patrick Williams4edb7852017-07-03 11:50:11 -050019
20 /** Multiply (x*y), update lastResult */
21 int64_t multiply(int64_t x, int64_t y) override
22 {
Andrew Geissler072da3e2018-01-18 07:21:42 -080023 return lastResult(x * y);
Patrick Williams4edb7852017-07-03 11:50:11 -050024 }
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
Andrew Geissler072da3e2018-01-18 07:21:42 -080039 return lastResult(x / y);
Patrick Williams4edb7852017-07-03 11:50:11 -050040 }
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
52int main()
53{
54 // Define a dbus path location to place the object.
55 constexpr auto path = "/net/poettering/calculator";
56
Lei YUddc0eba2020-02-13 16:26:46 +080057 static_assert(
58 std::string_view(
59 sdbusplus::net::poettering::client::Calculator::interface) ==
60 std::string_view(Calculator::interface));
61
Patrick Williams4edb7852017-07-03 11:50:11 -050062 // 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.
Andrew Geissler072da3e2018-01-18 07:21:42 -080074 while (1)
Patrick Williams4edb7852017-07-03 11:50:11 -050075 {
76 b.process_discard(); // discard any unhandled messages
77 b.wait();
78 }
79
80 return 0;
81}