* 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:
parent
8484b18054
commit
0084392c53
7 changed files with 47 additions and 27 deletions
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue