gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r33110 - in gnunet-dbus: . src/lib/common src/lib/include s


From: gnunet
Subject: [GNUnet-SVN] r33110 - in gnunet-dbus: . src/lib/common src/lib/include src/services
Date: Fri, 18 Apr 2014 11:51:04 +0200

Author: canndrew
Date: 2014-04-18 11:51:04 +0200 (Fri, 18 Apr 2014)
New Revision: 33110

Added:
   gnunet-dbus/.gitignore
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_object_path.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_signal.c
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_object_path.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_signal.h
Modified:
   gnunet-dbus/src/lib/common/Makefile.am
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_arg.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_client.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_interface.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_message.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_method.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_method_context.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_object.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_pop.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_push.c
   gnunet-dbus/src/lib/common/gnunet_dbus_lib_service.c
   gnunet-dbus/src/lib/common/timeout.c
   gnunet-dbus/src/lib/common/timeout.h
   gnunet-dbus/src/lib/common/watch.c
   gnunet-dbus/src/lib/common/watch.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_arg.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_client.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_interface.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_message.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_method.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_method_context.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_object.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_pop.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_push.h
   gnunet-dbus/src/lib/include/gnunet_dbus_lib_service.h
   gnunet-dbus/src/services/gnunet-service-dht-dbus.c
   gnunet-dbus/src/services/gnunet-service-gns-dbus.c
Log:
Various dbus library API changes.

Added: gnunet-dbus/.gitignore
===================================================================
--- gnunet-dbus/.gitignore                              (rev 0)
+++ gnunet-dbus/.gitignore      2014-04-18 09:51:04 UTC (rev 33110)
@@ -0,0 +1,30 @@
+Makefile
+Makefile.in
+*~
+*.o
+*.la
+*.lo
+.deps
+.libs
+/aclocal.m4
+/ar-lib
+/autom4te.cache
+
+/config.guess
+/config.h
+/config.h.in
+/config.log
+/config.status
+/config.sub
+/configure
+/depcomp
+/install-sh
+/libtool
+/ltmain.sh
+/m4/
+/missing
+/stamp-h1
+
+/src/services/gnunet-service-dht-dbus
+/src/services/gnunet-service-gns-dbus
+

Modified: gnunet-dbus/src/lib/common/Makefile.am
===================================================================
--- gnunet-dbus/src/lib/common/Makefile.am      2014-04-17 23:44:37 UTC (rev 
33109)
+++ gnunet-dbus/src/lib/common/Makefile.am      2014-04-18 09:51:04 UTC (rev 
33110)
@@ -9,8 +9,10 @@
        timeout.c \
        gnunet_dbus_lib_service.c \
        gnunet_dbus_lib_object.c \
+       gnunet_dbus_lib_object_path.c \
        gnunet_dbus_lib_interface.c \
        gnunet_dbus_lib_method.c \
+       gnunet_dbus_lib_signal.c \
        gnunet_dbus_lib_arg.c \
        gnunet_dbus_lib_message.c \
        gnunet_dbus_lib_method_context.c \

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_arg.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_arg.c    2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_arg.c    2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -22,25 +22,11 @@
   struct GNUNET_DBUS_Arg *arg = GNUNET_new (struct GNUNET_DBUS_Arg);
   arg->name = GNUNET_strdup (name);
   arg->signature = signature;
-  arg->ref_count = 0;
+  arg->ref_count = 1;
   return arg;
 };
 
 void
-GNUNET_DBUS_arg_destroy (
-    struct GNUNET_DBUS_Arg *arg)
-{
-  if (0 != arg->ref_count)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to destroy arg that still has 
references. name == \"%s\", ref_count == %zu\n", arg->name, arg->ref_count);
-    GNUNET_abort ();
-  };
-
-  GNUNET_free (arg->name);
-  GNUNET_free (arg);
-};
-
-void
 GNUNET_DBUS_arg_ref (
     struct GNUNET_DBUS_Arg *arg)
 {
@@ -57,7 +43,10 @@
     GNUNET_abort ();
   };
   if (0 == --(arg->ref_count))
-    GNUNET_DBUS_arg_destroy (arg);
+  {
+    GNUNET_free (arg->name);
+    GNUNET_free (arg);
+  };
 };
 
 const char *

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_client.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_client.c 2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_client.c 2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -12,6 +12,7 @@
   char *unique_name;
   void *data;
   bool prefers_pretty_encodings;
+  unsigned ref_count;
 };
 
 struct GNUNET_DBUS_Client *
@@ -29,13 +30,30 @@
 };
 
 void
-GNUNET_DBUS_client_destroy (
+GNUNET_DBUS_client_ref (
     struct GNUNET_DBUS_Client *client)
 {
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Destroying client with unique name %s\n", 
client->unique_name);
+  client->ref_count++;
+}
 
-  GNUNET_free (client->unique_name);
-  GNUNET_free (client);
+void
+GNUNET_DBUS_client_unref (
+    struct GNUNET_DBUS_Client *client)
+{
+  if (client->ref_count == 0)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to unref client with ref count 0\n");
+    LOG (GNUNET_ERROR_TYPE_ERROR, "  unique_name == %s\n", 
client->unique_name);
+    GNUNET_abort ();
+  }
+
+  if (0 == --(client->ref_count))
+  {
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "Destroying client with unique name %s\n", 
client->unique_name);
+
+    GNUNET_free (client->unique_name);
+    GNUNET_free (client);
+  }
 };
 
 const char *
@@ -98,20 +116,3 @@
   return ret;
 }
 
-DBusMessage *
-GNUNET_DBUS_client_create_unicast_signal (
-    struct GNUNET_DBUS_Client *client,
-    const char *object_path,
-    const char *interface,
-    const char *signal,
-    bool pretty)
-{
-  DBusMessage *ret = dbus_message_new_signal (
-      object_path,
-      interface,
-      signal);
-  dbus_message_set_destination (ret, client->unique_name);
-  GNUNET_DBUS_message_set_pretty (ret, pretty);
-  return ret;
-}
-

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_interface.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_interface.c      2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_interface.c      2014-04-18 
09:51:04 UTC (rev 33110)
@@ -15,6 +15,9 @@
   struct GNUNET_DBUS_MethodIterator *methods_front;
   struct GNUNET_DBUS_MethodIterator *methods_back;
 
+  struct GNUNET_DBUS_SignalIterator *signals_front;
+  struct GNUNET_DBUS_SignalIterator *signals_back;
+
   char *name;
   unsigned ref_count;
 };
@@ -30,37 +33,12 @@
   interface->methods_front = NULL;
   interface->methods_back = NULL;
   interface->name = GNUNET_strdup (name);
-  interface->ref_count = 0;
+  interface->ref_count = 1;
 
   return interface;
 };
 
 void
-GNUNET_DBUS_interface_destroy (
-    struct GNUNET_DBUS_Interface *interface)
-{
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Destroying interface %s\n", interface->name);
-
-  if (0 != interface->ref_count)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to destroy interface that still has 
references. name == \"%s\", ref_count == %zu\n", interface->name, 
interface->ref_count);
-    GNUNET_abort ();
-  };
-
-  struct GNUNET_DBUS_MethodIterator *methods_iter = interface->methods_front;
-  while (methods_iter)
-  {
-    struct GNUNET_DBUS_MethodIterator *next = methods_iter->next;
-    GNUNET_DBUS_method_unref (methods_iter->method);
-    GNUNET_free (methods_iter);
-    methods_iter = next;
-  };
-
-  GNUNET_free (interface->name);
-  GNUNET_free (interface);
-};
-
-void
 GNUNET_DBUS_interface_ref (
     struct GNUNET_DBUS_Interface *interface)
 {
@@ -77,7 +55,21 @@
     GNUNET_abort ();
   };
   if (0 == --(interface->ref_count))
-    GNUNET_DBUS_interface_destroy (interface);
+  {
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "Destroying interface %s\n", 
interface->name);
+
+    struct GNUNET_DBUS_MethodIterator *methods_iter = interface->methods_front;
+    while (methods_iter)
+    {
+      struct GNUNET_DBUS_MethodIterator *next = methods_iter->next;
+      GNUNET_DBUS_method_unref (methods_iter->method);
+      GNUNET_free (methods_iter);
+      methods_iter = next;
+    };
+
+    GNUNET_free (interface->name);
+    GNUNET_free (interface);
+  }
 };
 
 void
@@ -94,6 +86,20 @@
                                meth_it);
 };
 
+void
+GNUNET_DBUS_interface_add_signal (
+    struct GNUNET_DBUS_Interface *interface,
+    struct GNUNET_DBUS_Signal *signal)
+{
+  struct GNUNET_DBUS_SignalIterator *sig_it = GNUNET_new (struct 
GNUNET_DBUS_SignalIterator);
+  sig_it->signal = signal;
+  GNUNET_DBUS_signal_ref (signal);
+
+  GNUNET_CONTAINER_DLL_insert (interface->signals_front,
+                               interface->signals_back,
+                               sig_it);
+};
+
 const char *
 GNUNET_DBUS_interface_get_name (
     const struct GNUNET_DBUS_Interface *interface)
@@ -108,6 +114,13 @@
   return interface->methods_front;
 };
 
+const struct GNUNET_DBUS_SignalIterator *
+GNUNET_DBUS_interface_iterate_signals (
+    const struct GNUNET_DBUS_Interface *interface)
+{
+  return interface->signals_front;
+}
+
 static void
 introspectable_introspect (
     struct GNUNET_DBUS_MethodContext *mc)
@@ -171,10 +184,44 @@
       GNUNET_free (data); data = new_data;
       meth_it = meth_it->next;
     };
+    const struct GNUNET_DBUS_SignalIterator *sig_it = 
GNUNET_DBUS_interface_iterate_signals (interface);
+    while (sig_it)
+    {
+      struct GNUNET_DBUS_Signal *signal = sig_it->signal;
+      const char *signal_name = GNUNET_DBUS_signal_get_name (signal);
+      GNUNET_asprintf (&new_data, "%s    <signal name='%s'>\n", data, 
signal_name);
+      GNUNET_free (data); data = new_data;
+      const struct GNUNET_DBUS_ArgIterator *arg_it = 
GNUNET_DBUS_signal_iterate_args (signal);
+      while (arg_it)
+      {
+        struct GNUNET_DBUS_Arg *arg = arg_it->arg;
+        const char *arg_name = GNUNET_DBUS_arg_get_name (arg);
+        const char *signature = GNUNET_DBUS_arg_get_signature (arg);
+        GNUNET_asprintf (
+          &new_data,
+          "%s      <arg name='%s' type='%s'/>\n",
+            data,
+            arg_name,
+            signature);
+        GNUNET_free (data); data = new_data;
+        arg_it = arg_it->next;
+      }
+      GNUNET_asprintf (&new_data, "%s    </signal>\n", data);
+      GNUNET_free (data); data = new_data;
+      sig_it = sig_it->next;
+    };
     GNUNET_asprintf (&new_data, "%s  </interface>\n", data);
     GNUNET_free (data); data = new_data;
     int_it = int_it->next;
   };
+  const struct GNUNET_DBUS_ObjectIterator *obj_it = 
GNUNET_DBUS_object_iterate_subobjects (object);
+  while (obj_it)
+  {
+    const char *obj_name = GNUNET_DBUS_object_get_name (obj_it->object);
+    GNUNET_asprintf (&new_data, "%s  <node name='%s'/>\n", data, obj_name);
+    GNUNET_free (data); data = new_data;
+    obj_it = obj_it->next;
+  }
   GNUNET_asprintf (&new_data, "%s</node>\n", data);
   GNUNET_free (data); data = new_data;
 
@@ -186,21 +233,31 @@
   GNUNET_free (data);
 };
 
