* Fixed marshaling of D-Bus dictionary types

git-svn-id: http://dev.openwengo.org/svn/openwengo/wengophone-ng/branches/wengophone-dbus-api/libs/dbus@8808 30a43799-04e7-0310-8b2b-ea0d24f86d0e
This commit is contained in:
pdurante 2006-12-11 16:50:03 +00:00
parent 8484b18054
commit 0084392c53
7 changed files with 47 additions and 27 deletions

View file

@ -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

View file

@ -19,5 +19,8 @@
<signal name="Echoed">
<arg type="v" name="value"/>
</signal>
<method name="Info">
<arg type="a{ss}" name="info" direction="out"/>
</method>
</interface>
</node>

View file

@ -1,4 +1,5 @@
#include "echo-server.h"
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
@ -36,6 +37,18 @@ DBus::Int32 EchoServer::Sum( const std::vector<DBus::Int32>& 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;

View file

@ -20,6 +20,8 @@ public:
DBus::Variant Echo( const DBus::Variant & value );
DBus::Int32 Sum( const std::vector<DBus::Int32> & ints );
std::map< DBus::String, DBus::String > Info();
};
#endif//__DEMO_ECHO_SERVER_H

View file

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

View file

@ -295,7 +295,7 @@ inline DBus::MessageIter& operator << ( DBus::MessageIter& iter, const std::vect
template<typename K, typename V>
inline DBus::MessageIter& operator << ( DBus::MessageIter& iter, const std::map<K,V>& val )
{
const std::string sig = DBus::type<K>::sig() + DBus::type<V>::sig();
const std::string sig = "{" + DBus::type<K>::sig() + DBus::type<V>::sig() + "}";
DBus::MessageIter ait = iter.new_array(sig.c_str());
typename std::map<K,V>::const_iterator mit;

View file

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