[liboobs] Custom D-Bus messages for OobsUser, OobsSelfConfig and OobsGroup updates
- From: Milan Bouchet-Valat <milanbv src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [liboobs] Custom D-Bus messages for OobsUser, OobsSelfConfig and OobsGroup updates
- Date: Fri, 22 Jan 2010 09:55:35 +0000 (UTC)
commit 8417f913fba3771237d7d8d8ac5d63905693c38b
Author: Milan Bouchet-Valat <nalimilan club fr>
Date: Sun Jan 17 21:43:12 2010 +0100
Custom D-Bus messages for OobsUser, OobsSelfConfig and OobsGroup updates
These objects need to send data to the backends in order to get updated (login, UID and group name). Add a new get_update_message() method to OobsObjectClass, which they use to set the message. This fixes sending wrong messages to the backends, which now return an error.
oobs/oobs-group-private.h | 7 ++++
oobs/oobs-group.c | 68 ++++++++++++++++++++++++++++++++++++++++++++-
oobs/oobs-groupsconfig.c | 51 ++++++++-------------------------
oobs/oobs-object.c | 15 +++++++++-
oobs/oobs-object.h | 5 ++-
oobs/oobs-selfconfig.c | 33 +++++++++++++++------
oobs/oobs-user.c | 24 ++++++++++++++-
7 files changed, 148 insertions(+), 55 deletions(-)
---
diff --git a/oobs/oobs-group-private.h b/oobs/oobs-group-private.h
index 92f63b6..8e0a05f 100644
--- a/oobs/oobs-group-private.h
+++ b/oobs/oobs-group-private.h
@@ -27,6 +27,13 @@ G_BEGIN_DECLS
#include "oobs-group.h"
+
+OobsGroup*
+_oobs_group_create_from_dbus_reply (OobsObject *object,
+ GList **users_ptr,
+ DBusMessage *reply,
+ DBusMessageIter struct_iter);
+
void
_oobs_create_dbus_struct_from_group (OobsGroup *group,
DBusMessage *message,
diff --git a/oobs/oobs-group.c b/oobs/oobs-group.c
index 2a4d6c4..bb29b98 100644
--- a/oobs/oobs-group.c
+++ b/oobs/oobs-group.c
@@ -69,7 +69,9 @@ static void oobs_group_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
-static void oobs_group_commit (OobsObject *object);
+static void oobs_group_commit (OobsObject *object);
+static void oobs_group_update (OobsObject *object);
+static void oobs_group_get_update_message (OobsObject *object);
static GList* get_users_list (OobsGroup *group);
@@ -93,6 +95,8 @@ oobs_group_class_init (OobsGroupClass *class)
object_class->finalize = oobs_group_finalize;
oobs_class->commit = oobs_group_commit;
+ oobs_class->update = oobs_group_update;
+ oobs_class->get_update_message = oobs_group_get_update_message;
/* override the singleton check */
oobs_class->singleton = FALSE;
@@ -241,6 +245,38 @@ get_users_list (OobsGroup *group)
return usernames;
}
+OobsGroup*
+_oobs_group_create_from_dbus_reply (OobsObject *object,
+ GList **users_ptr,
+ DBusMessage *reply,
+ DBusMessageIter struct_iter)
+{
+ DBusMessageIter iter;
+ guint32 gid;
+ const gchar *groupname, *passwd;
+ GList *users;
+ OobsGroup *group;
+
+ dbus_message_iter_recurse (&struct_iter, &iter);
+
+ groupname = utils_get_string (&iter);
+ passwd = utils_get_string (&iter);
+ gid = utils_get_uint (&iter);
+
+ users = utils_get_string_list_from_dbus_reply (reply, &iter);
+
+ if (users_ptr)
+ *users_ptr = users;
+
+ group = oobs_group_new (groupname);
+ g_object_set (G_OBJECT (group),
+ "password", passwd,
+ "gid", gid,
+ NULL);
+
+ return OOBS_GROUP (group);
+}
+
void
_oobs_create_dbus_struct_from_group (OobsGroup *group,
DBusMessage *message,
@@ -285,6 +321,36 @@ oobs_group_commit (OobsObject *object)
_oobs_create_dbus_struct_from_group (OOBS_GROUP (object), message, &iter);
}
+/*
+ * We need a custom update message containing the group name.
+ */
+static void
+oobs_group_get_update_message (OobsObject *object)
+{
+ OobsGroupPrivate *priv;
+ DBusMessageIter iter;
+ DBusMessage *message;
+
+ priv = OOBS_GROUP (object)->_priv;
+
+ message = _oobs_object_get_dbus_message (object);
+ dbus_message_iter_init_append (message, &iter);
+
+ utils_append_string (&iter, priv->groupname);
+}
+
+static void
+oobs_group_update (OobsObject *object)
+{
+ DBusMessage *reply;
+ DBusMessageIter iter;
+
+ reply = _oobs_object_get_dbus_message (object);
+
+ dbus_message_iter_init (reply, &iter);
+ _oobs_group_create_from_dbus_reply (object, NULL, reply, iter);
+}
+
/**
* oobs_group_new:
* @name: group name.
diff --git a/oobs/oobs-groupsconfig.c b/oobs/oobs-groupsconfig.c
index 3fc61de..f8be200 100644
--- a/oobs/oobs-groupsconfig.c
+++ b/oobs/oobs-groupsconfig.c
@@ -215,44 +215,6 @@ oobs_groups_config_get_property (GObject *object,
}
}
-static OobsGroup*
-create_group_from_dbus_reply (OobsObject *object,
- DBusMessage *reply,
- DBusMessageIter struct_iter)
-{
- OobsGroupsConfigPrivate *priv;
- DBusMessageIter iter;
- guint32 gid;
- const gchar *groupname, *passwd;
- GList *users;
- OobsGroup *group;
-
- priv = OOBS_GROUPS_CONFIG (object)->_priv;
- dbus_message_iter_recurse (&struct_iter, &iter);
-
- groupname = utils_get_string (&iter);
- passwd = utils_get_string (&iter);
- gid = utils_get_uint (&iter);
-
- users = utils_get_string_list_from_dbus_reply (reply, &iter);
-
- group = oobs_group_new (groupname);
- g_object_set (G_OBJECT (group),
- "password", passwd,
- "gid", gid,
- NULL);
-
- /* put the users list in the hashtable, will be used each time
- * the users config has changed, in order to get references to
- * the new user objects
- */
- g_hash_table_insert (priv->users,
- g_object_ref (group),
- users);
-
- return OOBS_GROUP (group);
-}
-
static void
query_users_foreach (OobsGroup *group,
GList *users,
@@ -296,6 +258,7 @@ oobs_groups_config_update (OobsObject *object)
DBusMessageIter iter, elem_iter;
OobsListIter list_iter;
GObject *group;
+ GList *users;
priv = OOBS_GROUPS_CONFIG (object)->_priv;
reply = _oobs_object_get_dbus_message (object);
@@ -309,12 +272,22 @@ oobs_groups_config_update (OobsObject *object)
while (dbus_message_iter_get_arg_type (&elem_iter) == DBUS_TYPE_STRUCT)
{
- group = G_OBJECT (create_group_from_dbus_reply (object, reply, elem_iter));
+ group = G_OBJECT (_oobs_group_create_from_dbus_reply (object, &users, reply, elem_iter));
oobs_list_append (priv->groups_list, &list_iter);
oobs_list_set (priv->groups_list, &list_iter, G_OBJECT (group));
+
+ /* put the users list in the hashtable, will be used each time
+ * the users config has changed, in order to get references to
+ * the new user objects
+ */
+ g_hash_table_insert (priv->users,
+ g_object_ref (group),
+ users);
+
g_object_unref (group);
+
dbus_message_iter_next (&elem_iter);
}
diff --git a/oobs/oobs-object.c b/oobs/oobs-object.c
index 2ccb00c..2145fa7 100644
--- a/oobs/oobs-object.c
+++ b/oobs/oobs-object.c
@@ -565,8 +565,11 @@ static DBusMessage*
get_update_message (OobsObject *object)
{
OobsObjectPrivate *priv;
+ OobsObjectClass *class;
+ DBusMessage *message;
priv = object->_priv;
+ class = OOBS_OBJECT_GET_CLASS (object);
if (!priv->session)
{
@@ -575,7 +578,17 @@ get_update_message (OobsObject *object)
return NULL;
}
- return dbus_message_new_method_call (OOBS_DBUS_DESTINATION, priv->path, priv->method, "get");
+ message = dbus_message_new_method_call (OOBS_DBUS_DESTINATION, priv->path, priv->method, "get");
+
+ /* Some objects use custom messages where they need to append arguments */
+ if (class->get_update_message)
+ {
+ _oobs_object_set_dbus_message (object, message);
+ class->get_update_message (object);
+ return g_object_steal_qdata (G_OBJECT (object), dbus_connection_quark);
+ }
+ else
+ return message;
}
/*
diff --git a/oobs/oobs-object.h b/oobs/oobs-object.h
index 8f595af..8ec2359 100644
--- a/oobs/oobs-object.h
+++ b/oobs/oobs-object.h
@@ -50,8 +50,9 @@ struct _OobsObjectClass
GObjectClass parent_class;
/* virtual methods */
- void (*commit) (OobsObject *object);
- void (*update) (OobsObject *object);
+ void (*commit) (OobsObject *object);
+ void (*get_update_message) (OobsObject *object);
+ void (*update) (OobsObject *object);
/* signals */
void (*updated) (OobsObject *object);
diff --git a/oobs/oobs-selfconfig.c b/oobs/oobs-selfconfig.c
index 2b70620..9b4754c 100644
--- a/oobs/oobs-selfconfig.c
+++ b/oobs/oobs-selfconfig.c
@@ -52,8 +52,9 @@ static void oobs_self_config_init (OobsSelfConfig *config);
static void oobs_self_config_constructed (GObject *object);
static void oobs_self_config_finalize (GObject *object);
-static void oobs_self_config_update (OobsObject *object);
-static void oobs_self_config_commit (OobsObject *object);
+static void oobs_self_config_update (OobsObject *object);
+static void oobs_self_config_commit (OobsObject *object);
+static void oobs_self_config_get_update_message (OobsObject *object);
G_DEFINE_TYPE (OobsSelfConfig, oobs_self_config, OOBS_TYPE_OBJECT);
@@ -70,6 +71,7 @@ oobs_self_config_class_init (OobsSelfConfigClass *class)
oobs_object_class->commit = oobs_self_config_commit;
oobs_object_class->update = oobs_self_config_update;
+ oobs_object_class->get_update_message = oobs_self_config_get_update_message;
g_type_class_add_private (object_class,
sizeof (OobsSelfConfigPrivate));
@@ -144,16 +146,9 @@ oobs_self_config_finalize (GObject *object)
static void
oobs_self_config_update (OobsObject *object)
{
- OobsSelfConfigPrivate *priv;
OobsObject *users_config;
- DBusMessage *message;
- DBusMessageIter iter;
-
- priv = OOBS_SELF_CONFIG (object)->_priv;
- message = _oobs_object_get_dbus_message (object);
- dbus_message_iter_init (message, &iter);
- priv->uid = utils_get_uint (&iter);
+ /* We don't actually need to update, since we joint point to an OobsUser */
users_config = oobs_users_config_get ();
@@ -201,6 +196,24 @@ oobs_self_config_commit (OobsObject *object)
utils_append_string (&iter, "");
}
+/*
+ * We need a custom update message containing the user's UID.
+ */
+static void
+oobs_self_config_get_update_message (OobsObject *object)
+{
+ OobsSelfConfigPrivate *priv;
+ DBusMessageIter iter;
+ DBusMessage *message;
+
+ priv = OOBS_SELF_CONFIG (object)->_priv;
+
+ message = _oobs_object_get_dbus_message (object);
+ dbus_message_iter_init_append (message, &iter);
+
+ utils_append_uint (&iter, priv->uid);
+}
+
/**
* oobs_self_config_get:
*
diff --git a/oobs/oobs-user.c b/oobs/oobs-user.c
index ff134e9..4d632b7 100644
--- a/oobs/oobs-user.c
+++ b/oobs/oobs-user.c
@@ -87,8 +87,9 @@ static void oobs_user_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
-static void oobs_user_commit (OobsObject *object);
-static void oobs_user_update (OobsObject *object);
+static void oobs_user_commit (OobsObject *object);
+static void oobs_user_update (OobsObject *object);
+static void oobs_user_get_update_message (OobsObject *object);
enum
{
@@ -125,6 +126,7 @@ oobs_user_class_init (OobsUserClass *class)
oobs_class->commit = oobs_user_commit;
oobs_class->update = oobs_user_update;
+ oobs_class->get_update_message = oobs_user_get_update_message;
/* override the singleton check */
oobs_class->singleton = FALSE;
@@ -620,6 +622,24 @@ oobs_user_commit (OobsObject *object)
dbus_message_iter_close_container (&iter, &struct_iter);
}
+/*
+ * We need a custom update message containing the user's UID.
+ */
+static void
+oobs_user_get_update_message (OobsObject *object)
+{
+ OobsUserPrivate *priv;
+ DBusMessageIter iter;
+ DBusMessage *message;
+
+ priv = OOBS_USER (object)->_priv;
+
+ message = _oobs_object_get_dbus_message (object);
+ dbus_message_iter_init_append (message, &iter);
+
+ utils_append_string (&iter, priv->username);
+}
+
static void
oobs_user_update (OobsObject *object)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]