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