[gnome-keyring] Use an interface to dispatch dbus messages to objects.



commit 62c002d0d3068a93ef536f49d10fd16ddcb8940c
Author: Stef Walter <stef memberwebs com>
Date:   Sat Jun 5 23:24:59 2010 +0000

    Use an interface to dispatch dbus messages to objects.
    
     * Will allow multiple objects to implement Prompt dbus iface.

 daemon/dbus/Makefile.am                            |    1 +
 .../{gkd-secret-iface.c => gkd-secret-dispatch.c}  |   29 ++++---
 daemon/dbus/gkd-secret-dispatch.h                  |   53 +++++++++++++
 daemon/dbus/gkd-secret-iface.h                     |   45 -----------
 daemon/dbus/gkd-secret-prompt.c                    |   78 +++++++++++--------
 daemon/dbus/gkd-secret-prompt.h                    |    3 -
 daemon/dbus/gkd-secret-service.c                   |    5 +-
 daemon/dbus/gkd-secret-session.c                   |   59 +++++++++------
 daemon/dbus/gkd-secret-session.h                   |    3 -
 daemon/dbus/gkd-secret-types.h                     |    1 +
 10 files changed, 155 insertions(+), 122 deletions(-)
---
diff --git a/daemon/dbus/Makefile.am b/daemon/dbus/Makefile.am
index 3a1a9ee..20ecca8 100644
--- a/daemon/dbus/Makefile.am
+++ b/daemon/dbus/Makefile.am
@@ -19,6 +19,7 @@ libgkd_dbus_la_SOURCES = \
 	gkd-dbus-util.c gkd-dbus-util.h \
 	gkd-secret-change.c gkd-secret-change.h \
 	gkd-secret-create.c gkd-secret-create.h \
+	gkd-secret-dispatch.c gkd-secret-dispatch.h \
 	gkd-secret-error.c gkd-secret-error.h \
 	gkd-secret-lock.c gkd-secret-lock.h \
 	gkd-secret-objects.c gkd-secret-objects.h \
diff --git a/daemon/dbus/gkd-secret-iface.c b/daemon/dbus/gkd-secret-dispatch.c
similarity index 62%
rename from daemon/dbus/gkd-secret-iface.c
rename to daemon/dbus/gkd-secret-dispatch.c
index de52c49..1849a2e 100644
--- a/daemon/dbus/gkd-secret-iface.c
+++ b/daemon/dbus/gkd-secret-dispatch.c
@@ -21,28 +21,25 @@
 
 #include "config.h"
 
-#include "gkm-zzz.h"
+#include "gkd-secret-dispatch.h"
 
 static void
