From 88923a06e6fdceb452157b712587176b677bb917 Mon Sep 17 00:00:00 2001 From: Matthew Barth Date: Fri, 11 May 2018 10:14:44 -0500 Subject: Throw DBusPropertyError for all property accesses On all get/set property functions, when an error occurs performing the access of a property, throw a DBusPropertyError exception containing the identifying parameters of the property. Tested: DBusPropertyError exception occurs on failing to set a property DBusPropertyError exception occurs on failing to get a property Change-Id: I9882d62d75153b4320a8d4a21ba7a52efbdd0af2 Signed-off-by: Matthew Barth --- sdbusplus.hpp | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 92 insertions(+), 7 deletions(-) (limited to 'sdbusplus.hpp') diff --git a/sdbusplus.hpp b/sdbusplus.hpp index 5842133..3a6cd65 100644 --- a/sdbusplus.hpp +++ b/sdbusplus.hpp @@ -87,6 +87,34 @@ class DBusServiceError : public DBusError const std::string interface; }; +/** + * @class DBusPropertyError + * + * Thrown when a set/get property fails. + */ +class DBusPropertyError : public DBusError +{ + public: + DBusPropertyError( + const char* msg, + const std::string& busName, + const std::string& path, + const std::string& interface, + const std::string& property) : + DBusError(msg), + busName(busName), + path(path), + interface(interface), + property(property) + { + } + + const std::string busName; + const std::string path; + const std::string interface; + const std::string property; +}; + /** @brief Alias for PropertiesChanged signal callbacks. */ template using Properties = std::map>; @@ -286,14 +314,24 @@ class SDBusPlus { using namespace std::literals::string_literals; + auto service = getService(bus, path, interface); auto msg = callMethod( bus, - getService(bus, path, interface), + service, path, "org.freedesktop.DBus.Properties"s, "Get"s, interface, property); + if (msg.is_method_error()) + { + throw DBusPropertyError{ + "DBus get property failed", + service, + path, + interface, + property}; + } sdbusplus::message::variant value; msg.read(value); return value.template get(); @@ -323,14 +361,24 @@ class SDBusPlus { using namespace std::literals::string_literals; + auto service = getService(bus, path, interface); auto msg = callMethod( bus, - getService(bus, path, interface), + service, path, "org.freedesktop.DBus.Properties"s, "Get"s, interface, property); + if (msg.is_method_error()) + { + throw DBusPropertyError{ + "DBus get property variant failed", + service, + path, + interface, + property}; + } Variant value; msg.read(value); return value; @@ -361,7 +409,7 @@ class SDBusPlus { using namespace std::literals::string_literals; - auto msg = callMethod( + auto msg = callMethodAndReturn( bus, service, path, @@ -369,6 +417,15 @@ class SDBusPlus "Get"s, interface, property); + if (msg.is_method_error()) + { + throw DBusPropertyError{ + "DBus get property failed", + service, + path, + interface, + property}; + } sdbusplus::message::variant value; msg.read(value); return value.template get(); @@ -401,7 +458,7 @@ class SDBusPlus { using namespace std::literals::string_literals; - auto msg = callMethod( + auto msg = callMethodAndReturn( bus, service, path, @@ -409,6 +466,15 @@ class SDBusPlus "Get"s, interface, property); + if (msg.is_method_error()) + { + throw DBusPropertyError{ + "DBus get property variant failed", + service, + path, + interface, + property}; + } Variant value; msg.read(value); return value; @@ -444,15 +510,25 @@ class SDBusPlus sdbusplus::message::variant varValue( std::forward(value)); - callMethod( + auto service = getService(bus, path, interface); + auto msg = callMethodAndReturn( bus, - getService(bus, path, interface), + service, path, "org.freedesktop.DBus.Properties"s, "Set"s, interface, property, varValue); + if (msg.is_method_error()) + { + throw DBusPropertyError{ + "DBus set property failed", + service, + path, + interface, + property}; + } } /** @brief Set a property with mapper lookup. */ @@ -486,7 +562,7 @@ class SDBusPlus sdbusplus::message::variant varValue( std::forward(value)); - callMethod( + auto msg = callMethodAndReturn( bus, service, path, @@ -495,6 +571,15 @@ class SDBusPlus interface, property, varValue); + if (msg.is_method_error()) + { + throw DBusPropertyError{ + "DBus set property failed", + service, + path, + interface, + property}; + } } /** @brief Set a property without mapper lookup. */ -- cgit v1.2.1