[gnome-keyring/dbus-api] [dbus] Add introspection to all our dbus objects.



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]