[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 ());
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r33110 - in gnunet-dbus: . src/lib/common src/lib/include src/services,
gnunet <=