+struct GNUNET_DBUS_Interface *interface_introspectable;
+
+static void construct_interface_introspectable ()
+  __attribute__((constructor));
+
+static void destruct_interface_introspectable ()
+  __attribute__((destructor));
+
+static void construct_interface_introspectable ()
+{
+  interface_introspectable = GNUNET_DBUS_interface_create 
("org.freedesktop.DBus.Introspectable");
+  struct GNUNET_DBUS_Method *introspect = GNUNET_DBUS_method_create 
("Introspect", introspectable_introspect);
+  GNUNET_DBUS_method_add_return_arg (introspect, "data", 
GNUNET_DBUS_SIGNATURE_STRING);
+  GNUNET_DBUS_interface_add_method (interface_introspectable, introspect);
+}
+
+static void destruct_interface_introspectable ()
+{
+  GNUNET_DBUS_interface_unref (interface_introspectable);
+}
+
 struct GNUNET_DBUS_Interface *
 GNUNET_DBUS_interface_introspectable ()
 {
-  static struct GNUNET_DBUS_Interface *introspectable = NULL;
-
-  if (NULL == introspectable)
-  {
-    introspectable = GNUNET_DBUS_interface_create 
("org.freedesktop.DBus.Introspectable");
-    struct GNUNET_DBUS_Method *introspect = GNUNET_DBUS_method_create 
("Introspect", introspectable_introspect);
-    GNUNET_DBUS_method_add_return_arg (introspect, "data", 
GNUNET_DBUS_SIGNATURE_STRING);
-    GNUNET_DBUS_interface_add_method (introspectable, introspect);
-    GNUNET_DBUS_interface_ref (introspectable);
-  };
-
-  return introspectable;
+  return interface_introspectable;
 };
 
 const struct GNUNET_DBUS_InterfaceIterator *

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_message.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_message.c        2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_message.c        2014-04-18 
09:51:04 UTC (rev 33110)
@@ -45,3 +45,18 @@
   };
 };
 
+void
+GNUNET_DBUS_message_set_destination (
+    DBusMessage *message,
+    struct GNUNET_DBUS_Client *client)
+{
+  dbus_message_set_destination (message, GNUNET_DBUS_client_get_unique_name 
(client));
+}
+
+void
+GNUNET_DBUS_message_unset_destination (
+    DBusMessage *message)
+{
+  dbus_message_set_destination (message, NULL);
+}
+

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_method.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_method.c 2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_method.c 2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -31,26 +31,12 @@
   struct GNUNET_DBUS_Method *method = GNUNET_new (struct GNUNET_DBUS_Method);
   method->name = GNUNET_strdup (name);
   method->underlying_method = underlying_method;
-  method->ref_count = 0;
+  method->ref_count = 1;
 
   return method;
 };
 
 void
-GNUNET_DBUS_method_destroy (
-    struct GNUNET_DBUS_Method *method)
-{
-  if (0 != method->ref_count)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to destroy method that still has 
references. name == \"%s\", ref_count == %zu\n", method->name, 
method->ref_count);
-    GNUNET_abort ();
-  };
-
-  GNUNET_free (method->name);
-  GNUNET_free (method);
-};
-
-void
 GNUNET_DBUS_method_ref (
     struct GNUNET_DBUS_Method *method)
 {
@@ -67,7 +53,28 @@
     GNUNET_abort ();
   };
   if (0 == --(method->ref_count))
-    GNUNET_DBUS_method_destroy (method);
+  {
+    struct GNUNET_DBUS_ArgIterator *arg_it = method->args_front;
+    while (arg_it)
+    {
+      struct GNUNET_DBUS_ArgIterator *next = arg_it->next;
+      GNUNET_DBUS_arg_unref (arg_it->arg);
+      GNUNET_free (arg_it);
+      arg_it = next;
+    }
+
+    arg_it = method->return_args_front;
+    while (arg_it)
+    {
+      struct GNUNET_DBUS_ArgIterator *next = arg_it->next;
+      GNUNET_DBUS_arg_unref (arg_it->arg);
+      GNUNET_free (arg_it);
+      arg_it = next;
+    }
+
+    GNUNET_free (method->name);
+    GNUNET_free (method);
+  }
 };
 
 void
@@ -79,7 +86,6 @@
   struct GNUNET_DBUS_Arg *arg = GNUNET_DBUS_arg_create (name, signature);
   struct GNUNET_DBUS_ArgIterator *arg_it = GNUNET_new (struct 
GNUNET_DBUS_ArgIterator);
   arg_it->arg = arg;
-  GNUNET_DBUS_arg_ref (arg);
   GNUNET_CONTAINER_DLL_insert_tail (method->args_front,
                                     method->args_back,
                                     arg_it);
@@ -94,7 +100,6 @@
   struct GNUNET_DBUS_Arg *arg = GNUNET_DBUS_arg_create (name, signature);
   struct GNUNET_DBUS_ArgIterator *arg_it = GNUNET_new (struct 
GNUNET_DBUS_ArgIterator);
   arg_it->arg = arg;
-  GNUNET_DBUS_arg_ref (arg);
   GNUNET_CONTAINER_DLL_insert_tail (method->return_args_front,
                                     method->return_args_back,
                                     arg_it);

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_method_context.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_method_context.c 2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_method_context.c 2014-04-18 
09:51:04 UTC (rev 33110)
@@ -29,27 +29,13 @@
   ret->expects_reply  = ! dbus_message_get_no_reply (message);
 
   ret->replied = false;
-  ret->ref_count = 0;
+  ret->ref_count = 1;
   dbus_message_ref (message);
 
   return ret;
 };
 
 void
-GNUNET_DBUS_method_context_destroy (
-    struct GNUNET_DBUS_MethodContext *mc)
-{
-  if (0 != mc->ref_count)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to destroy method context with ref 
count %u\n", mc->ref_count);
-    GNUNET_abort ();
-  };
-
-  dbus_message_unref (mc->message);
-  GNUNET_free (mc);
-};
-
-void
 GNUNET_DBUS_method_context_ref (
     struct GNUNET_DBUS_MethodContext *mc)
 {
@@ -66,7 +52,10 @@
     GNUNET_abort ();
   };
   if (0 == --(mc->ref_count))
-    GNUNET_DBUS_method_context_destroy (mc);
+  {
+    dbus_message_unref (mc->message);
+    GNUNET_free (mc);
+  }
 };
 
 void

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_object.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_object.c 2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_object.c 2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -1,5 +1,7 @@
 #include "config.h"
 
+#include <inttypes.h>
+
 #include <gnunet/platform.h>
 #include <gnunet/gnunet_common.h>
 #include <gnunet/gnunet_container_lib.h>
@@ -13,50 +15,32 @@
   struct GNUNET_DBUS_InterfaceIterator *interfaces_front;
   struct GNUNET_DBUS_InterfaceIterator *interfaces_back;
 
-  char *path;
+  struct GNUNET_DBUS_ObjectIterator *subobjects_front;
+  struct GNUNET_DBUS_ObjectIterator *subobjects_back;
+
+  char *name;
   void *data;
   unsigned ref_count;
 };
 
 struct GNUNET_DBUS_Object *
 GNUNET_DBUS_object_create (
-    const char *path,
+    const char *name,
     void *data)
 {
   struct GNUNET_DBUS_Object *object = GNUNET_new (struct GNUNET_DBUS_Object);
-  object->path = GNUNET_strdup (path);
+  object->name = GNUNET_strdup (name);
   object->data = data;
   object->interfaces_front = NULL;
   object->interfaces_back = NULL;
-  object->ref_count = 0;
+  object->subobjects_front = NULL;
+  object->subobjects_back = NULL;
+  object->ref_count = 1;
   
   return object;
 };
 
 void
-GNUNET_DBUS_object_destroy (
-    struct GNUNET_DBUS_Object *object)
-{
-  if (0 != object->ref_count)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to destroy object that still has 
references. path == \"%s\", ref_count == %zu\n", object->path, 
object->ref_count);
-    GNUNET_abort ();
-  };
-
-  struct GNUNET_DBUS_InterfaceIterator *int_it = object->interfaces_front;
-  while (int_it)
-  {
-    struct GNUNET_DBUS_InterfaceIterator *next = int_it->next;
-    GNUNET_DBUS_interface_unref (int_it->interface);
-    GNUNET_free (int_it);
-    int_it = next;
-  };
-
-  GNUNET_free (object->path);
-  GNUNET_free (object);
-};
-
-void
 GNUNET_DBUS_object_ref (
     struct GNUNET_DBUS_Object *object)
 {
@@ -73,14 +57,35 @@
     GNUNET_abort ();
   };
   if (0 == --(object->ref_count))
-    GNUNET_DBUS_object_destroy (object);
+  {
+    struct GNUNET_DBUS_InterfaceIterator *int_it = object->interfaces_front;
+    while (int_it)
+    {
+      struct GNUNET_DBUS_InterfaceIterator *next = int_it->next;
+      GNUNET_DBUS_interface_unref (int_it->interface);
+      GNUNET_free (int_it);
+      int_it = next;
+    };
+
+    struct GNUNET_DBUS_ObjectIterator *obj_it = object->subobjects_front;
+    while (obj_it)
+    {
+      struct GNUNET_DBUS_ObjectIterator *next = obj_it->next;
+      GNUNET_DBUS_object_unref (obj_it->object);
+      GNUNET_free (obj_it);
+      obj_it = next;
+    };
+
+    GNUNET_free (object->name);
+    GNUNET_free (object);
+  }
 };
 
 const char *
-GNUNET_DBUS_object_get_path (
-    struct GNUNET_DBUS_Object *object)
+GNUNET_DBUS_object_get_name (
+    const struct GNUNET_DBUS_Object *object)
 {
-  return object->path;
+  return object->name;
 };
 
 void
@@ -111,3 +116,76 @@
   return object->data;
 };
 
+struct GNUNET_DBUS_Object *
+GNUNET_DBUS_object_create_uniquely_named_subobject (
+    struct GNUNET_DBUS_Object *object,
+    void *data)
+{
+  while(true)
+  {
+    char name[9];
+    uint32_t id = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 
0xffffffff);
+    GNUNET_snprintf (name, sizeof(name), "%08" PRIx32, id);
+    const struct GNUNET_DBUS_ObjectIterator *obj_it = 
GNUNET_DBUS_object_iterate_subobjects (object);
+    while (true)
+    {
+      if (! obj_it)
+      {
+        struct GNUNET_DBUS_Object *subobject = GNUNET_DBUS_object_create 
(name, data);
+        GNUNET_DBUS_object_add_subobject (object, subobject);
+        return subobject;
+      }
+
+      const struct GNUNET_DBUS_Object *test_object = obj_it->object;
+      if (0 == strcmp (name, GNUNET_DBUS_object_get_name (test_object)))
+        break;
+
+      obj_it = obj_it->next;
+    }
+  }
+}
+
+void
+GNUNET_DBUS_object_add_subobject (
+    struct GNUNET_DBUS_Object *object,
+    struct GNUNET_DBUS_Object *subobject)
+{
+  struct GNUNET_DBUS_ObjectIterator *obj_it = GNUNET_new (struct 
GNUNET_DBUS_ObjectIterator);
+  obj_it->object = subobject;
+  GNUNET_DBUS_object_ref (subobject);
+
+  GNUNET_CONTAINER_DLL_insert (object->subobjects_front,
+                               object->subobjects_back,
+                               obj_it);
+};
+
+void
+GNUNET_DBUS_object_remove_subobject (
+    struct GNUNET_DBUS_Object *object,
+    struct GNUNET_DBUS_ObjectIterator *subobject_it)
+{
+  GNUNET_DBUS_object_unref (subobject_it->object);
+  GNUNET_CONTAINER_DLL_remove (object->subobjects_front,
+                               object->subobjects_back,
+                               subobject_it);
+};
+
+const struct GNUNET_DBUS_ObjectIterator *
+GNUNET_DBUS_object_iterate_subobjects (
+    const struct GNUNET_DBUS_Object *object)
+{
+  return object->subobjects_front;
+}
+
+const struct GNUNET_DBUS_ObjectIterator *
+GNUNET_DBUS_object_find (
+    const struct GNUNET_DBUS_ObjectIterator *object_it,
+    const char *name)
+{
+  while (object_it && strcmp (name, object_it->object->name))
+    object_it = object_it->next;
+
+  return object_it;
+}
+
+