-gkm_zzz_base_init (gpointer gobject_class)
+gkd_secret_dispatch_base_init (gpointer gobject_class)
 {
-	static gboolean initialized = FALSE;
-	if (!initialized) {
-		/* Add properties and signals to the interface */
-
-
-		initialized = TRUE;
+	static volatile gsize initialized = 0;
+	if (g_once_init_enter (&initialized)) {
+		g_once_init_leave (&initialized, 1);
 	}
 }
 
 GType
-gkm_zzz_get_type (void)
+gkd_secret_dispatch_get_type (void)
 {
 	static GType type = 0;
 	if (!type) {
 		static const GTypeInfo info = {
-			sizeof (GkmZzzIFace),
-			gkm_zzz_base_init,               /* base init */
+			sizeof (GkdSecretDispatchIface),
+			gkd_secret_dispatch_base_init,               /* base init */
 			NULL,             /* base finalize */
 			NULL,             /* class_init */
 			NULL,             /* class finalize */
@@ -51,9 +48,17 @@ gkm_zzz_get_type (void)
 			0,                /* n_preallocs */
 			NULL,             /* instance init */
 		};
-		type = g_type_register_static (G_TYPE_INTERFACE, "GkmZzzIFace", &info, 0);
+		type = g_type_register_static (G_TYPE_INTERFACE, "GkdSecretDispatchIFace", &info, 0);
 		g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
 	}
 
 	return type;
 }
+
+DBusMessage*
+gkd_secret_dispatch_message (GkdSecretDispatch *self, DBusMessage *message)
+{
+	g_return_val_if_fail (GKD_SECRET_IS_DISPATCH (self), NULL);
+	g_return_val_if_fail (GKD_SECRET_DISPATCH_GET_INTERFACE (self)->dispatch_message, NULL);
+	return GKD_SECRET_DISPATCH_GET_INTERFACE (self)->dispatch_message (self, message);
+}
diff --git a/daemon/dbus/gkd-secret-dispatch.h b/daemon/dbus/gkd-secret-dispatch.h
new file mode 100644
index 0000000..b850bde
--- /dev/null
+++ b/daemon/dbus/gkd-secret-dispatch.h
@@ -0,0 +1,53 @@
+/*
+ * gnome-keyring
+ *
+ * Copyright (C) 2008 Stefan Walter
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef __GKD_SECRET_DISPATCH_H__
+#define __GKD_SECRET_DISPATCH_H__
+
+#include "gkd-secret-types.h"
+
+#include <dbus/dbus.h>
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GKD_SECRET_TYPE_DISPATCH                 (gkd_secret_dispatch_get_type())
+#define GKD_SECRET_DISPATCH(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GKD_SECRET_TYPE_DISPATCH, GkdSecretDispatch))
+#define GKD_SECRET_IS_DISPATCH(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GKD_SECRET_TYPE_DISPATCH))
+#define GKD_SECRET_DISPATCH_GET_INTERFACE(inst)  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GKD_SECRET_TYPE_DISPATCH, GkdSecretDispatchIface))
+
+typedef struct _GkdSecretDispatchIface GkdSecretDispatchIface;
+
+struct _GkdSecretDispatchIface {
+	GTypeInterface parent;
+
+	DBusMessage* (*dispatch_message) (GkdSecretDispatch *self, DBusMessage *message);
+};
+
+GType                  gkd_secret_dispatch_get_type                          (void) G_GNUC_CONST;
+
+DBusMessage*           gkd_secret_dispatch_message                           (GkdSecretDispatch *self,
+                                                                              DBusMessage *message);
+
+G_END_DECLS
+
+#endif /* __GKD_SECRET_DISPATCH_H__ */
diff --git a/daemon/dbus/gkd-secret-prompt.c b/daemon/dbus/gkd-secret-prompt.c
index 5840afa..433e349 100644
--- a/daemon/dbus/gkd-secret-prompt.c
+++ b/daemon/dbus/gkd-secret-prompt.c
@@ -22,6 +22,7 @@
 #include "config.h"
 
 #include "gkd-dbus-util.h"
+#include "gkd-secret-dispatch.h"
 #include "gkd-secret-service.h"
 #include "gkd-secret-prompt.h"
 #include "gkd-secret-objects.h"
@@ -58,7 +59,9 @@ struct _GkdSecretPromptPrivate {
 	GList *objects;
 };
 
-G_DEFINE_TYPE (GkdSecretPrompt, gkd_secret_prompt, GKU_TYPE_PROMPT);
+static void gkd_secret_dispatch_iface (GkdSecretDispatchIface *iface);
+G_DEFINE_TYPE_WITH_CODE (GkdSecretPrompt, gkd_secret_prompt, GKU_TYPE_PROMPT,
+                         G_IMPLEMENT_INTERFACE (GKD_SECRET_TYPE_DISPATCH, gkd_secret_dispatch_iface));
 
 static guint unique_prompt_number = 0;
 
@@ -243,19 +246,50 @@ gkd_secret_prompt_responded (GkuPrompt *base)
 }
 
 static void
-gkd_secret_prompt_ready (GkdSecretPrompt *self)
+gkd_secret_prompt_real_ready (GkdSecretPrompt *self)
 {
 	/* Default implementation, unused */
 	g_return_if_reached ();
 }
 
 static void
-gkd_secret_prompt_encode_result (GkdSecretPrompt *self, DBusMessageIter *iter)
+gkd_secret_prompt_real_encode_result (GkdSecretPrompt *self, DBusMessageIter *iter)
 {
 	/* Default implementation, unused */
 	g_return_if_reached ();
 }
 
