[gnome-keyring/dbus-api] [dbus] Add introspection to all our dbus objects.
- From: Stefan Walter <stefw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-keyring/dbus-api] [dbus] Add introspection to all our dbus objects.
- Date: Thu, 27 Aug 2009 02:33:43 +0000 (UTC)
commit a1b021547622d4a3d5372bc15677aff0b0a1ed8f
Author: Stef Walter <stef memberwebs com>
Date: Thu Aug 27 02:33:04 2009 +0000
[dbus] Add introspection to all our dbus objects.
daemon/dbus/Makefile.am | 11 ++++++-----
daemon/dbus/gkd-dbus-util.c | 35 +++++++++++++++++++++++++++++++++++
daemon/dbus/gkd-dbus-util.h | 8 +++++---
daemon/dbus/gkd-secrets-objects.c | 6 ++++++
daemon/dbus/gkd-secrets-service.c | 9 ++++++---
daemon/dbus/gkd-secrets-session.c | 4 ++++
6 files changed, 62 insertions(+), 11 deletions(-)
---
diff --git a/daemon/dbus/Makefile.am b/daemon/dbus/Makefile.am
index ea1c31f..36f2d96 100644
--- a/daemon/dbus/Makefile.am
+++ b/daemon/dbus/Makefile.am
@@ -1,10 +1,11 @@
INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/daemon \
- -I$(top_builddir) \
- $(DAEMON_CFLAGS) \
- $(GOBJECT_CFLAGS) \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/daemon \
+ -I$(top_builddir) \
+ -DINTROSPECTDIR=\"$(datadir)/gnome-keyring/introspect\" \
+ $(DAEMON_CFLAGS) \
+ $(GOBJECT_CFLAGS) \
$(GLIB_CFLAGS)
noinst_LTLIBRARIES = libgkr-dbus.la
diff --git a/daemon/dbus/gkd-dbus-util.c b/daemon/dbus/gkd-dbus-util.c
index 605d6f6..6f16446 100644
--- a/daemon/dbus/gkd-dbus-util.c
+++ b/daemon/dbus/gkd-dbus-util.c
@@ -49,3 +49,38 @@ gkd_dbus_interface_match (const gchar *interface, const gchar *match)
return strcmp (interface, match) == 0;
}
+
+DBusMessage*
+gkd_dbus_introspect_handle (DBusMessage *message, const gchar *type)
+{
+ GError *error = NULL;
+ DBusMessage *reply;
+ gchar *filename;
+ gchar *data;
+
+ g_return_val_if_fail (message, NULL);
+ g_return_val_if_fail (type, NULL);
+
+ if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect") &&
+ dbus_message_get_args (message, NULL, DBUS_TYPE_INVALID)) {
+
+ filename = g_strconcat (INTROSPECTDIR, G_DIR_SEPARATOR_S, "introspect-", type, ".xml", NULL);
+ g_file_get_contents (filename, &data, NULL, &error);
+ g_free (filename);
+
+ if (error != NULL) {
+ g_warning ("couldn't load introspect data file: %s: %s",
+ filename, error->message ? error->message : "");
+ g_clear_error (&error);
+ return NULL;
+ }
+
+ reply = dbus_message_new_method_return (message);
+ if (!dbus_message_append_args (reply, DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID))
+ g_return_val_if_reached (NULL);
+ g_free (data);
+ return reply;
+ }
+
+ return NULL;
+}
diff --git a/daemon/dbus/gkd-dbus-util.h b/daemon/dbus/gkd-dbus-util.h
index e7305a8..0bc0702 100644
--- a/daemon/dbus/gkd-dbus-util.h
+++ b/daemon/dbus/gkd-dbus-util.h
@@ -28,10 +28,12 @@
#include <glib-object.h>
#include <dbus/dbus.h>
-#define GKD_DBUS_TYPE_CONNECTION (gkd_dbus_connection_get_boxed_type ())
+#define GKD_DBUS_TYPE_CONNECTION (gkd_dbus_connection_get_boxed_type ())
-GType gkd_dbus_connection_get_boxed_type (void) G_GNUC_CONST;
+GType gkd_dbus_connection_get_boxed_type (void) G_GNUC_CONST;
-gboolean gkd_dbus_interface_match (const gchar *interface, const gchar *match);
+gboolean gkd_dbus_interface_match (const gchar *interface, const gchar *match);
+
+DBusMessage* gkd_dbus_introspect_handle (DBusMessage *message, const gchar *type);
#endif /* GKD_DBUS_H */
diff --git a/daemon/dbus/gkd-secrets-objects.c b/daemon/dbus/gkd-secrets-objects.c
index f570491..b939ab8 100644
--- a/daemon/dbus/gkd-secrets-objects.c
+++ b/daemon/dbus/gkd-secrets-objects.c
@@ -582,6 +582,9 @@ item_message_handler (GkdSecretsObjects *self, GP11Object *object, DBusMessage *
else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "GetAll"))
return item_property_getall (object, message);
+ else if (dbus_message_has_interface (message, DBUS_INTERFACE_INTROSPECTABLE))
+ return gkd_dbus_introspect_handle (message, "item");
+
return NULL;
}
@@ -741,6 +744,9 @@ collection_message_handler (GkdSecretsObjects *self, GP11Object *object, DBusMes
else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "GetAll"))
return collection_property_getall (self, object, message);
+ else if (dbus_message_has_interface (message, DBUS_INTERFACE_INTROSPECTABLE))
+ return gkd_dbus_introspect_handle (message, "collection");
+
return NULL;
}
diff --git a/daemon/dbus/gkd-secrets-service.c b/daemon/dbus/gkd-secrets-service.c
index 1b6d780..d25c73e 100644
--- a/daemon/dbus/gkd-secrets-service.c
+++ b/daemon/dbus/gkd-secrets-service.c
@@ -408,6 +408,9 @@ service_message_handler (GkdSecretsService *self, DBusMessage *message)
else if (dbus_message_is_method_call (message, PROPERTIES_INTERFACE, "GetAll"))
return service_property_getall (self, message);
+ else if (dbus_message_has_interface (message, DBUS_INTERFACE_INTROSPECTABLE))
+ return gkd_dbus_introspect_handle (message, "service");
+
return reply;
}
@@ -455,9 +458,8 @@ service_dispatch_message (GkdSecretsService *self, DBusMessage *message)
} else if (object_path_has_prefix (path, SECRETS_COLLECTION_PREFIX)) {
reply = gkd_secrets_objects_dispatch (self->objects, message);
+ /* Addressed to the service */
} else if (g_str_equal (path, SECRETS_SERVICE_PATH)) {
-
- /* Check if it's properties, and hand off to property handler. */
reply = service_message_handler (self, message);
}
@@ -519,7 +521,8 @@ gkd_secrets_service_filter_handler (DBusConnection *conn, DBusMessage *message,
interface = dbus_message_get_interface (message);
if (interface == NULL ||
g_str_has_prefix (interface, SECRETS_INTERFACE_PREFIX) ||
- g_str_equal (interface, DBUS_INTERFACE_PROPERTIES)) {
+ g_str_equal (interface, DBUS_INTERFACE_PROPERTIES) ||
+ g_str_equal (interface, DBUS_INTERFACE_INTROSPECTABLE)) {
service_dispatch_message (self, message);
return DBUS_HANDLER_RESULT_HANDLED;
}
diff --git a/daemon/dbus/gkd-secrets-session.c b/daemon/dbus/gkd-secrets-session.c
index af02216..4729a73 100644
--- a/daemon/dbus/gkd-secrets-session.c
+++ b/daemon/dbus/gkd-secrets-session.c
@@ -24,6 +24,7 @@
#include "gkd-secrets-service.h"
#include "gkd-secrets-session.h"
#include "gkd-secrets-types.h"
+#include "gkd-dbus-util.h"
#include <string.h>
@@ -281,6 +282,9 @@ gkd_secrets_session_dispatch (GkdSecretsSession *self, DBusMessage *message)
else if (dbus_message_is_method_call (message, SECRETS_SERVICE_INTERFACE, "GetSecret"))
g_return_val_if_reached (NULL); /* TODO: Need to implement */
+ else if (dbus_message_has_interface (message, DBUS_INTERFACE_INTROSPECTABLE))
+ return gkd_dbus_introspect_handle (message, "session");
+
return reply;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]