xref: /openbmc/boost-dbus/include/dbus/message.hpp (revision 3b5db5bc)
1 // Copyright (c) Benjamin Kietzman (github.com/bkietz)
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #ifndef DBUS_MESSAGE_HPP
7 #define DBUS_MESSAGE_HPP
8 
9 #include <dbus/dbus.h>
10 #include <dbus/element.hpp>
11 #include <boost/intrusive_ptr.hpp>
12 
13 void intrusive_ptr_add_ref(DBusMessage *m)
14 {
15   dbus_message_ref(m);
16 }
17 
18 void intrusive_ptr_release(DBusMessage *m)
19 {
20   dbus_message_unref(m);
21 }
22 
23 namespace dbus {
24 
25 class message
26 {
27   boost::intrusive_ptr<DBusMessage> message_;
28 public:
29   uint32 serial;
30 
31   /// Create a method call message
32   static message new_call(
33       const string& process_name,
34       const string& object_path,
35       const string& interface_name,
36       const string& method_name);
37 
38   /// Create a method return message
39   static message new_return();
40 
41   /// Create an error message
42   static message new_error();
43 
44   /// Create a signal message
45   static message new_signal();
46 
47   message() {}
48 
49   message(DBusMessage *m)
50     : message_(dbus_message_ref(m))
51   {
52   }
53 
54   operator DBusMessage *()
55   {
56     return message_.get();
57   }
58 
59   operator const DBusMessage *() const
60   {
61     return message_.get();
62   }
63 
64   string get_path() const
65   {
66     return dbus_message_get_path(message_.get());
67   }
68 
69   string get_interface() const
70   {
71     return dbus_message_get_interface(message_.get());
72   }
73 
74   string get_member() const
75   {
76     return dbus_message_get_member(message_.get());
77   }
78 
79   string get_sender() const
80   {
81     return dbus_message_get_sender(message_.get());
82   }
83 
84   string get_destination() const
85   {
86     return dbus_message_get_destination(message_.get());
87   }
88 
89   struct packer
90   {
91     packer(message&);
92     DBusMessageIter iter_;
93     template<typename Element> packer& pack(const Element&);
94     template<typename Element> packer& pack_array(const Element*, size_t);
95   };
96   struct unpacker
97   {
98     unpacker(message&);
99     DBusMessageIter iter_;
100     /// return type code of the next element in line for unpacking
101     int code();
102     template<typename Element> unpacker& unpack(Element&);
103     int array_code();
104     template<typename Element> unpacker& unpack_array(Element*&, size_t);
105   };
106 
107   template<typename Element> packer pack(const Element&);
108   template<typename Element> unpacker unpack(Element&);
109 
110 };
111 
112 } // namespace dbus
113 
114 #include <dbus/impl/packer.ipp>
115 #include <dbus/impl/unpacker.ipp>
116 #include <dbus/impl/message.ipp>
117 
118 #endif // DBUS_MESSAGE_HPP
119