Added: gnunet-dbus/src/lib/common/gnunet_dbus_lib_object_path.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_object_path.c                    
        (rev 0)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_object_path.c    2014-04-18 
09:51:04 UTC (rev 33110)
@@ -0,0 +1,162 @@
+#include "config.h"
+
+#include <gnunet/platform.h>
+#include <gnunet/gnunet_common.h>
+#include <gnunet/gnunet_container_lib.h>
+
+#include "gnunet_dbus_lib.h"
+
+#define LOG(kind, ...) GNUNET_log_from (kind, "dbus-object-path", __VA_ARGS__)
+
+struct GNUNET_DBUS_ObjectPath
+{
+  size_t objects_len;
+  struct GNUNET_DBUS_Object **objects;
+  size_t ref_count;
+};
+
+struct GNUNET_DBUS_ObjectPath *
+GNUNET_DBUS_object_path_create (
+    struct GNUNET_DBUS_Service *service,
+    ...)
+{
+  struct GNUNET_DBUS_ObjectPath *path = GNUNET_new (struct 
GNUNET_DBUS_ObjectPath);
+  path->objects_len = 1;
+  path->ref_count = 1;
+
+  va_list vl;
+  va_start (vl, service);
+  while (va_arg (vl, struct GNUNET_DBUS_Object *))
+  {
+    path->objects_len++;
+  }
+  va_end (vl);
+
+  path->objects = GNUNET_malloc (sizeof (struct GNUNET_DBUS_Object *) * 
(path->objects_len + 1));
+  va_start (vl, service);
+  size_t i;
+  struct GNUNET_DBUS_Object *elem = GNUNET_DBUS_service_get_root_object 
(service);
+  path->objects[0] = elem;
+  GNUNET_DBUS_object_ref (elem);
+  for (i = 1; i < path->objects_len; i++)
+  {
+    elem = va_arg (vl, struct GNUNET_DBUS_Object *);
+    path->objects[i] = elem;
+    GNUNET_DBUS_object_ref (elem);
+  }
+  path->objects[path->objects_len] = NULL;
+  va_end (vl);
+
+  return path;
+}
+
+void
+GNUNET_DBUS_object_path_unref (
+    struct GNUNET_DBUS_ObjectPath *path)
+{
+  if (path->ref_count == 0)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to unreference object path with ref 
count 0\n");
+
+    /* This will probably segfault, but oh well */
+    char *path_as_str = GNUNET_DBUS_object_path_to_string (path);
+    LOG (GNUNET_ERROR_TYPE_ERROR, "  path == %s\n", path_as_str);
+    GNUNET_abort ();
+  };
+  if (0 == --(path->ref_count))
+  {
+    size_t i;
+    for (i = 0; i < path->objects_len; i++)
+    {
+      GNUNET_DBUS_object_unref (path->objects[i]);
+    }
+
+    GNUNET_free (path->objects);
+    GNUNET_free (path);
+  }
+}
+
+char *
+GNUNET_DBUS_object_path_to_string (
+    const struct GNUNET_DBUS_ObjectPath *path)
+{
+  char *data;
+  char *new_data;
+  
+  struct GNUNET_DBUS_Object **obj = path->objects;
+
+  obj++;
+  if (NULL == *obj)
+  {
+    GNUNET_asprintf (&data, "/");
+    return data;
+  }
+
+  GNUNET_asprintf (&data, "%s", "");
+  while (*obj)
+  {
+    GNUNET_asprintf (&new_data, "%s/%s", data, GNUNET_DBUS_object_get_name 
(*obj));
+    GNUNET_free (data); data = new_data;
+    obj++;
+  }
+
+  return data;
+}
+
+#if 0
+struct GNUNET_DBUS_ObjectPath *
+GNUNET_DBUS_object_path_create_from_string (
+    const struct GNUNET_DBUS_Service *service,
+    const char *path_str)
+{
+  char **path_decomposed = NULL;
+  dbus_bool_t succ = dbus_message_get_path_decomposed (dbus_message, 
&path_decomposed);
+  if (! succ)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR, "dbus_message_get_path_decomposed 
failed.\n");
+    GNUNET_abort ();
+  };
+
+  struct GNUNET_DBUS_ObjectPath *object_path = GNUNET_new (struct 
GNUNET_DBUS_ObjectPath);
+  object_path->objects_len = 0;
+  const char **path_element = path_decomposed;
+  while (*path_element)
+  {
+    object_path->objects_len++;
+    path_element++;
+  }
+
+  object_path->objects = GNUNET_malloc (sizeof (struct GNUNET_DBUS_Object *) * 
object_path->objects_len);
+
+  const struct GNUNET_DBUS_Object *object = 
GNUNET_DBUS_service_get_root_object (service);
+  struct GNUNET_DBUS_Object **pos = object_path->objects;
+  *pos++ = object;
+  path_element = path_decomposed;
+  while (*path_element)
+  {
+    const struct GNUNET_DBUS_ObjectIterator *start = 
GNUNET_DBUS_object_iterate_subobjects (object);
+    const struct GNUNET_DBUS_ObjectIterator *found = GNUNET_DBUS_object_find 
(start, *path_element);
+    if (! found)
+    {
+      LOG (GNUNET_ERROR_TYPE_DEBUG, "Invalid object path \"%s\"\n", path_str);
+      return NULL;
+    };
+
+    object = found->object;
+    *pos++ = object;
+    path_element++;
+  }
+
+  object_path->ref_count = 1;
+
+  return object_path;
+}
+#endif
+
+struct GNUNET_DBUS_Object *
+GNUNET_DBUS_object_path_get_destination (
+    const struct GNUNET_DBUS_ObjectPath *path)
+{
+  return path->objects[path->objects_len - 1];
+}
+

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_pop.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_pop.c    2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_pop.c    2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -243,7 +243,7 @@
     return dbus_message_new_error_printf (
         message,
         DBUS_ERROR_INVALID_ARGS,
-        "Bad argument for '%s'. Expected '%s'. Got '%s'",
+        "Bad argument for '%s'. Expected %s. Got %s",
           arg_name,
           GNUNET_DBUS_signature_typecode_to_string (type),
           GNUNET_DBUS_signature_typecode_to_string (arg_type));
@@ -258,8 +258,20 @@
     DBusMessage *message,
     DBusMessageIter *iter,
     DBusMessageIter *iter_sub,
-    const char *arg_name)
+    const char *arg_name,
+    size_t *len)
 {
+  if (len && dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_ARRAY)
+  {
+    DBusMessageIter iter_calc_len;
+    dbus_message_iter_recurse (iter, &iter_calc_len);
+    *len = 0;
+    while (dbus_message_iter_get_arg_type (&iter_calc_len) != 
DBUS_TYPE_INVALID)
+    {
+      ++*len;
+      dbus_message_iter_next (&iter_calc_len);
+    };
+  };
   return pop_enter_container (message, iter, iter_sub, DBUS_TYPE_ARRAY, 
arg_name);
 }
 

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_push.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_push.c   2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_push.c   2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -131,10 +131,12 @@
 GNUNET_DBUS_push_object_path (
     DBusMessage *message,
     DBusMessageIter *iter,
-    const char *const *value)
+    const struct GNUNET_DBUS_ObjectPath *path)
 {
   LOG (GNUNET_ERROR_TYPE_DEBUG, "Pushing object path\n");
-  push_basic (message, iter, DBUS_TYPE_OBJECT_PATH, value);
+  char *path_as_string = GNUNET_DBUS_object_path_to_string (path);
+  push_basic (message, iter, DBUS_TYPE_OBJECT_PATH, &path_as_string);
+  GNUNET_free (path_as_string);
 }
 
 void

Modified: gnunet-dbus/src/lib/common/gnunet_dbus_lib_service.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_service.c        2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_service.c        2014-04-18 
09:51:04 UTC (rev 33110)
@@ -17,8 +17,12 @@
 
 struct GNUNET_DBUS_Service
 {
+#if 0
   struct GNUNET_DBUS_ObjectIterator *objects_front;
   struct GNUNET_DBUS_ObjectIterator *objects_back;
+#else
+  struct GNUNET_DBUS_Object *root_object;
+#endif
 
   DBusConnection *dbus_connection;
   const struct GNUNET_CONFIGURATION_Handle *cfg;
@@ -46,6 +50,8 @@
 
   GNUNET_DBUS_ClientConnectsHandler client_connects;
   GNUNET_DBUS_ClientDisconnectsHandler client_disconnects;
+
+  unsigned ref_count;
 };
 
 static dbus_int32_t service_slot_id ()
@@ -87,7 +93,6 @@
   GNUNET_CONTAINER_DLL_insert (service->watches_front,
                                service->watches_back,
                                wi);
-  watch_ref (w);
   return true;
 };
 
@@ -117,6 +122,7 @@
                                service->watches_back,
                                wi);
   watch_unref (w);
+  GNUNET_free (wi);
 };
 
 /*
@@ -163,7 +169,6 @@
   GNUNET_CONTAINER_DLL_insert (service->timeouts_front,
                                service->timeouts_back,
                                ti);
-  timeout_ref (t);
   return true;
 };
 
@@ -187,6 +192,7 @@
                                service->timeouts_back,
                                ti);
   timeout_unref (t);
+  GNUNET_free (ti);
 };
 
 static void
@@ -260,117 +266,6 @@
   handle_dispatch (dbus_connection, new_status);
 };
 
-struct GNUNET_DBUS_Service *
-GNUNET_DBUS_service_create (
-    const struct GNUNET_CONFIGURATION_Handle *cfg,
-    const char *name)
-{
-  struct GNUNET_DBUS_Service *service = GNUNET_new (struct 
GNUNET_DBUS_Service);
-  service->cfg = cfg;
-  service->gnunet_name = GNUNET_strdup (name);
-  service->watches_front = NULL;
-  service->watches_back = NULL;
-  service->timeouts_front = NULL;
-  service->timeouts_back = NULL;
-  service->objects_front = NULL;
-  service->objects_back = NULL;
-  service->client_connects = NULL;
-  service->client_disconnects = NULL;
-
-  DBusError err;
-  dbus_error_init(&err);
-    
-  service->dbus_connection = dbus_bus_get_private (DBUS_BUS_SYSTEM, &err);
-  if (! service->dbus_connection)
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to connect to dbus system bus 
(%s)\n", dbus_error_is_set (&err) ? err.message : "dbus_bus_get_private 
returned NULL");
-  else
-  {
-    dbus_connection_set_exit_on_disconnect (service->dbus_connection,
-                                            false);
-    dbus_bool_t succ = dbus_connection_set_data (service->dbus_connection,
-                                                 service_slot_id (),
-                                                 service,
-                                                 NULL);
-    if (! succ)
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR, "dbus_connection_set_data returned false. 
Out of memory.\n");
-      GNUNET_abort ();
-    };
-
-    succ = dbus_connection_set_watch_functions (service->dbus_connection, 
watch_add, watch_remove, watch_toggle, service, NULL);
-    if(! succ)
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR, "dbus_connection_set_watch_functions 
returned false. Out of memory.\n");
-      GNUNET_abort ();
-    };
-
-    dbus_connection_set_dispatch_status_function (service->dbus_connection, 
dispatch_status_changed, service, NULL);
-    handle_dispatch (service->dbus_connection, 
dbus_connection_get_dispatch_status (service->dbus_connection));
-
-    succ = dbus_connection_set_timeout_functions (service->dbus_connection, 
timeout_add, timeout_remove, timeout_toggle, service, NULL);
-    if (! succ)
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR, "dbus_connection_set_timeout_functions 
returned false. Out of memory.\n");
-      GNUNET_abort ();
-    };
-
-    service->well_known_name = NULL;
-    GNUNET_asprintf (&service->well_known_name, "gnu.gnunet.%s", name);
-    int request_result = dbus_bus_request_name (service->dbus_connection, 
service->well_known_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &err);
-    if (dbus_error_is_set (&err))
-      LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to request the bus name (%s)\n", 
err.message);
-    else
-    {
-      switch(request_result)
-      {
-      case DBUS_REQUEST_NAME_REPLY_EXISTS:
-        LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to request the bus name \"%s\"; 
name is already taken.\n", service->well_known_name);
-        break;
-      default:
-        LOG (GNUNET_ERROR_TYPE_ERROR, "Unable to interpret result of 
dbus_request_name (%d)\n", request_result);
-        break;
-      case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
-
-        /* Success! */
-        return service;
-
-      }
-    }
-    dbus_connection_close (service->dbus_connection);
-    dbus_connection_unref (service->dbus_connection);
-  }
-  GNUNET_free (service->well_known_name);
-  GNUNET_free (service->gnunet_name);
-  GNUNET_free (service);
-  LOG (GNUNET_ERROR_TYPE_ERROR, "GNUNET_DBUS_service create failed.\n");
-  return NULL;
-};
-
-void
-GNUNET_DBUS_service_destroy (
-    struct GNUNET_DBUS_Service *service)
-{
-  struct GNUNET_DBUS_ObjectIterator *objects_it = service->objects_front;
-  while (objects_it)
-  {
-    struct GNUNET_DBUS_ObjectIterator *next = objects_it->next;
-    GNUNET_DBUS_object_unref (objects_it->object);
-    GNUNET_free (objects_it);
-    objects_it = next;
-  };
-
-  GNUNET_free (service->well_known_name);
-  GNUNET_free (service->gnunet_name);
-  GNUNET_free (service);
-};
-
-const struct GNUNET_CONFIGURATION_Handle *
-GNUNET_DBUS_service_get_config (
-    struct GNUNET_DBUS_Service *service)
-{
-  return service->cfg;
-};
-
 /*
  * Called whenever a message arrives from DBus
  *
@@ -391,7 +286,8 @@
     DBusMessage *dbus_message,
     void *cls)
 {
-  struct GNUNET_DBUS_Object *object = (struct GNUNET_DBUS_Object *)cls;
+  //struct GNUNET_DBUS_Object *object = (struct GNUNET_DBUS_Object *)cls;
+  (void)cls;
 
   const char *object_path    = dbus_message_get_path (dbus_message);
   const char *type_string    = dbus_message_type_to_string 
(dbus_message_get_type (dbus_message));
@@ -435,6 +331,40 @@
     */
   };
 
