blob: 2d0efcacd4e265bb8f6eec4808e059b7f72796fc [file] [log] [blame]
Lei YUddc0eba2020-02-13 16:26:46 +08001#include <net/poettering/Calculator/client.hpp>
Patrick Venture95269db2018-08-31 09:19:17 -07002#include <net/poettering/Calculator/server.hpp>
3#include <sdbusplus/server.hpp>
Patrick Williams127b8ab2020-05-21 15:24:19 -05004
5#include <iostream>
Lei YUddc0eba2020-02-13 16:26:46 +08006#include <string_view>
Patrick Williams4edb7852017-07-03 11:50:11 -05007
Andrew Geissler072da3e2018-01-18 07:21:42 -08008using Calculator_inherit =
Patrick Williams50113402023-03-18 15:29:32 -05009 sdbusplus::server::object_t<sdbusplus::server::net::poettering::Calculator>;
Patrick Williams4edb7852017-07-03 11:50:11 -050010
11/** Example implementation of net.poettering.Calculator */
12struct Calculator : Calculator_inherit
13{
14 /** Constructor */
Patrick Williams0f282c42021-11-19 11:36:18 -060015 Calculator(sdbusplus::bus_t& bus, const char* path) :
Andrew Geissler072da3e2018-01-18 07:21:42 -080016 Calculator_inherit(bus, path)
Patrick Williams127b8ab2020-05-21 15:24:19 -050017 {}
Patrick Williams4edb7852017-07-03 11:50:11 -050018
19 /** Multiply (x*y), update lastResult */
20 int64_t multiply(int64_t x, int64_t y) override
21 {
Andrew Geissler072da3e2018-01-18 07:21:42 -080022 return lastResult(x * y);
Patrick Williams4edb7852017-07-03 11:50:11 -050023 }
24
25 /** Divide (x/y), update lastResult
26 *
27 * Throws DivisionByZero on error.
28 */
29 int64_t divide(int64_t x, int64_t y) override
30 {
Patrick Williamsd731d262024-09-17 14:24:08 -040031 using sdbusplus::error::net::poettering::Calculator::DivisionByZero;
Patrick Williams4edb7852017-07-03 11:50:11 -050032 if (y == 0)
33 {
34 status(State::Error);
35 throw DivisionByZero();
36 }
37
Andrew Geissler072da3e2018-01-18 07:21:42 -080038 return lastResult(x / y);
Patrick Williams4edb7852017-07-03 11:50:11 -050039 }
40
41 /** Clear lastResult, broadcast 'Cleared' signal */
42 void clear() override
43 {
44 auto v = lastResult();
45 lastResult(0);
46 cleared(v);
47 return;
48 }
49};
50
51int main()
52{
Patrick Williams4edb7852017-07-03 11:50:11 -050053 // Create a new bus and affix an object manager for the subtree path we
54 // intend to place objects at..
55 auto b = sdbusplus::bus::new_default();
Patrick Williamsb4bae8f2023-09-01 10:13:19 -050056 sdbusplus::server::manager_t m{b, Calculator::instance_path};
Patrick Williams4edb7852017-07-03 11:50:11 -050057
58 // Reserve the dbus service name : net.poettering.Calculator
Patrick Williamsb4bae8f2023-09-01 10:13:19 -050059 b.request_name(Calculator::default_service);
Patrick Williams4edb7852017-07-03 11:50:11 -050060
61 // Create a calculator object at /net/poettering/calculator
Patrick Williamsb4bae8f2023-09-01 10:13:19 -050062 Calculator c1{b, Calculator::instance_path};
Patrick Williams4edb7852017-07-03 11:50:11 -050063
64 // Handle dbus processing forever.
Nan Zhou25e2a092022-09-01 03:47:19 +000065 b.process_loop();
Patrick Williams4edb7852017-07-03 11:50:11 -050066}