[gnome-keyring] Use an interface to dispatch dbus messages to objects.
- From: Stefan Walter <stefw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-keyring] Use an interface to dispatch dbus messages to objects.
- Date: Tue, 8 Jun 2010 16:01:17 +0000 (UTC)
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]