+  /*
+   * TODO:
+   *
+   * The code below could be more efficient. Avoid the allocation with
+   * dbus_message_get_path_decomposed and use tries to do
+   * object/method/interface lookups.
+   */
+  char **path_decomposed = NULL;
+  dbus_bool_t succ = dbus_message_get_path_decomposed (dbus_message, 
&path_decomposed);
+  if (! succ)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR, "Ran out of memory in 
dbus_message_get_path_decomposed.\n");
+    GNUNET_abort ();
+  };
+
+  struct GNUNET_DBUS_Object *object = service->root_object;
+  char **path_element = path_decomposed;
+  while (*path_element)
+  {
+    const struct GNUNET_DBUS_ObjectIterator *start = 
GNUNET_DBUS_object_iterate_subobjects (object);
+    const struct GNUNET_DBUS_ObjectIterator *found = GNUNET_DBUS_object_find 
(start, *path_element);
+    if (! found)
+    {
+      const char *object_name = GNUNET_DBUS_object_get_name (object);
+      LOG (GNUNET_ERROR_TYPE_DEBUG, "No such object \"%s\" under \"%s\"\n", 
*path_element, object_name[0] ? object_name : "(root object)");
+      dbus_free_string_array (path_decomposed);
+      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    };
+
+    object = found->object;
+    path_element++;
+  };
+  dbus_free_string_array (path_decomposed);
+
   if (! member_name)
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
@@ -477,12 +407,177 @@
     method,
     dbus_message
   );
-  GNUNET_DBUS_method_context_ref (mc);
   GNUNET_DBUS_method_call (method, mc);
   GNUNET_DBUS_method_context_unref (mc);
   return DBUS_HANDLER_RESULT_HANDLED;
 };
 
+struct GNUNET_DBUS_Service *
+GNUNET_DBUS_service_create (
+    const struct GNUNET_CONFIGURATION_Handle *cfg,
+    const char *name)
+{
+  struct GNUNET_DBUS_Service *service = GNUNET_new (struct 
GNUNET_DBUS_Service);
+  service->cfg = cfg;
+  service->gnunet_name = GNUNET_strdup (name);
+  service->watches_front = NULL;
+  service->watches_back = NULL;
+  service->timeouts_front = NULL;
+  service->timeouts_back = NULL;
+  service->client_connects = NULL;
+  service->client_disconnects = NULL;
+  service->ref_count = 1;
+
+  DBusError err;
+  dbus_error_init(&err);
+  
+  service->root_object = GNUNET_DBUS_object_create ("", NULL);
+  if (! service->root_object)
+    LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to create root object for 
service.\n");
+  else
+  {
+    service->dbus_connection = dbus_bus_get_private (DBUS_BUS_SYSTEM, &err);
+    if (! service->dbus_connection)
+      LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to connect to dbus system bus 
(%s)\n", dbus_error_is_set (&err) ? err.message : "dbus_bus_get_private 
returned NULL");
+    else
+    {
+      dbus_connection_set_exit_on_disconnect (service->dbus_connection,
+                                              false);
+      dbus_bool_t succ = dbus_connection_set_data (service->dbus_connection,
+                                                   service_slot_id (),
+                                                   service,
+                                                   NULL);
+      if (! succ)
+      {
+        LOG (GNUNET_ERROR_TYPE_ERROR, "dbus_connection_set_data returned 
false. Out of memory.\n");
+        GNUNET_abort ();
+      };
+
+      succ = dbus_connection_set_watch_functions (service->dbus_connection, 
watch_add, watch_remove, watch_toggle, service, NULL);
+      if(! succ)
+      {
+        LOG (GNUNET_ERROR_TYPE_ERROR, "dbus_connection_set_watch_functions 
returned false. Out of memory.\n");
+        GNUNET_abort ();
+      };
+
+      dbus_connection_set_dispatch_status_function (service->dbus_connection, 
dispatch_status_changed, service, NULL);
+      handle_dispatch (service->dbus_connection, 
dbus_connection_get_dispatch_status (service->dbus_connection));
+
+      succ = dbus_connection_set_timeout_functions (service->dbus_connection, 
timeout_add, timeout_remove, timeout_toggle, service, NULL);
+      if (! succ)
+      {
+        LOG (GNUNET_ERROR_TYPE_ERROR, "dbus_connection_set_timeout_functions 
returned false. Out of memory.\n");
+        GNUNET_abort ();
+      };
+
+      DBusObjectPathVTable vtable;
+      vtable.message_function = handle_object_message;
+      vtable.unregister_function = NULL;
+      succ = dbus_connection_try_register_fallback (service->dbus_connection, 
"/", &vtable, service, &err);
+      if (dbus_error_is_set (&err) || ! succ)
+        LOG (GNUNET_ERROR_TYPE_ERROR, "dbus_connection_try_register_fallback 
failed when registering root object.\n");
+      else
+      {
+        service->well_known_name = NULL;
+        GNUNET_asprintf (&service->well_known_name, "gnu.gnunet.%s", name);
+        int request_result = dbus_bus_request_name (service->dbus_connection, 
service->well_known_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &err);
+        if (dbus_error_is_set (&err))
+          LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to request the bus name 
(%s)\n", err.message);
+        else
+        {
+          switch(request_result)
+          {
+          case DBUS_REQUEST_NAME_REPLY_EXISTS:
+            LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to request the bus name 
\"%s\"; name is already taken.\n", service->well_known_name);
+            break;
+          default:
+            LOG (GNUNET_ERROR_TYPE_ERROR, "Unable to interpret result of 
dbus_request_name (%d)\n", request_result);
+            break;
+          case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
+
+            /* Success! */
+            return service;
+
+          }
+        }
+        dbus_connection_unregister_object_path (service->dbus_connection, "/");
+      }
+      dbus_connection_close (service->dbus_connection);
+      dbus_connection_unref (service->dbus_connection);
+    }
+    GNUNET_DBUS_object_unref (service->root_object);
+  }
+  GNUNET_free (service->well_known_name);
+  GNUNET_free (service->gnunet_name);
+  GNUNET_free (service);
+  LOG (GNUNET_ERROR_TYPE_ERROR, "GNUNET_DBUS_service create failed.\n");
+  return NULL;
+};
+
+void
+GNUNET_DBUS_service_ref (
+    struct GNUNET_DBUS_Service *service)
+{
+  service->ref_count++;
+}
+
+void
+GNUNET_DBUS_service_unref (
+    struct GNUNET_DBUS_Service *service)
+{
+  if (service->ref_count == 0)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to unref service with ref count 0\n");
+    LOG (GNUNET_ERROR_TYPE_ERROR, "  well_known_name == %s\n", 
service->well_known_name);
+    GNUNET_abort ();
+  }
+
+  if (0 == --(service->ref_count))
+  {
+    GNUNET_DBUS_object_unref (service->root_object);
+
+    GNUNET_free (service->well_known_name);
+    GNUNET_free (service->gnunet_name);
+
+    struct WatchIter *wi = service->watches_front;
+    while (wi)
+    {
+      struct WatchIter *next = wi->next;
+      watch_unref (wi->w);
+      GNUNET_free (wi);
+      wi = next;
+    }
+
+    struct TimeoutIter *ti = service->timeouts_front;
+    while (ti)
+    {
+      struct TimeoutIter *next = ti->next;
+      timeout_unref (ti->t);
+      GNUNET_free (ti);
+      ti = next;
+    }
+
+    struct GNUNET_DBUS_ClientIterator *ci = service->clients_front;
+    while (ci)
+    {
+      struct GNUNET_DBUS_ClientIterator *next = ci->next;
+      GNUNET_DBUS_client_unref (ci->client);
+      GNUNET_free (ci);
+      ci = next;
+    }
+
+    GNUNET_free (service);
+  }
+};
+
+const struct GNUNET_CONFIGURATION_Handle *
+GNUNET_DBUS_service_get_config (
+    struct GNUNET_DBUS_Service *service)
+{
+  return service->cfg;
+};
+
+#if 0
 int
 GNUNET_DBUS_service_add_object (
     struct GNUNET_DBUS_Service *service,
@@ -556,6 +651,7 @@
   GNUNET_free (obj_it);
   GNUNET_DBUS_object_unref (object);
 }
+#endif
 
 void
 GNUNET_DBUS_service_send (
@@ -580,3 +676,11 @@
   service->client_disconnects = client_disconnects;
 };
 
+struct GNUNET_DBUS_Object *
+GNUNET_DBUS_service_get_root_object (
+    struct GNUNET_DBUS_Service *service)
+{
+  return service->root_object;
+}
+
+

Added: gnunet-dbus/src/lib/common/gnunet_dbus_lib_signal.c
===================================================================
--- gnunet-dbus/src/lib/common/gnunet_dbus_lib_signal.c                         
(rev 0)
+++ gnunet-dbus/src/lib/common/gnunet_dbus_lib_signal.c 2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -0,0 +1,126 @@
+#include "config.h"
+
+#include <gnunet/platform.h>
+#include <gnunet/gnunet_common.h>
+#include <gnunet/gnunet_container_lib.h>
+
+#include "gnunet_dbus_lib.h"
+
+#define LOG(kind, ...) GNUNET_log_from (kind, "dbus-signal", __VA_ARGS__)
+
+struct GNUNET_DBUS_Signal
+{
+  struct GNUNET_DBUS_ArgIterator *args_front;
+  struct GNUNET_DBUS_ArgIterator *args_back;
+
+  struct GNUNET_DBUS_Interface *owner;
+
+  char *name;
+
+  unsigned ref_count;
+};
+
+struct GNUNET_DBUS_Signal *
+GNUNET_DBUS_signal_create (
+  const char *name)
+{
+  struct GNUNET_DBUS_Signal *ret = GNUNET_new (struct GNUNET_DBUS_Signal);
+  ret->args_front = NULL;
+  ret->args_back  = NULL;
+  ret->owner = NULL;
+  ret->name = strdup (name);
+  ret->ref_count = 1;
+
+  return ret;
+}
+
+void
+GNUNET_DBUS_signal_ref (
+    struct GNUNET_DBUS_Signal *signal)
+{
+  signal->ref_count++;
+}
+
+void
+GNUNET_DBUS_signal_unref (
+    struct GNUNET_DBUS_Signal *signal)
+{
+  if (signal->ref_count == 0)
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to unreference signal with ref count 
0.\n");
+    GNUNET_abort ();
+  }
+  if (0 == --(signal->ref_count))
+  {
+    struct GNUNET_DBUS_ArgIterator *arg_it = signal->args_front;
+    while (arg_it)
+    {
+      struct GNUNET_DBUS_ArgIterator *next = arg_it->next;
+      GNUNET_DBUS_arg_unref (arg_it->arg);
+      GNUNET_free (arg_it);
+      arg_it = next;
+    }
+
+    GNUNET_free (signal->name);
+    GNUNET_free (signal);
+  }
+};
+
+void
+GNUNET_DBUS_signal_add_arg (
+    struct GNUNET_DBUS_Signal *signal,
+    const char *name,
+    const char *signature)
+{
+  struct GNUNET_DBUS_Arg *arg = GNUNET_DBUS_arg_create (name, signature);
+  struct GNUNET_DBUS_ArgIterator *arg_it = GNUNET_new (struct 
GNUNET_DBUS_ArgIterator);
+  arg_it->arg = arg;
+  GNUNET_CONTAINER_DLL_insert_tail (signal->args_front,
+                                    signal->args_back,
+                                    arg_it);
+};
+
+const char *
+GNUNET_DBUS_signal_get_name (
+    const struct GNUNET_DBUS_Signal *signal)
+{
+  return signal->name;
+}
+
+const struct GNUNET_DBUS_ArgIterator *
+GNUNET_DBUS_signal_iterate_args (
+    const struct GNUNET_DBUS_Signal *signal)
+{
+  return signal->args_front;
+}
+
+DBusMessage *
+GNUNET_DBUS_signal_spawn (
+    const struct GNUNET_DBUS_Signal *signal,
+    const struct GNUNET_DBUS_ObjectPath *path,
+    const struct GNUNET_DBUS_Interface *interface,
+    bool pretty)
+{
+  char *path_str = GNUNET_DBUS_object_path_to_string (path);
+  DBusMessage *ret = dbus_message_new_signal (
+      path_str,
+      GNUNET_DBUS_interface_get_name (interface),
+      signal->name);
+  GNUNET_free (path_str);
+  GNUNET_DBUS_message_set_pretty (ret, pretty);
+  return ret;
+};
+
+DBusMessage *
+GNUNET_DBUS_signal_spawn_unicast (
+    const struct GNUNET_DBUS_Signal *signal,
+    const struct GNUNET_DBUS_ObjectPath *path,
+    const struct GNUNET_DBUS_Interface *interface,
+    const struct GNUNET_DBUS_Client *client,
+    bool pretty)
+{
+  DBusMessage *ret = GNUNET_DBUS_signal_spawn (signal, path, interface, 
pretty);
+  dbus_message_set_destination (ret, GNUNET_DBUS_client_get_unique_name 
(client));
+  return ret;
+}
+

Modified: gnunet-dbus/src/lib/common/timeout.c
===================================================================
--- gnunet-dbus/src/lib/common/timeout.c        2014-04-17 23:44:37 UTC (rev 
33109)
+++ gnunet-dbus/src/lib/common/timeout.c        2014-04-18 09:51:04 UTC (rev 
33110)
@@ -27,24 +27,12 @@
 
   t->timeout = timeout;
   t->scheduled = false;
+  t->ref_count = 1;
 
   return t;
 }
 
 void
-timeout_destroy (
-    struct Timeout *t)
-{
-  if (0 != t->ref_count)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to destroy timeout with ref_count == 
%u\n", t->ref_count);
-    GNUNET_abort ();
-  };
-
-  GNUNET_free (t);
-}
-
-void
 timeout_ref (
     struct Timeout *t)
 {
@@ -62,7 +50,9 @@
   };
 
   if (0 == --t->ref_count)
