191cdbe46SBenjamin Kietzman // Copyright (c) Benjamin Kietzman (github.com/bkietz) 291cdbe46SBenjamin Kietzman // 391cdbe46SBenjamin Kietzman // Distributed under the Boost Software License, Version 1.0. (See accompanying 491cdbe46SBenjamin Kietzman // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 591cdbe46SBenjamin Kietzman 6e6b71ae1SBenjamin Kietzman #ifndef DBUS_ERROR_HPP 7e6b71ae1SBenjamin Kietzman #define DBUS_ERROR_HPP 8e6b71ae1SBenjamin Kietzman 9cd8b76a3SBenjamin Kietzman #include <dbus/dbus.h> 1016d80fe9SBenjamin Kietzman #include <dbus/element.hpp> 11e6b71ae1SBenjamin Kietzman #include <dbus/message.hpp> 12cd8b76a3SBenjamin Kietzman #include <boost/system/error_code.hpp> 13cd8b76a3SBenjamin Kietzman #include <boost/system/system_error.hpp> 14cd8b76a3SBenjamin Kietzman 15cd8b76a3SBenjamin Kietzman namespace dbus { 16cd8b76a3SBenjamin Kietzman 1747de18d4SEd Tanous namespace detail { 1847de18d4SEd Tanous 1947de18d4SEd Tanous class error_category : public boost::system::error_category { name() const2047de18d4SEd Tanous const char *name() const BOOST_SYSTEM_NOEXCEPT { return "dbus.error"; } 2147de18d4SEd Tanous message(int value) const2247de18d4SEd Tanous string message(int value) const { 2347de18d4SEd Tanous if (value) 2447de18d4SEd Tanous return "DBus error"; 2547de18d4SEd Tanous else 2647de18d4SEd Tanous return "no error"; 2747de18d4SEd Tanous } 2847de18d4SEd Tanous }; 2947de18d4SEd Tanous 3047de18d4SEd Tanous } // namespace detail 3147de18d4SEd Tanous get_dbus_category()3247de18d4SEd Tanousinline const boost::system::error_category &get_dbus_category() { 3347de18d4SEd Tanous static detail::error_category instance; 3447de18d4SEd Tanous return instance; 3547de18d4SEd Tanous } 3647de18d4SEd Tanous 3747de18d4SEd Tanous class error { 3885860989SBenjamin Kietzman DBusError error_; 39cd8b76a3SBenjamin Kietzman 40cd8b76a3SBenjamin Kietzman public: error()41*77e62c83SEd Tanous error() { 42*77e62c83SEd Tanous dbus_error_init(&error_); 43*77e62c83SEd Tanous } 44cd8b76a3SBenjamin Kietzman error(DBusError * src)45da3eeb6aSEd Tanous error(DBusError *src) { 4685860989SBenjamin Kietzman dbus_error_init(&error_); 47e6b71ae1SBenjamin Kietzman dbus_move_error(src, &error_); 48e6b71ae1SBenjamin Kietzman } 49e6b71ae1SBenjamin Kietzman error(dbus::message & m)50da3eeb6aSEd Tanous error(dbus::message &m) { 51e6b71ae1SBenjamin Kietzman dbus_error_init(&error_); 52e6b71ae1SBenjamin Kietzman dbus_set_error_from_message(&error_, m); 5385860989SBenjamin Kietzman } 5485860989SBenjamin Kietzman ~error()55*77e62c83SEd Tanous ~error() { 56*77e62c83SEd Tanous if (is_set()) { 57*77e62c83SEd Tanous dbus_error_free(&error_); 58*77e62c83SEd Tanous } 59*77e62c83SEd Tanous } 6085860989SBenjamin Kietzman is_set() const61da3eeb6aSEd Tanous bool is_set() const { return dbus_error_is_set(&error_); } 6285860989SBenjamin Kietzman operator const DBusError*() const63da3eeb6aSEd Tanous operator const DBusError *() const { return &error_; } 6485860989SBenjamin Kietzman operator DBusError*()65da3eeb6aSEd Tanous operator DBusError *() { return &error_; } 6685860989SBenjamin Kietzman 674317e4d9SBenjamin Kietzman boost::system::error_code error_code() const; 684317e4d9SBenjamin Kietzman boost::system::system_error system_error() const; 694317e4d9SBenjamin Kietzman void throw_if_set() const; 70cd8b76a3SBenjamin Kietzman }; 71cd8b76a3SBenjamin Kietzman error_code() const72da3eeb6aSEd Tanousinline boost::system::error_code error::error_code() const { 7347de18d4SEd Tanous return boost::system::error_code(is_set(), get_dbus_category()); 7485860989SBenjamin Kietzman } 7585860989SBenjamin Kietzman system_error() const76da3eeb6aSEd Tanousinline boost::system::system_error error::system_error() const { 7747de18d4SEd Tanous return boost::system::system_error( 7847de18d4SEd Tanous error_code(), string(error_.name) + ":" + error_.message); 7985860989SBenjamin Kietzman } 8085860989SBenjamin Kietzman throw_if_set() const81da3eeb6aSEd Tanousinline void error::throw_if_set() const { 8285860989SBenjamin Kietzman if (is_set()) throw system_error(); 8385860989SBenjamin Kietzman } 8485860989SBenjamin Kietzman 85cd8b76a3SBenjamin Kietzman } // namespace dbus 86e6b71ae1SBenjamin Kietzman 87e6b71ae1SBenjamin Kietzman #endif // DBUS_ERROR_HPP