+static DBusMessage*
+gkd_secret_prompt_real_dispatch_message (GkdSecretDispatch *base, DBusMessage *message)
+{
+	DBusMessage *reply = NULL;
+	GkdSecretPrompt *self;
+	const gchar *caller;
+
+	g_return_val_if_fail (message, NULL);
+	g_return_val_if_fail (GKD_SECRET_IS_PROMPT (base), NULL);
+	self = GKD_SECRET_PROMPT (base);
+
+	/* This should already have been caught elsewhere */
+	caller = dbus_message_get_sender (message);
+	if (!caller || !g_str_equal (caller, self->pv->caller))
+		g_return_val_if_reached (NULL);
+
+	/* org.freedesktop.Secrets.Prompt.Prompt() */
+	else if (dbus_message_is_method_call (message, SECRET_PROMPT_INTERFACE, "Prompt"))
+		reply = prompt_method_prompt (self, message);
+
+	/* org.freedesktop.Secrets.Prompt.Negotiate() */
+	else if (dbus_message_is_method_call (message, SECRET_PROMPT_INTERFACE, "Dismiss"))
+		reply = prompt_method_dismiss (self, message);
+
+	else if (dbus_message_has_interface (message, DBUS_INTERFACE_INTROSPECTABLE))
+		return gkd_dbus_introspect_handle (message, "prompt");
+
+	return reply;
+}
+
+
 static GObject*
 gkd_secret_prompt_constructor (GType type, guint n_props, GObjectConstructParam *props)
 {
@@ -373,8 +407,8 @@ gkd_secret_prompt_class_init (GkdSecretPromptClass *klass)
 
 	prompt_class->responded = gkd_secret_prompt_responded;
 
-	klass->encode_result = gkd_secret_prompt_encode_result;
-	klass->prompt_ready = gkd_secret_prompt_ready;
+	klass->encode_result = gkd_secret_prompt_real_encode_result;
+	klass->prompt_ready = gkd_secret_prompt_real_ready;
 
 	g_type_class_add_private (klass, sizeof (GkdSecretPromptPrivate));
 
@@ -391,38 +425,16 @@ gkd_secret_prompt_class_init (GkdSecretPromptClass *klass)
 		                     GKD_SECRET_TYPE_SERVICE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 }
 
+static void
+gkd_secret_dispatch_iface (GkdSecretDispatchIface *iface)
+{
+	iface->dispatch_message = gkd_secret_prompt_real_dispatch_message;
+}
+
 /* -----------------------------------------------------------------------------
  * PUBLIC
  */
 