-    timeout_destroy (t);
+  {
+    GNUNET_free (t);
+  }
 }
 
 static void

Modified: gnunet-dbus/src/lib/common/timeout.h
===================================================================
--- gnunet-dbus/src/lib/common/timeout.h        2014-04-17 23:44:37 UTC (rev 
33109)
+++ gnunet-dbus/src/lib/common/timeout.h        2014-04-18 09:51:04 UTC (rev 
33110)
@@ -18,7 +18,6 @@
 };
 
 struct Timeout *timeout_create (DBusTimeout *timeout);
-void timeout_destroy (struct Timeout *t);
 void timeout_ref (struct Timeout *t);
 void timeout_unref (struct Timeout *t);
 

Modified: gnunet-dbus/src/lib/common/watch.c
===================================================================
--- gnunet-dbus/src/lib/common/watch.c  2014-04-17 23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/common/watch.c  2014-04-18 09:51:04 UTC (rev 33110)
@@ -45,6 +45,7 @@
   w->scheduled = false;
   w->net_handle = NULL;
   w->file_handle = NULL;
+  w->ref_count = 1;
 
   SOCKTYPE sock = dbus_watch_get_socket (watch);
   if (-1 != sock)
@@ -79,24 +80,6 @@
 };
 
 void
-watch_destroy (
-    struct Watch *w)
-{
-  if (0 != w->ref_count)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Tried to destroy watch with ref_count == 
%zu\n", w->ref_count);
-    GNUNET_abort ();
-  };
-
-  if (w->net_handle)
-    GNUNET_free (w->net_handle);
-  if (w->file_handle)
-    GNUNET_free (w->file_handle);
-
-  GNUNET_free (w);
-};
-
-void
 watch_ref (
     struct Watch *w)
 {
@@ -114,7 +97,14 @@
   };
 
   if (0 == --w->ref_count)
