diff --git a/examples/echo/README b/examples/echo/README
index 5aa10b2..0422415 100644
--- a/examples/echo/README
+++ b/examples/echo/README
@@ -7,3 +7,5 @@ dbus-send --dest=org.freedesktop.DBus.Examples.Echo --type=method_call --print-r
dbus-send --dest=org.freedesktop.DBus.Examples.Echo --type=method_call --print-reply /org/freedesktop/DBus/Examples/Echo org.freedesktop.DBus.EchoDemo.Hello string:"world"
dbus-send --dest=org.freedesktop.DBus.Examples.Echo --type=method_call --print-reply /org/freedesktop/DBus/Examples/Echo org.freedesktop.DBus.EchoDemo.Sum array:int32:10,100,250
+
+dbus-send --dest=org.freedesktop.DBus.Examples.Echo --type=method_call --print-reply /org/freedesktop/DBus/Examples/Echo org.freedesktop.DBus.EchoDemo.Info
diff --git a/examples/echo/echo-introspect.xml b/examples/echo/echo-introspect.xml
index a8b43ad..be04755 100644
--- a/examples/echo/echo-introspect.xml
+++ b/examples/echo/echo-introspect.xml
@@ -19,5 +19,8 @@
+
+
+
diff --git a/examples/echo/echo-server.cpp b/examples/echo/echo-server.cpp
index b862e2d..d0716d7 100644
--- a/examples/echo/echo-server.cpp
+++ b/examples/echo/echo-server.cpp
@@ -1,4 +1,5 @@
#include "echo-server.h"
+#include
#include
#include
@@ -36,6 +37,18 @@ DBus::Int32 EchoServer::Sum( const std::vector& ints )
return sum;
}
+std::map< DBus::String, DBus::String > EchoServer::Info()
+{
+ std::map< DBus::String, DBus::String > info;
+ char hostname[HOST_NAME_MAX];
+
+ gethostname(hostname, sizeof(hostname));
+ info["hostname"] = hostname;
+ info["username"] = getlogin();
+
+ return info;
+}
+
DBus::BusDispatcher dispatcher;
diff --git a/examples/echo/echo-server.h b/examples/echo/echo-server.h
index 107de5a..5d3de8c 100644
--- a/examples/echo/echo-server.h
+++ b/examples/echo/echo-server.h
@@ -20,6 +20,8 @@ public:
DBus::Variant Echo( const DBus::Variant & value );
DBus::Int32 Sum( const std::vector & ints );
+
+ std::map< DBus::String, DBus::String > Info();
};
#endif//__DEMO_ECHO_SERVER_H
diff --git a/include/dbus-c++/message.h b/include/dbus-c++/message.h
index 8e4017e..0d382e1 100644
--- a/include/dbus-c++/message.h
+++ b/include/dbus-c++/message.h
@@ -113,20 +113,20 @@ public:
int get_array( void* ptr );
- MessageIter new_array( const char* sig );
+ int array_length();
bool is_array();
- int array_length();
-
- MessageIter new_dict_entry();
-
bool is_dict();
+ MessageIter new_array( const char* sig );
+
MessageIter new_variant( const char* sig );
MessageIter new_struct();
+ MessageIter new_dict_entry();
+
void close_container( MessageIter& container );
void copy_data( MessageIter& to );
diff --git a/include/dbus-c++/types.h b/include/dbus-c++/types.h
index 505b1fb..241a329 100644
--- a/include/dbus-c++/types.h
+++ b/include/dbus-c++/types.h
@@ -295,7 +295,7 @@ inline DBus::MessageIter& operator << ( DBus::MessageIter& iter, const std::vect
template
inline DBus::MessageIter& operator << ( DBus::MessageIter& iter, const std::map& val )
{
- const std::string sig = DBus::type::sig() + DBus::type::sig();
+ const std::string sig = "{" + DBus::type::sig() + DBus::type::sig() + "}";
DBus::MessageIter ait = iter.new_array(sig.c_str());
typename std::map::const_iterator mit;
diff --git a/src/message.cpp b/src/message.cpp
index 3716e7a..abed0cb 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -246,13 +246,9 @@ int MessageIter::get_array( void* ptr )
return length;
}
-MessageIter MessageIter::new_array( const char* sig )
+int MessageIter::array_length()
{
- MessageIter arr(msg());
- dbus_message_iter_open_container(
- (DBusMessageIter*)&_iter, DBUS_TYPE_ARRAY, sig, (DBusMessageIter*)&(arr._iter)
- );
- return arr;
+ return dbus_message_iter_get_array_len((DBusMessageIter*)&_iter);
}
bool MessageIter::is_array()
@@ -260,25 +256,20 @@ bool MessageIter::is_array()
return dbus_message_iter_get_arg_type((DBusMessageIter*)&_iter) == DBUS_TYPE_ARRAY;
}
-int MessageIter::array_length()
-{
- return dbus_message_iter_get_array_len((DBusMessageIter*)&_iter);
-}
-
-MessageIter MessageIter::new_dict_entry()
-{
- MessageIter ent(msg());
- dbus_message_iter_open_container(
- (DBusMessageIter*)_iter, DBUS_TYPE_DICT_ENTRY, 0, (DBusMessageIter*)&(ent._iter)
- );
- return ent;
-}
-
bool MessageIter::is_dict()
{
return is_array() && dbus_message_iter_get_element_type((DBusMessageIter*)_iter) == DBUS_TYPE_DICT_ENTRY;
}
+MessageIter MessageIter::new_array( const char* sig )
+{
+ MessageIter arr(msg());
+ dbus_message_iter_open_container(
+ (DBusMessageIter*)&_iter, DBUS_TYPE_ARRAY, sig, (DBusMessageIter*)&(arr._iter)
+ );
+ return arr;
+}
+
MessageIter MessageIter::new_variant( const char* sig )
{
MessageIter var(msg());
@@ -292,11 +283,20 @@ MessageIter MessageIter::new_struct()
{
MessageIter stu(msg());
dbus_message_iter_open_container(
- (DBusMessageIter*)_iter, DBUS_TYPE_STRUCT, 0, (DBusMessageIter*)&(stu._iter)
+ (DBusMessageIter*)_iter, DBUS_TYPE_STRUCT, NULL, (DBusMessageIter*)&(stu._iter)
);
return stu;
}
+MessageIter MessageIter::new_dict_entry()
+{
+ MessageIter ent(msg());
+ dbus_message_iter_open_container(
+ (DBusMessageIter*)_iter, DBUS_TYPE_DICT_ENTRY, NULL, (DBusMessageIter*)&(ent._iter)
+ );
+ return ent;
+}
+
void MessageIter::close_container( MessageIter& container )
{
dbus_message_iter_close_container((DBusMessageIter*)&_iter, (DBusMessageIter*)&(container._iter));