-DBusMessage*
-gkd_secret_prompt_dispatch (GkdSecretPrompt *self, DBusMessage *message)
-{
-	DBusMessage *reply = NULL;
-	const gchar *caller;
-
-	g_return_val_if_fail (message, NULL);
-	g_return_val_if_fail (GKD_SECRET_IS_PROMPT (self), NULL);
-
-	/* This should already have been caught elsewhere */
-	caller = dbus_message_get_sender (message);
-	if (!caller || !g_str_equal (caller, self->pv->caller))
-		g_return_val_if_reached (NULL);
-
-	/* org.freedesktop.Secrets.Prompt.Prompt() */
-	else if (dbus_message_is_method_call (message, SECRET_PROMPT_INTERFACE, "Prompt"))
-		reply = prompt_method_prompt (self, message);
-
-	/* org.freedesktop.Secrets.Prompt.Negotiate() */
-	else if (dbus_message_is_method_call (message, SECRET_PROMPT_INTERFACE, "Dismiss"))
-		reply = prompt_method_dismiss (self, message);
-
-	else if (dbus_message_has_interface (message, DBUS_INTERFACE_INTROSPECTABLE))
-		return gkd_dbus_introspect_handle (message, "prompt");
-
-	return reply;
-}
-
 const gchar*
 gkd_secret_prompt_get_caller (GkdSecretPrompt *self)
 {
diff --git a/daemon/dbus/gkd-secret-prompt.h b/daemon/dbus/gkd-secret-prompt.h
index 54313f0..c0a6112 100644
--- a/daemon/dbus/gkd-secret-prompt.h
+++ b/daemon/dbus/gkd-secret-prompt.h
@@ -57,9 +57,6 @@ struct _GkdSecretPromptClass {
 
 GType               gkd_secret_prompt_get_type                (void);
 
-DBusMessage*        gkd_secret_prompt_dispatch                (GkdSecretPrompt *self,
-                                                               DBusMessage *message);
-
 const gchar*        gkd_secret_prompt_get_caller              (GkdSecretPrompt *self);
 
 const gchar*        gkd_secret_prompt_get_object_path         (GkdSecretPrompt *self);
diff --git a/daemon/dbus/gkd-secret-service.c b/daemon/dbus/gkd-secret-service.c
index 8d51f3a..1f27271 100644
--- a/daemon/dbus/gkd-secret-service.c
+++ b/daemon/dbus/gkd-secret-service.c
@@ -24,6 +24,7 @@
 #include "gkd-dbus-util.h"
 #include "gkd-secret-change.h"
 #include "gkd-secret-create.h"
+#include "gkd-secret-dispatch.h"
 #include "gkd-secret-error.h"
 #include "gkd-secret-lock.h"
 #include "gkd-secret-objects.h"
@@ -911,7 +912,7 @@ service_dispatch_message (GkdSecretService *self, DBusMessage *message)
 		if (object == NULL)
 			reply = gkd_secret_error_no_such_object (message);
 		else
-			reply = gkd_secret_session_dispatch (object, message);
+			reply = gkd_secret_dispatch_message (GKD_SECRET_DISPATCH (object), message);
 
 	/* Dispatched to a prompt, find a prompt in this client */
 	} else if (object_path_has_prefix (path, SECRET_PROMPT_PREFIX)) {
@@ -919,7 +920,7 @@ service_dispatch_message (GkdSecretService *self, DBusMessage *message)
 		if (object == NULL)
 			reply = gkd_secret_error_no_such_object (message);
 		else
-			reply = gkd_secret_prompt_dispatch (object, message);
+			reply = gkd_secret_dispatch_message (GKD_SECRET_DISPATCH (object), message);
 
 	/* Dispatched to a collection, off it goes */
 	} else if (object_path_has_prefix (path, SECRET_COLLECTION_PREFIX) ||
diff --git a/daemon/dbus/gkd-secret-session.c b/daemon/dbus/gkd-secret-session.c
index 73551df..32eed56 100644
--- a/daemon/dbus/gkd-secret-session.c
+++ b/daemon/dbus/gkd-secret-session.c
@@ -21,6 +21,7 @@
 
 #include "config.h"
 
+#include "gkd-secret-dispatch.h"
 #include "gkd-secret-secret.h"
 #include "gkd-secret-service.h"
 #include "gkd-secret-session.h"
@@ -60,7 +61,9 @@ struct _GkdSecretSession {
 	CK_MECHANISM_TYPE mech_type;
 };
 
-G_DEFINE_TYPE (GkdSecretSession, gkd_secret_session, G_TYPE_OBJECT);
+static void gkd_secret_dispatch_iface (GkdSecretDispatchIface *iface);
+G_DEFINE_TYPE_WITH_CODE (GkdSecretSession, gkd_secret_session, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (GKD_SECRET_TYPE_DISPATCH, gkd_secret_dispatch_iface));
 
 static guint unique_session_number = 0;
 
@@ -264,6 +267,31 @@ session_method_close (GkdSecretSession *self, DBusMessage *message)
  * OBJECT
  */
 
+static DBusMessage*
+gkd_secret_session_real_dispatch_message (GkdSecretDispatch *base, DBusMessage *message)
+{
+	const gchar *caller;
+	GkdSecretSession *self;
+
+	g_return_val_if_fail (message, NULL);
+	g_return_val_if_fail (GKD_SECRET_IS_SESSION (base), NULL);
+	self = GKD_SECRET_SESSION (base);
+
+	/* This should already have been caught elsewhere */
+	caller = dbus_message_get_sender (message);
+	if (!caller || !g_str_equal (caller, self->caller))
+		g_return_val_if_reached (NULL);
+
+	/* org.freedesktop.Secrets.Session.Close() */
+	else if (dbus_message_is_method_call (message, SECRET_SESSION_INTERFACE, "Close"))
+		return session_method_close (self, message);
+
+	else if (dbus_message_has_interface (message, DBUS_INTERFACE_INTROSPECTABLE))
+		return gkd_dbus_introspect_handle (message, "session");
+
+	return NULL;
+}
+
 static GObject*
 gkd_secret_session_constructor (GType type, guint n_props, GObjectConstructParam *props)
 {
@@ -406,6 +434,12 @@ gkd_secret_session_class_init (GkdSecretSessionClass *klass)
 		                     GKD_SECRET_TYPE_SERVICE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 }
 
+static void
+gkd_secret_dispatch_iface (GkdSecretDispatchIface *iface)
+{
+	iface->dispatch_message = gkd_secret_session_real_dispatch_message;
+}
+
 /* -----------------------------------------------------------------------------
  * PUBLIC
  */
@@ -473,29 +507,6 @@ gkd_secret_session_complete (GkdSecretSession *self, gconstpointer peer,
 }
 
 DBusMessage*
-gkd_secret_session_dispatch (GkdSecretSession *self, DBusMessage *message)
-{
-	const gchar *caller;
-
-	g_return_val_if_fail (message, NULL);
-	g_return_val_if_fail (GKD_SECRET_IS_SESSION (self), NULL);
-
-	/* This should already have been caught elsewhere */
-	caller = dbus_message_get_sender (message);
-	if (!caller || !g_str_equal (caller, self->caller))
-		g_return_val_if_reached (NULL);
-
-	/* org.freedesktop.Secrets.Session.Close() */
-	else if (dbus_message_is_method_call (message, SECRET_SESSION_INTERFACE, "Close"))
-		return session_method_close (self, message);
-
-	else if (dbus_message_has_interface (message, DBUS_INTERFACE_INTROSPECTABLE))
-		return gkd_dbus_introspect_handle (message, "session");
-
-	return NULL;
-}
-
-DBusMessage*
 gkd_secret_session_handle_open (GkdSecretSession *self, DBusMessage *message)
 {
 	DBusMessage *reply;
diff --git a/daemon/dbus/gkd-secret-session.h b/daemon/dbus/gkd-secret-session.h
index 84f2d9d..c5e35a4 100644
--- a/daemon/dbus/gkd-secret-session.h
+++ b/daemon/dbus/gkd-secret-session.h
@@ -52,9 +52,6 @@ gboolean            gkd_secret_session_complete                (GkdSecretSession
                                                                 gconstpointer peer,
                                                                 gsize n_peer);
 
-DBusMessage*        gkd_secret_session_dispatch                (GkdSecretSession *self,
-                                                                DBusMessage *message);
-
 const gchar*        gkd_secret_session_get_caller              (GkdSecretSession *self);
 
 const gchar*        gkd_secret_session_get_caller_executable   (GkdSecretSession *self);
diff --git a/daemon/dbus/gkd-secret-types.h b/daemon/dbus/gkd-secret-types.h
index 8c48aed..3b6aed1 100644
--- a/daemon/dbus/gkd-secret-types.h
+++ b/daemon/dbus/gkd-secret-types.h
@@ -49,6 +49,7 @@
 typedef struct _GkdSecretCollection GkdSecretCollection;
 typedef struct _GkdSecretChange GkdSecretChange;
 typedef struct _GkdSecretCreate GkdSecretCreate;
+typedef struct _GkdSecretDispatch GkdSecretDispatch;
 typedef struct _GkdSecretIndex GkdSecretIndex;
 typedef struct _GkdSecretItem GkdSecretItem;
 typedef struct _GkdSecretObjects GkdSecretObjects;



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