-    watch_destroy (w);
+  {
+    if (w->net_handle)
+      GNUNET_free (w->net_handle);
+    if (w->file_handle)
+      GNUNET_free (w->file_handle);
+
+    GNUNET_free (w);
+  }
 };
 
 /*

Modified: gnunet-dbus/src/lib/common/watch.h
===================================================================
--- gnunet-dbus/src/lib/common/watch.h  2014-04-17 23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/common/watch.h  2014-04-18 09:51:04 UTC (rev 33110)
@@ -18,7 +18,6 @@
 };
 
 struct Watch *watch_create (DBusWatch *watch);
-void watch_destroy (struct Watch *w);
 void watch_ref (struct Watch *w);
 void watch_unref (struct Watch *w);
 

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib.h       2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib.h       2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -8,8 +8,10 @@
 
 #include "gnunet_dbus_lib_service.h"
 #include "gnunet_dbus_lib_object.h"
+#include "gnunet_dbus_lib_object_path.h"
 #include "gnunet_dbus_lib_interface.h"
 #include "gnunet_dbus_lib_method.h"
+#include "gnunet_dbus_lib_signal.h"
 #include "gnunet_dbus_lib_arg.h"
 #include "gnunet_dbus_lib_message.h"
 #include "gnunet_dbus_lib_method_context.h"

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_arg.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_arg.h   2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_arg.h   2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -18,10 +18,6 @@
     const char *signature);
 
 void
-GNUNET_DBUS_arg_destroy (
-    struct GNUNET_DBUS_Arg *arg);
-
-void
 GNUNET_DBUS_arg_ref (
     struct GNUNET_DBUS_Arg *arg);
 

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_client.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_client.h        2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_client.h        2014-04-18 
09:51:04 UTC (rev 33110)
@@ -18,9 +18,13 @@
     const char *unique_name);
 
 void
-GNUNET_DBUS_client_destroy (
+GNUNET_DBUS_client_ref (
     struct GNUNET_DBUS_Client *client);
 
+void
+GNUNET_DBUS_client_unref (
+    struct GNUNET_DBUS_Client *client);
+
 const char *
 GNUNET_DBUS_client_get_unique_name (
     const struct GNUNET_DBUS_Client *client);

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_interface.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_interface.h     2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_interface.h     2014-04-18 
09:51:04 UTC (rev 33110)
@@ -8,6 +8,7 @@
 #include "gnunet_dbus_lib_object.h"
 #include "gnunet_dbus_lib_method.h"
 #include "gnunet_dbus_lib_method_context.h"
+#include "gnunet_dbus_lib_signal.h"
 
 struct GNUNET_DBUS_InterfaceIterator
 {
@@ -23,10 +24,6 @@
     const char *name);
 
 void
-GNUNET_DBUS_interface_destroy (
-    struct GNUNET_DBUS_Interface *interface);
-
-void
 GNUNET_DBUS_interface_ref (
     struct GNUNET_DBUS_Interface *interface);
 
@@ -39,6 +36,11 @@
     struct GNUNET_DBUS_Interface *interface,
     struct GNUNET_DBUS_Method *method);
 
+void
+GNUNET_DBUS_interface_add_signal (
+    struct GNUNET_DBUS_Interface *interface,
+    struct GNUNET_DBUS_Signal *signal);
+
 const char *
 GNUNET_DBUS_interface_get_name (
     const struct GNUNET_DBUS_Interface *interface);
@@ -47,6 +49,10 @@
 GNUNET_DBUS_interface_iterate_methods (
     const struct GNUNET_DBUS_Interface *interface);
 
+const struct GNUNET_DBUS_SignalIterator *
+GNUNET_DBUS_interface_iterate_signals (
+    const struct GNUNET_DBUS_Interface *interface);
+
 struct GNUNET_DBUS_Interface *
 GNUNET_DBUS_interface_introspectable ();
 

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_message.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_message.h       2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_message.h       2014-04-18 
09:51:04 UTC (rev 33110)
@@ -4,6 +4,8 @@
 #include <stdbool.h>
 #include <dbus/dbus.h>
 
+#include "gnunet_dbus_lib_client.h"
+
 bool
 GNUNET_DBUS_message_get_pretty (
     DBusMessage *message);
@@ -13,5 +15,14 @@
     DBusMessage *message,
     bool pretty);
 
+void
+GNUNET_DBUS_message_set_destination (
+    DBusMessage *message,
+    struct GNUNET_DBUS_Client *client);
+
+void
+GNUNET_DBUS_message_unset_destination (
+    DBusMessage *message);
+
 #endif
 

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_method.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_method.h        2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_method.h        2014-04-18 
09:51:04 UTC (rev 33110)
@@ -23,10 +23,6 @@
     void (*underlying_method)(struct GNUNET_DBUS_MethodContext *mc));
 
 void
-GNUNET_DBUS_method_destroy (
-    struct GNUNET_DBUS_Method *method);
-
-void
 GNUNET_DBUS_method_ref (
     struct GNUNET_DBUS_Method *method);
 

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_method_context.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_method_context.h        
2014-04-17 23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_method_context.h        
2014-04-18 09:51:04 UTC (rev 33110)
@@ -28,10 +28,6 @@
     DBusMessage *message);
   
 void
-GNUNET_DBUS_method_context_destroy (
-    struct GNUNET_DBUS_MethodContext *mc);
-
-void
 GNUNET_DBUS_method_context_ref (
     struct GNUNET_DBUS_MethodContext *mc);
 

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_object.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_object.h        2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_object.h        2014-04-18 
09:51:04 UTC (rev 33110)
@@ -16,14 +16,10 @@
 
 struct GNUNET_DBUS_Object *
 GNUNET_DBUS_object_create (
-    const char *path,
+    const char *name,
     void *data);
 
 void
-GNUNET_DBUS_object_destroy (
-    struct GNUNET_DBUS_Object *object);
-
-void
 GNUNET_DBUS_object_ref (
     struct GNUNET_DBUS_Object *object);
 
@@ -32,8 +28,8 @@
     struct GNUNET_DBUS_Object *object);
 
 const char *
-GNUNET_DBUS_object_get_path (
-    struct GNUNET_DBUS_Object *object);
+GNUNET_DBUS_object_get_name (
+    const struct GNUNET_DBUS_Object *object);
 
 void
 GNUNET_DBUS_object_add_interface (
@@ -48,5 +44,29 @@
 GNUNET_DBUS_object_get_data (
     struct GNUNET_DBUS_Object *object);
 
+struct GNUNET_DBUS_Object *
+GNUNET_DBUS_object_create_uniquely_named_subobject (
+    struct GNUNET_DBUS_Object *object,
+    void *data);
+
+void
+GNUNET_DBUS_object_add_subobject (
+    struct GNUNET_DBUS_Object *object,
+    struct GNUNET_DBUS_Object *subobject);
+
+void
+GNUNET_DBUS_object_remove_subobject (
+    struct GNUNET_DBUS_Object *object,
+    struct GNUNET_DBUS_ObjectIterator *subobject_it);
+
+const struct GNUNET_DBUS_ObjectIterator *
+GNUNET_DBUS_object_iterate_subobjects (
+    const struct GNUNET_DBUS_Object *object);
+
+const struct GNUNET_DBUS_ObjectIterator *
+GNUNET_DBUS_object_find (
+    const struct GNUNET_DBUS_ObjectIterator *object_it,
+    const char *name);
+
 #endif
 

Added: gnunet-dbus/src/lib/include/gnunet_dbus_lib_object_path.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_object_path.h                   
        (rev 0)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_object_path.h   2014-04-18 
09:51:04 UTC (rev 33110)
@@ -0,0 +1,31 @@
+#ifndef GNUNET_DBUS_LIB_OBJECT_PATH_H
+#define GNUNET_DBUS_LIB_OBJECT_PATH_H
+
+#include "gnunet_dbus_lib_object.h"
+
+struct GNUNET_DBUS_ObjectPath;
+
+struct GNUNET_DBUS_ObjectPath *
+GNUNET_DBUS_object_path_create (
+    struct GNUNET_DBUS_Service *service,
+    ...)
+  __attribute__((sentinel));
+
+void
+GNUNET_DBUS_object_path_ref (
+    struct GNUNET_DBUS_ObjectPath *path);
+
+void
+GNUNET_DBUS_object_path_unref (
+    struct GNUNET_DBUS_ObjectPath *path);
+
+char *
+GNUNET_DBUS_object_path_to_string (
+    const struct GNUNET_DBUS_ObjectPath *path);
+
+struct GNUNET_DBUS_Object *
+GNUNET_DBUS_object_path_get_destination (
+    const struct GNUNET_DBUS_ObjectPath *path);
+
+#endif
+

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_pop.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_pop.h   2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_pop.h   2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -97,7 +97,8 @@
     DBusMessage *message,
     DBusMessageIter *iter,
     DBusMessageIter *iter_sub,
-    const char *arg_name);
+    const char *arg_name,
+    size_t *len);
 
 DBusMessage *
 GNUNET_DBUS_pop_enter_struct (

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_push.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_push.h  2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_push.h  2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -70,7 +70,7 @@
 GNUNET_DBUS_push_object_path (
     DBusMessage *message,
     DBusMessageIter *iter,
-    const char *const *value);
+    const struct GNUNET_DBUS_ObjectPath *path);
 
 void
 GNUNET_DBUS_push_signature (

Modified: gnunet-dbus/src/lib/include/gnunet_dbus_lib_service.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_service.h       2014-04-17 
23:44:37 UTC (rev 33109)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_service.h       2014-04-18 
09:51:04 UTC (rev 33110)
@@ -23,25 +23,18 @@
     const char *name);
 
 void
-GNUNET_DBUS_service_destroy (
+GNUNET_DBUS_service_ref (
     struct GNUNET_DBUS_Service *service);
 
+void
+GNUNET_DBUS_service_unref (
+    struct GNUNET_DBUS_Service *service);
+
 const struct GNUNET_CONFIGURATION_Handle *
 GNUNET_DBUS_service_get_config (
     struct GNUNET_DBUS_Service *service);
 
-int
-GNUNET_DBUS_service_add_object (
-    struct GNUNET_DBUS_Service *service,
-    struct GNUNET_DBUS_Object *object)
-  __attribute__((warn_unused_result));
-
 void
-GNUNET_DBUS_service_remove_object (
-    struct GNUNET_DBUS_Service *service,
-    struct GNUNET_DBUS_Object *object);
-
-void
 GNUNET_DBUS_service_send (
     struct GNUNET_DBUS_Service *service,
     DBusMessage *dbus_message);
@@ -52,5 +45,9 @@
     GNUNET_DBUS_ClientConnectsHandler client_connects,
     GNUNET_DBUS_ClientDisconnectsHandler client_disconnects);
 
+struct GNUNET_DBUS_Object *
+GNUNET_DBUS_service_get_root_object (
+    struct GNUNET_DBUS_Service *service);
+
 #endif
 

Added: gnunet-dbus/src/lib/include/gnunet_dbus_lib_signal.h
===================================================================
--- gnunet-dbus/src/lib/include/gnunet_dbus_lib_signal.h                        
        (rev 0)
+++ gnunet-dbus/src/lib/include/gnunet_dbus_lib_signal.h        2014-04-18 
09:51:04 UTC (rev 33110)
@@ -0,0 +1,60 @@
+#ifndef GNUNET_DBUS_LIB_SIGNAL_H
+#define GNUNET_DBUS_LIB_SIGNAL_H
+
+struct GNUNET_DBUS_Signal;
+
+#include "gnunet_dbus_lib_object_path.h"
+#include "gnunet_dbus_lib_interface.h"
+
+struct GNUNET_DBUS_SignalIterator
+{
+  /* linked list */
+  struct GNUNET_DBUS_SignalIterator *next;
+  struct GNUNET_DBUS_SignalIterator *prev;
+
+  struct GNUNET_DBUS_Signal *signal;
+};
+
+struct GNUNET_DBUS_Signal *
+GNUNET_DBUS_signal_create (
+  const char *name);
+
+void
+GNUNET_DBUS_signal_ref (
+    struct GNUNET_DBUS_Signal *signal);
+
+void
+GNUNET_DBUS_signal_unref (
+    struct GNUNET_DBUS_Signal *signal);
+
+void
+GNUNET_DBUS_signal_add_arg (
+    struct GNUNET_DBUS_Signal *signal,
+    const char *name,
+    const char *signature);
+
+const char *
+GNUNET_DBUS_signal_get_name (
+    const struct GNUNET_DBUS_Signal *signal);
+
+const struct GNUNET_DBUS_ArgIterator *
+GNUNET_DBUS_signal_iterate_args (
+    const struct GNUNET_DBUS_Signal *signal);
+
+DBusMessage *
+GNUNET_DBUS_signal_spawn (
+    const struct GNUNET_DBUS_Signal *signal,
+    const struct GNUNET_DBUS_ObjectPath *path,
+    const struct GNUNET_DBUS_Interface *interface,
+    bool pretty);
+
+DBusMessage *
+GNUNET_DBUS_signal_spawn_unicast (
+    const struct GNUNET_DBUS_Signal *signal,
+    const struct GNUNET_DBUS_ObjectPath *path,
+    const struct GNUNET_DBUS_Interface *interface,
+    const struct GNUNET_DBUS_Client *client,
+    bool pretty);
+
+#endif
+

Modified: gnunet-dbus/src/services/gnunet-service-dht-dbus.c
===================================================================
--- gnunet-dbus/src/services/gnunet-service-dht-dbus.c  2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/services/gnunet-service-dht-dbus.c  2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -17,10 +17,8 @@
 
 struct GetRequest
 {
-  struct GNUNET_DBUS_Service *service;
   struct GNUNET_DBUS_Client *client;
   struct GNUNET_DHT_GetHandle *handle;
-  char *results_dest;
   bool pretty;
 };
 
@@ -31,33 +29,59 @@
   struct GNUNET_DHT_Handle *dht_handle;
 };
 
+static struct GNUNET_DBUS_Service   *gbl_dht_service;
+static struct GNUNET_DBUS_Interface *gbl_dht_interface;
+static struct GNUNET_DBUS_Method    *gbl_dht_put_method;
+static struct GNUNET_DBUS_Method    *gbl_dht_get_start_method;
+static struct GNUNET_DBUS_Object    *gbl_dht_get_object;
+static struct GNUNET_DBUS_Interface *gbl_dht_get_request_interface;
+static struct GNUNET_DBUS_Method    
+    *gbl_dht_get_request_filter_known_results_method;
+static struct GNUNET_DBUS_Signal    *gbl_dht_get_request_result_signal;
+
 static void
 put_return (
     void *cls,
     int success)
 {
-  struct GNUNET_DBUS_MethodContext *mc = (struct GNUNET_DBUS_MethodContext 
*)cls;
+  struct GNUNET_DBUS_MethodContext *mc = 
+      (struct GNUNET_DBUS_MethodContext *)cls;
   unsigned msg_serial = dbus_message_get_serial (mc->message);
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Received reply from DHT. Method call id 
%u\n", msg_serial);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Received reply from DHT. Method call id %u\n",
+         msg_serial);
   DBusMessage *reply;
   switch (success)
   {
   case GNUNET_OK:
-    reply = dbus_message_new_method_return (mc->message);
+    reply = GNUNET_DBUS_method_context_create_reply (mc);
     break;
   case GNUNET_NO:
-    reply = dbus_message_new_error (mc->message, DBUS_ERROR_FAILED, "DHT 
service timed out.");
+    reply = dbus_message_new_error (
+        mc->message, 
+        DBUS_ERROR_FAILED, 
+        "DHT service timed out.");
     break;
   case GNUNET_SYSERR:
-    reply = dbus_message_new_error (mc->message, DBUS_ERROR_FAILED, "DHT DBus 
proxy was disconnected from DHT service.");
+    reply = dbus_message_new_error (
+        mc->message, 
+        DBUS_ERROR_FAILED, 
+        "DHT DBus proxy was disconnected from DHT service.");
     break;
   default:
-    reply = dbus_message_new_error_printf (mc->message, DBUS_ERROR_FAILED, 
"Unabled to interpret response from DHT service. Service returned code %d.", 
success);
+    reply = dbus_message_new_error_printf (
+        mc->message, 
+        DBUS_ERROR_FAILED, 
+        "Unabled to interpret response from DHT service."
+        "Service returned code %d.",
+          success);
   };
 
   GNUNET_DBUS_method_context_send_reply (mc, reply);
   GNUNET_DBUS_method_context_unref (mc);
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Received reply from DHT. Method call id 
%u\n", msg_serial);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Received reply from DHT. Method call id %u\n",
+         msg_serial);
 };
 
 static void
@@ -73,19 +97,39 @@
   struct GNUNET_TIME_Absolute expiry;
 
   unsigned msg_serial = dbus_message_get_serial (mc->message);
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Recieved put from dbus. Method call id %u\n", 
msg_serial);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Recieved put from dbus. Method call id %u\n",
+       msg_serial);
 
   DBusMessage *message = mc->message;
   DBusMessageIter iter;
   dbus_message_iter_init (message, &iter);
 
   DBusMessage *reply = NULL;
