xref: /openbmc/boost-dbus/include/dbus/error.hpp (revision 77e62c83d54e15716b16dcaae403b273665f0d50)
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 Tanous inline 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 Tanous inline 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 Tanous inline 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 Tanous inline 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