diff --git a/examples/echo/echo-introspect.xml b/examples/echo/echo-introspect.xml index be04755..7d415ab 100644 --- a/examples/echo/echo-introspect.xml +++ b/examples/echo/echo-introspect.xml @@ -12,6 +12,10 @@ + + + + diff --git a/examples/echo/echo-server.cpp b/examples/echo/echo-server.cpp index d0716d7..251e1a2 100644 --- a/examples/echo/echo-server.cpp +++ b/examples/echo/echo-server.cpp @@ -2,6 +2,7 @@ #include #include #include +#include static const char* ECHO_SERVER_NAME = "org.freedesktop.DBus.Examples.Echo"; static const char* ECHO_SERVER_PATH = "/org/freedesktop/DBus/Examples/Echo"; @@ -28,6 +29,21 @@ DBus::Variant EchoServer::Echo( const DBus::Variant& value ) return value; } +std::vector< DBus::Byte > EchoServer::Cat( const DBus::String & file ) +{ + FILE* handle = fopen(file.c_str(), "rb"); + + if(!handle) throw DBus::Error("org.freedesktop.DBus.EchoDemo.ErrorFileNotFound", "file not found"); + + DBus::Byte buff[1024]; + + size_t nread = fread(buff, 1, sizeof(buff), handle); + + fclose(handle); + + return std::vector< DBus::Byte > (buff, buff + nread); +} + DBus::Int32 EchoServer::Sum( const std::vector& ints ) { DBus::Int32 sum = 0; diff --git a/examples/echo/echo-server.h b/examples/echo/echo-server.h index 5d3de8c..d1007ac 100644 --- a/examples/echo/echo-server.h +++ b/examples/echo/echo-server.h @@ -19,6 +19,8 @@ public: DBus::Variant Echo( const DBus::Variant & value ); + std::vector< DBus::Byte > Cat( const DBus::String & file ); + DBus::Int32 Sum( const std::vector & ints ); std::map< DBus::String, DBus::String > Info(); diff --git a/include/dbus-c++/types.h b/include/dbus-c++/types.h index 5bc2b54..a180c9f 100644 --- a/include/dbus-c++/types.h +++ b/include/dbus-c++/types.h @@ -288,7 +288,9 @@ inline DBus::MessageIter& operator << ( DBus::MessageIter& iter, const std::vect template<> inline DBus::MessageIter& operator << ( DBus::MessageIter& iter, const std::vector& val ) { - iter.append_array('y', &val.front(), val.size()); + DBus::MessageIter ait = iter.new_array("y"); + ait.append_array('y', &val.front(), val.size()); + iter.close_container(ait); return iter; } @@ -447,9 +449,12 @@ inline DBus::MessageIter& operator >> ( DBus::MessageIter& iter, std::vector(&val.front())); + DBus::Byte* array; + size_t length = ait.get_array(&array); + + val.insert(val.end(), array, array+length); return ++iter; } diff --git a/src/message.cpp b/src/message.cpp index 100aa91..ef3823f 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -231,7 +231,7 @@ char* MessageIter::signature() const bool MessageIter::append_array( char type, const void* ptr, size_t length ) { - return dbus_message_iter_append_fixed_array((DBusMessageIter*)&_iter, type, ptr, length); + return dbus_message_iter_append_fixed_array((DBusMessageIter*)&_iter, type, &ptr, length); } int MessageIter::array_type()