-  reply = reply ? reply : GNUNET_DBUS_pop_hashcode (message, &iter, "key", 
&key);
-  reply = reply ? reply : GNUNET_DBUS_pop_uint32 (message, &iter, 
"desired_replication_level", &desired_replication_level);
-  reply = reply ? reply : GNUNET_DHT_DBUS_pop_route_option (message, &iter, 
"options", &options);
-  reply = reply ? reply : GNUNET_BLOCK_DBUS_pop_type (message, &iter, "type", 
&type);
-  reply = reply ? reply : GNUNET_DBUS_pop_byte_array (message, &iter, "data", 
(const unsigned char **)&data, &size);
-  reply = reply ? reply : GNUNET_TIME_DBUS_pop_absolute (message, &iter, 
"expiry", &expiry);
+  reply = reply ? reply : GNUNET_DBUS_pop_hashcode (
+                              message, &iter, 
+                              "key",
+                              &key);
+  reply = reply ? reply : GNUNET_DBUS_pop_uint32 (
+                              message, &iter,
+                              "desired_replication_level",
+                              &desired_replication_level);
+  reply = reply ? reply : GNUNET_DHT_DBUS_pop_route_option (
+                              message, &iter,
+                              "options",
+                              &options);
+  reply = reply ? reply : GNUNET_BLOCK_DBUS_pop_type (
+                              message, &iter,
+                              "type",
+                              &type);
+  reply = reply ? reply : GNUNET_DBUS_pop_byte_array (
+                              message, &iter,
+                              "data",
+                              (const unsigned char **)&data, &size);
+  reply = reply ? reply : GNUNET_TIME_DBUS_pop_absolute (
+                              message, &iter,
+                              "expiry",
+                              &expiry);
   if (reply)
   {
     GNUNET_DBUS_method_context_send_reply (mc, reply);
@@ -109,10 +153,58 @@
       put_return,
       mc);
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Forwarded put to dht. Method call id %u\n", 
msg_serial);
+  LOG (
+      GNUNET_ERROR_TYPE_DEBUG,
+      "Forwarded put to dht. Method call id %u\n",
+        msg_serial);
 };
 
 static void
+get_filter_known_results (
+    struct GNUNET_DBUS_MethodContext *mc)
+{
+  struct GNUNET_HashCode *results;
+  size_t results_len;
+
+  DBusMessage *message = mc->message;
+  DBusMessageIter iter;
+  DBusMessageIter iter_sub;
+  dbus_message_iter_init (message, &iter);
+
+  DBusMessage *reply = NULL;
+  reply = GNUNET_DBUS_pop_enter_array (message, &iter, &iter_sub, 
+                                       "results",
+                                       &results_len);
+  if (reply)
+  {
+    GNUNET_DBUS_method_context_send_reply (mc, reply);
+    return ;
+  };
+
+  results = GNUNET_malloc (sizeof (struct GNUNET_HashCode) * results_len);
+  size_t i;
+  for (i = 0; i < results_len && ! results ; i++)
+    reply = GNUNET_DBUS_pop_hashcode (message, &iter_sub,
+                                      "result",
+                                      results + i);
+  if(reply)
+  {
+    GNUNET_free (results);
+    GNUNET_DBUS_method_context_send_reply (mc, reply);
+    return;
+  };
+
+  struct GetRequest *get_request = GNUNET_DBUS_object_get_data (mc->object);
+  struct GNUNET_DHT_GetHandle *handle = get_request->handle;
+
+  GNUNET_DHT_get_filter_known_results (handle, (unsigned)results_len, results);
+  GNUNET_free (results);
+
+  reply = GNUNET_DBUS_method_context_create_reply (mc);
+  GNUNET_DBUS_method_context_send_reply (mc, reply);
+}
+
+static void
 get_iter_return (
     void *cls,
     struct GNUNET_TIME_Absolute expiry,
@@ -127,34 +219,48 @@
 {
   unsigned i;
   struct GNUNET_DBUS_Object *request_object = (struct GNUNET_DBUS_Object *)cls;
-  struct GetRequest *get_request = (struct GetRequest 
*)GNUNET_DBUS_object_get_data (request_object);
+  struct GetRequest *get_request = 
+      (struct GetRequest *)GNUNET_DBUS_object_get_data (request_object);
   struct GNUNET_DBUS_Client *client = get_request->client;
+  struct GNUNET_DBUS_ObjectPath *path = GNUNET_DBUS_object_path_create (
+                                            gbl_dht_service,
+                                            gbl_dht_get_object,
+                                            request_object,
+                                            NULL);
 
-  DBusMessage *message = GNUNET_DBUS_client_create_unicast_signal (
+  DBusMessage *message = GNUNET_DBUS_signal_spawn_unicast (
+      gbl_dht_get_request_result_signal,
+      path,
+      gbl_dht_get_request_interface,
       client,
-      GNUNET_DBUS_object_get_path (request_object),
-      "gnu.gnunet.dht.get",
-      "result",
       get_request->pretty);
 
+  GNUNET_DBUS_object_path_unref (path);
+
   DBusMessageIter message_iter;
   DBusMessageIter message_iter_sub;
   dbus_message_iter_init_append (message, &message_iter);
   
   GNUNET_TIME_DBUS_push_absolute (message, &message_iter, &expiry);
   GNUNET_DBUS_push_hashcode (message, &message_iter, key);
-  GNUNET_DBUS_push_open_array (message, &message_iter, &message_iter_sub, 
GNUNET_DBUS_SIGNATURE_PEER_IDENTITY);
+  GNUNET_DBUS_push_open_array (message, &message_iter, &message_iter_sub, 
+                               GNUNET_DBUS_SIGNATURE_PEER_IDENTITY);
   for (i = 0; i < get_path_len; i++)
+  {
     GNUNET_DBUS_push_peer_identity (message, &message_iter_sub, get_path + i);
+  }
   GNUNET_DBUS_push_close_array (message, &message_iter, &message_iter_sub);
-  GNUNET_DBUS_push_open_array (message, &message_iter, &message_iter_sub, 
GNUNET_DBUS_SIGNATURE_PEER_IDENTITY);
+  GNUNET_DBUS_push_open_array (message, &message_iter, &message_iter_sub,
+                               GNUNET_DBUS_SIGNATURE_PEER_IDENTITY);
   for (i = 0; i < put_path_len; i++)
+  {
     GNUNET_DBUS_push_peer_identity (message, &message_iter_sub, put_path + i);
+  }
   GNUNET_DBUS_push_close_array (message, &message_iter, &message_iter_sub);
   GNUNET_BLOCK_DBUS_push_type (message, &message_iter, &type);
   GNUNET_DBUS_push_byte_array (message, &message_iter, data, size);
   
-  GNUNET_DBUS_service_send (get_request->service, message);
+  GNUNET_DBUS_service_send (gbl_dht_service, message);
 }
 
 static void
@@ -173,11 +279,26 @@
   DBusMessageIter iter;
   dbus_message_iter_init (message, &iter);
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here qwe\n");
+
   DBusMessage *reply = NULL;
-  reply = reply ? reply : GNUNET_BLOCK_DBUS_pop_type (message, &iter, "type", 
&type);
-  reply = reply ? reply : GNUNET_DBUS_pop_hashcode (message, &iter, "key", 
&key);
-  reply = reply ? reply : GNUNET_DBUS_pop_uint32 (message, &iter, 
"desired_replication_level", &desired_replication_level);
-  reply = reply ? reply : GNUNET_DHT_DBUS_pop_route_option (message, &iter, 
"options", &options);
+  reply = reply ? reply : GNUNET_BLOCK_DBUS_pop_type (
+                              message, &iter,
+                              "type",
+                              &type);
+  reply = reply ? reply : GNUNET_DBUS_pop_hashcode (
+                              message, &iter,
+                              "key",
+                              &key);
+  reply = reply ? reply : GNUNET_DBUS_pop_uint32 (
+                              message, &iter,
+                              "desired_replication_level",
+                              &desired_replication_level);
+  reply = reply ? reply : GNUNET_DHT_DBUS_pop_route_option (
+                              message, &iter,
+                              "options",
+                              &options);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here asd\n");
   if (reply)
   {
     GNUNET_DBUS_method_context_send_reply (mc, reply);
@@ -185,54 +306,49 @@
   };
   //if (GNUNET_DBUS_message_get_pretty_encoded (message))
     //GNUNET_DBUS_client_set_prefers_pretty_encodings (mc->client, true);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here zxc\n");
 
   GNUNET_DBUS_method_context_ref (mc);
   struct ClientData *cd = GNUNET_DBUS_client_get_data (mc->client);
   struct GNUNET_DHT_Handle *handle = cd->dht_handle;
 
   struct GetRequest *get_request = GNUNET_new (struct GetRequest);
-  get_request->service = mc->service;
   get_request->client = mc->client;
   get_request->pretty = GNUNET_DBUS_message_get_pretty (message);
-  struct GNUNET_DBUS_Object *request_object = NULL;
-  char *request_obj_path = NULL;
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here rty\n");
 
-  while (true)
-  {
-    uint32_t request_id = GNUNET_CRYPTO_random_u32 
(GNUNET_CRYPTO_QUALITY_WEAK, 0xffffffff);
-    request_obj_path = NULL;
-    GNUNET_asprintf (&request_obj_path, "/get/%08x", request_id);
-    request_object = GNUNET_DBUS_object_create (request_obj_path, get_request);
-    if (! request_object)
-    {
-      LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to create request object.\n");
-      GNUNET_abort ();
-    };
+  struct GNUNET_DBUS_Object *request_object = 
+      GNUNET_DBUS_object_create_uniquely_named_subobject (gbl_dht_get_object,
+                                                          get_request);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here passed rty\n");
+  GNUNET_DBUS_object_add_interface (request_object,
+                                    GNUNET_DBUS_interface_introspectable ());
+  GNUNET_DBUS_object_add_interface (request_object,
+                                    gbl_dht_get_request_interface);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here fgh\n");
 
-    int succ = GNUNET_DBUS_service_add_object (mc->service, request_object);
-    if (GNUNET_OK == succ)
-      break;
-    
-    LOG (GNUNET_ERROR_TYPE_WARNING, "Name %s appears to be taken. 
Retrying.\n", request_obj_path);
-    GNUNET_free (request_object);
-    GNUNET_free (request_obj_path);
-  };
+  struct GNUNET_DBUS_ObjectPath *path = 
+      GNUNET_DBUS_object_path_create (gbl_dht_service,
+                                      gbl_dht_get_object,
+                                      request_object,
+                                      NULL);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here vbn\n");
 
-  reply = dbus_message_new_method_return (message);
+  reply = GNUNET_DBUS_method_context_create_reply (mc);
   DBusMessageIter reply_iter;
   dbus_message_iter_init_append (reply, &reply_iter);
-  const char *request_obj_path_const = request_obj_path;
-  GNUNET_DBUS_push_object_path (reply, &reply_iter, &request_obj_path_const);
+  GNUNET_DBUS_push_object_path (reply, &reply_iter, path);
   GNUNET_DBUS_method_context_send_reply (mc, reply);
-  GNUNET_free (request_obj_path);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here uio\n");
 
-  struct GNUNET_DBUS_ObjectIterator *obj_it = GNUNET_new (struct 
GNUNET_DBUS_ObjectIterator);
+  struct GNUNET_DBUS_ObjectIterator *obj_it = 
+      GNUNET_new (struct GNUNET_DBUS_ObjectIterator);
   obj_it->object = request_object;
-  GNUNET_CONTAINER_DLL_insert (
-      cd->gets_front,
-      cd->gets_back,
-      obj_it);
+  GNUNET_CONTAINER_DLL_insert (cd->gets_front,
+                               cd->gets_back,
+                               obj_it);
 
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here jkl\n");
   get_request->handle = GNUNET_DHT_get_start (
       handle,
       type,
@@ -243,6 +359,7 @@
       0,
       get_iter_return,
       request_object);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "here m,.\n");
 };
 
 static void
@@ -250,14 +367,19 @@
     struct GNUNET_DBUS_Service *service,
     struct GNUNET_DBUS_Client *client)
 {
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Creating dht client for %s\n", 
GNUNET_DBUS_client_get_unique_name (client));
-  const struct GNUNET_CONFIGURATION_Handle *cfg = 
GNUNET_DBUS_service_get_config (service);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Creating dht client for %s\n",
+         GNUNET_DBUS_client_get_unique_name (client));
+  const struct GNUNET_CONFIGURATION_Handle *cfg =
+      GNUNET_DBUS_service_get_config (service);
   struct ClientData *cd = GNUNET_new (struct ClientData);
   cd->dht_handle = GNUNET_DHT_connect (cfg, 32);
   cd->gets_front = NULL;
   cd->gets_back = NULL;
   GNUNET_DBUS_client_set_data (client, cd);
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Finished creating DHT client for %s\n", 
GNUNET_DBUS_client_get_unique_name (client));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Finished creating DHT client for %s\n",
+         GNUNET_DBUS_client_get_unique_name (client));
 };
 
 static void
