[liboobs] Custom D-Bus messages for OobsUser, OobsSelfConfig and OobsGroup updates



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]