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