@@ -275,7 +397,7 @@
 
     GNUNET_DHT_get_stop (request->handle);
     GNUNET_free (request);
-    GNUNET_DBUS_service_remove_object (service, object);
+    GNUNET_DBUS_object_remove_subobject (gbl_dht_get_object, obj_it);
     GNUNET_free (obj_it);
     obj_it = next;
   };
@@ -288,10 +410,10 @@
     void *cls,
     const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  (void)cls;
   (void)tc;
 
-  struct GNUNET_DBUS_Service *dht_service = (struct GNUNET_DBUS_Service *)cls;
-  GNUNET_DBUS_service_destroy (dht_service);
+  GNUNET_DBUS_service_unref (gbl_dht_service);
 
   LOG (GNUNET_ERROR_TYPE_INFO, "Exiting.\n");
 };
@@ -305,44 +427,113 @@
 {
   LOG (GNUNET_ERROR_TYPE_DEBUG, "Running.\n");
 
-  struct GNUNET_DBUS_Service *dht_service = GNUNET_DBUS_service_create (cfg, 
"dht");
-  if (! dht_service)
+  gbl_dht_service = GNUNET_DBUS_service_create (cfg, "dht");
+  if (! gbl_dht_service)
   {
     LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to create dht service.\n");
     GNUNET_abort ();
   };
-  GNUNET_DBUS_service_set_client_handlers (dht_service, client_connects, 
client_disconnects);
+  GNUNET_DBUS_service_set_client_handlers (gbl_dht_service, 
+                                           client_connects,
+                                           client_disconnects);
 
-  struct GNUNET_DBUS_Object *dht_object = GNUNET_DBUS_object_create ("/", 
NULL);
-  int err = GNUNET_DBUS_service_add_object (dht_service, dht_object);
-  if (GNUNET_OK != err)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to add / object. 
GNUNET_DBUS_service_add_object returned %d\n", err);
-    GNUNET_abort();
-  };
+  struct GNUNET_DBUS_Object *root_object = 
+      GNUNET_DBUS_service_get_root_object (gbl_dht_service);
 
-  struct GNUNET_DBUS_Interface *dht_interface = GNUNET_DBUS_interface_create 
("gnu.gnunet.dht");
-  GNUNET_DBUS_object_add_interface (dht_object, 
GNUNET_DBUS_interface_introspectable ());
-  GNUNET_DBUS_object_add_interface (dht_object, dht_interface);
+  gbl_dht_interface = GNUNET_DBUS_interface_create ("gnu.gnunet.dht");
+  GNUNET_DBUS_object_add_interface (root_object,
+                                    GNUNET_DBUS_interface_introspectable ());
+  GNUNET_DBUS_object_add_interface (root_object,
+                                    gbl_dht_interface);
 
-  struct GNUNET_DBUS_Method *method_put = GNUNET_DBUS_method_create ("put", 
put);
-  GNUNET_DBUS_interface_add_method (dht_interface, method_put);
-  GNUNET_DBUS_method_add_arg (method_put, "key", 
GNUNET_DBUS_SIGNATURE_HASHCODE);
-  GNUNET_DBUS_method_add_arg (method_put, "desired_replication_level", 
GNUNET_DBUS_SIGNATURE_UINT32);
-  GNUNET_DBUS_method_add_arg (method_put, "options", 
GNUNET_DHT_DBUS_SIGNATURE_ROUTE_OPTION);
-  GNUNET_DBUS_method_add_arg (method_put, "type", 
GNUNET_BLOCK_DBUS_SIGNATURE_TYPE);
-  GNUNET_DBUS_method_add_arg (method_put, "data", GNUNET_DBUS_SIGNATURE_ARRAY 
(GNUNET_DBUS_SIGNATURE_BYTE));
-  GNUNET_DBUS_method_add_arg (method_put, "expiry", 
GNUNET_TIME_DBUS_SIGNATURE_ABSOLUTE);
+  gbl_dht_put_method = GNUNET_DBUS_method_create ("put", put);
+  GNUNET_DBUS_interface_add_method (gbl_dht_interface, gbl_dht_put_method);
+  GNUNET_DBUS_method_add_arg (gbl_dht_put_method,
+                              "key",
+                              GNUNET_DBUS_SIGNATURE_HASHCODE);
+  GNUNET_DBUS_method_add_arg (gbl_dht_put_method,
+                              "desired_replication_level",
+                              GNUNET_DBUS_SIGNATURE_UINT32);
+  GNUNET_DBUS_method_add_arg (gbl_dht_put_method,
+                              "options",
+                              GNUNET_DHT_DBUS_SIGNATURE_ROUTE_OPTION);
+  GNUNET_DBUS_method_add_arg (gbl_dht_put_method,
+                              "type",
+                              GNUNET_BLOCK_DBUS_SIGNATURE_TYPE);
+  GNUNET_DBUS_method_add_arg (gbl_dht_put_method,
+                              "data",
+                              GNUNET_DBUS_SIGNATURE_ARRAY (
+                                  GNUNET_DBUS_SIGNATURE_BYTE));
+  GNUNET_DBUS_method_add_arg (gbl_dht_put_method,
+                              "expiry",
+                              GNUNET_TIME_DBUS_SIGNATURE_ABSOLUTE);
 
-  struct GNUNET_DBUS_Method *method_get_start = GNUNET_DBUS_method_create 
("get_start", get_start);
-  GNUNET_DBUS_interface_add_method (dht_interface, method_get_start);
-  GNUNET_DBUS_method_add_arg (method_get_start, "type", 
GNUNET_BLOCK_DBUS_SIGNATURE_TYPE);
-  GNUNET_DBUS_method_add_arg (method_get_start, "key", 
GNUNET_DBUS_SIGNATURE_HASHCODE);
-  GNUNET_DBUS_method_add_arg (method_get_start, "desired_replication_level", 
GNUNET_DBUS_SIGNATURE_UINT32);
-  GNUNET_DBUS_method_add_arg (method_get_start, "options", 
GNUNET_DHT_DBUS_SIGNATURE_ROUTE_OPTION);
-  GNUNET_DBUS_method_add_return_arg (method_get_start, "request_object", 
GNUNET_DBUS_SIGNATURE_OBJECT_PATH);
+  gbl_dht_get_start_method = GNUNET_DBUS_method_create ("get_start",
+                                                        get_start);
+  GNUNET_DBUS_interface_add_method (gbl_dht_interface,
+                                    gbl_dht_get_start_method);
+  GNUNET_DBUS_method_add_arg (gbl_dht_get_start_method,
+                              "type",
+                              GNUNET_BLOCK_DBUS_SIGNATURE_TYPE);
+  GNUNET_DBUS_method_add_arg (gbl_dht_get_start_method,
+                              "key",
+                              GNUNET_DBUS_SIGNATURE_HASHCODE);
+  GNUNET_DBUS_method_add_arg (gbl_dht_get_start_method,
+                              "desired_replication_level",
+                              GNUNET_DBUS_SIGNATURE_UINT32);
+  GNUNET_DBUS_method_add_arg (gbl_dht_get_start_method,
+                              "options",
+                              GNUNET_DHT_DBUS_SIGNATURE_ROUTE_OPTION);
+  GNUNET_DBUS_method_add_return_arg (gbl_dht_get_start_method,
+                                     "request_object",
+                                     GNUNET_DBUS_SIGNATURE_OBJECT_PATH);
 
-  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, shutdown_task, 
dht_service);
+  gbl_dht_get_object = GNUNET_DBUS_object_create ("get", NULL);
+  GNUNET_DBUS_object_add_subobject (root_object, gbl_dht_get_object);
+  GNUNET_DBUS_object_add_interface (gbl_dht_get_object,
+                                    GNUNET_DBUS_interface_introspectable ());
+
+  gbl_dht_get_request_interface =
+      GNUNET_DBUS_interface_create ("gnu.gnunet.dht.get");
+
+  gbl_dht_get_request_filter_known_results_method =
+      GNUNET_DBUS_method_create ("filter_known_results",
+                                 get_filter_known_results);
+  GNUNET_DBUS_interface_add_method (
+      gbl_dht_get_request_interface,
+      gbl_dht_get_request_filter_known_results_method);
+  GNUNET_DBUS_method_add_arg (gbl_dht_get_request_filter_known_results_method,
+                              "results",
+                              GNUNET_DBUS_SIGNATURE_ARRAY (
+                                  GNUNET_DBUS_SIGNATURE_HASHCODE));
+
+  gbl_dht_get_request_result_signal = GNUNET_DBUS_signal_create ("result");
+  GNUNET_DBUS_interface_add_signal (gbl_dht_get_request_interface, 
+                                    gbl_dht_get_request_result_signal);
+  GNUNET_DBUS_signal_add_arg (gbl_dht_get_request_result_signal,
+                              "expiry",
+                              GNUNET_TIME_DBUS_SIGNATURE_ABSOLUTE);
+  GNUNET_DBUS_signal_add_arg (gbl_dht_get_request_result_signal,
+                              "key",
+                              GNUNET_DBUS_SIGNATURE_HASHCODE);
+  GNUNET_DBUS_signal_add_arg (gbl_dht_get_request_result_signal,
+                              "get_path",
+                              GNUNET_DBUS_SIGNATURE_ARRAY (
+                                  GNUNET_DBUS_SIGNATURE_PEER_IDENTITY));
+  GNUNET_DBUS_signal_add_arg (gbl_dht_get_request_result_signal,
+                              "put_path",
+                              GNUNET_DBUS_SIGNATURE_ARRAY (
+                                  GNUNET_DBUS_SIGNATURE_PEER_IDENTITY));
+  GNUNET_DBUS_signal_add_arg (gbl_dht_get_request_result_signal,
+                              "type",
+                              GNUNET_BLOCK_DBUS_SIGNATURE_TYPE);
+  GNUNET_DBUS_signal_add_arg (gbl_dht_get_request_result_signal,
+                              "data",
+                              GNUNET_DBUS_SIGNATURE_ARRAY (
+                                  GNUNET_DBUS_SIGNATURE_BYTE));
+
+  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
+                                shutdown_task, NULL);
 };
 
 int

Modified: gnunet-dbus/src/services/gnunet-service-gns-dbus.c
===================================================================
--- gnunet-dbus/src/services/gnunet-service-gns-dbus.c  2014-04-17 23:44:37 UTC 
(rev 33109)
+++ gnunet-dbus/src/services/gnunet-service-gns-dbus.c  2014-04-18 09:51:04 UTC 
(rev 33110)
@@ -117,7 +117,7 @@
   (void)tc;
 
   struct GNUNET_DBUS_Service *gns_service = (struct GNUNET_DBUS_Service *)cls;
-  GNUNET_DBUS_service_destroy (gns_service);
+  GNUNET_DBUS_service_unref (gns_service);
 
   LOG (GNUNET_ERROR_TYPE_INFO, "Exiting.\n");
 };
@@ -139,13 +139,7 @@
   };
   GNUNET_DBUS_service_set_client_handlers (gns_service, client_connects, 
client_disconnects);
 
-  struct GNUNET_DBUS_Object *gns_object = GNUNET_DBUS_object_create ("/", 
NULL);
-  int err = GNUNET_DBUS_service_add_object (gns_service, gns_object);
-  if (GNUNET_OK != err)
-  {
-    LOG (GNUNET_ERROR_TYPE_ERROR, "Failed to add / object. 
GNUNET_DBUS_service_add_object returned %d\n", err);
-    GNUNET_abort();
-  };
+  struct GNUNET_DBUS_Object *gns_object = GNUNET_DBUS_service_get_root_object 
(gns_service);
 
   struct GNUNET_DBUS_Interface *gns_interface = GNUNET_DBUS_interface_create 
("gnu.gnunet.gns");
   GNUNET_DBUS_object_add_interface (gns_object, 
GNUNET_DBUS_interface_introspectable ());




reply via email to

[Prev in Thread] Current Thread [Next in Thread]