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));