[liboobs] Allow commit functions to return an updated struct as reply



commit 6a952f578f2e48599329e0fe439ca422afbcb853
Author: Milan Bouchet-Valat <nalimilan club fr>
Date:   Mon Jan 11 13:45:44 2010 +0100

    Allow commit functions to return an updated struct as reply
    
    The backends now return the object after it has been committed so that we can udpate the fields that were left empty to get default values. This is used by OobsUser when an user is created, from the update() method.

 oobs/oobs-object.c      |   20 ++++++++++-
 oobs/oobs-object.h      |    1 +
 oobs/oobs-user.c        |   86 ++++++++++++++++++++++++++++++++++++++++++++++-
 oobs/oobs-usersconfig.c |   86 ++++++----------------------------------------
 4 files changed, 117 insertions(+), 76 deletions(-)
---
diff --git a/oobs/oobs-object.c b/oobs/oobs-object.c
index 9f3cc23..f3bd73b 100644
--- a/oobs/oobs-object.c
+++ b/oobs/oobs-object.c
@@ -593,7 +593,10 @@ get_update_message (OobsObject *object)
 static OobsResult
 do_commit (_OobsObjectCommitMethod method, OobsObject *object)
 {
+  OobsObjectPrivate *priv;
   DBusMessage *message;
+  DBusMessage *reply;
+  DBusMessageIter iter;
   OobsResult result;
 
   g_return_val_if_fail (OOBS_IS_OBJECT (object), OOBS_RESULT_MALFORMED_DATA);
@@ -603,8 +606,23 @@ do_commit (_OobsObjectCommitMethod method, OobsObject *object)
   if (!message)
     return OOBS_RESULT_MALFORMED_DATA;
 
-  run_message (object, message, &result);
+  reply = run_message (object, message, &result);
   dbus_message_unref (message);
+
+  /* Objects can use this to update themselves when the backend provides it */
+  if (reply)
+    {
+      dbus_message_iter_init (reply, &iter);
+      if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_STRUCT)
+	{
+	  priv = object->_priv;
+
+	  priv->update_requests++;
+	  result = update_object_from_message (object, reply);
+	  dbus_message_unref (reply);
+	}
+    }
+
   g_signal_emit (object, object_signals [COMMITTED], 0);
 
   return result;
diff --git a/oobs/oobs-object.h b/oobs/oobs-object.h
index 73f074f..d4ee1e4 100644
--- a/oobs/oobs-object.h
+++ b/oobs/oobs-object.h
@@ -24,6 +24,7 @@
 G_BEGIN_DECLS
 
 #include <glib-object.h>
+#include <dbus/dbus.h>
 #include "oobs-result.h"
 
 #define OOBS_TYPE_OBJECT         (oobs_object_get_type ())
diff --git a/oobs/oobs-user.c b/oobs/oobs-user.c
index fd15923..ff134e9 100644
--- a/oobs/oobs-user.c
+++ b/oobs/oobs-user.c
@@ -30,6 +30,7 @@
 #include "oobs-object-private.h"
 #include "oobs-usersconfig.h"
 #include "oobs-user.h"
+#include "oobs-user-private.h"
 #include "oobs-group.h"
 #include "oobs-defines.h"
 #include "utils.h"
@@ -86,7 +87,8 @@ static void oobs_user_get_property (GObject      *object,
 				    GValue       *value,
 				    GParamSpec   *pspec);
 
-static void oobs_user_commit (OobsObject *object);
+static void oobs_user_commit    (OobsObject *object);
+static void oobs_user_update    (OobsObject *object);
 
 enum
 {
@@ -122,6 +124,7 @@ oobs_user_class_init (OobsUserClass *class)
   object_class->finalize     = oobs_user_finalize;
 
   oobs_class->commit = oobs_user_commit;
+  oobs_class->update = oobs_user_update;
 
   /* override the singleton check */
   oobs_class->singleton = FALSE;
@@ -448,6 +451,75 @@ oobs_user_finalize (GObject *object)
     (* G_OBJECT_CLASS (oobs_user_parent_class)->finalize) (object);
 }
 
+OobsUser*
+_oobs_user_create_from_dbus_reply (OobsUser        *user,
+                                   gid_t           *gid_ptr,
+                                   DBusMessage     *reply,
+                                   DBusMessageIter  struct_iter)
+{
+  DBusMessageIter iter, gecos_iter;
+  guint32 uid, gid;
+  const gchar *login, *passwd, *home, *shell;
+  const gchar *name, *room_number, *work_phone, *home_phone, *other_data;
+  const gchar *locale;
+  gint passwd_flags, home_flags;
+  gboolean enc_home, passwd_empty, passwd_disabled;
+
+  dbus_message_iter_recurse (&struct_iter, &iter);
+
+  login = utils_get_string (&iter);
+  passwd = utils_get_string (&iter);
+  uid = utils_get_uint (&iter);
+
+  gid = utils_get_uint (&iter);
+  if (gid_ptr)
+    *gid_ptr = gid;
+
+  /* GECOS fields */
+  dbus_message_iter_recurse (&iter, &gecos_iter);
+
+  name = utils_get_string (&gecos_iter);
+  room_number = utils_get_string (&gecos_iter);
+  work_phone = utils_get_string (&gecos_iter);
+  home_phone = utils_get_string (&gecos_iter);
+  other_data = utils_get_string (&gecos_iter);
+  /* end of GECOS fields */
+
+  dbus_message_iter_next (&iter);
+
+  home = utils_get_string (&iter);
+  shell = utils_get_string (&iter);
+
+  passwd_flags = utils_get_int (&iter);
+  passwd_empty = passwd_flags & 1;
+  passwd_disabled = passwd_flags & (1 << 1);
+
+  enc_home = utils_get_boolean (&iter);
+  home_flags = utils_get_int (&iter);
+  locale = utils_get_string (&iter);
+
+  if (!user)
+    user = oobs_user_new (login);
+
+  g_object_set (user,
+                "uid", uid,
+                "home-directory", home,
+                "shell", shell,
+                "full-name", name,
+                "room-number", room_number,
+                "work-phone", work_phone,
+                "home-phone", home_phone,
+                "other-data", other_data,
+                "encrypted-home", enc_home,
+                "home-flags", home_flags,
+                "password-empty", passwd_empty,
+                "password-disabled", passwd_disabled,
+                "locale", locale,
+                NULL);
+
+  return user;
+}
+
 static gboolean
 create_dbus_struct_from_user (OobsUser        *user,
 			      DBusMessage     *message,
@@ -548,6 +620,18 @@ oobs_user_commit (OobsObject *object)
   dbus_message_iter_close_container (&iter, &struct_iter);
 }
 
+static void
+oobs_user_update (OobsObject *object)
+{
+  DBusMessage *reply;
+  DBusMessageIter iter;
+
+  reply = _oobs_object_get_dbus_message (object);
+
+  dbus_message_iter_init (reply, &iter);
+  _oobs_user_create_from_dbus_reply (OOBS_USER (object), NULL, reply, iter);
+}
+
 /**
  * oobs_user_new:
  * @name: login name for the new user.
diff --git a/oobs/oobs-usersconfig.c b/oobs/oobs-usersconfig.c
index 4fe4177..261a5ba 100644
--- a/oobs/oobs-usersconfig.c
+++ b/oobs/oobs-usersconfig.c
@@ -29,6 +29,7 @@
 #include "oobs-list-private.h"
 #include "oobs-usersconfig.h"
 #include "oobs-user.h"
+#include "oobs-user-private.h"
 #include "oobs-defines.h"
 #include "oobs-groupsconfig.h"
 #include "oobs-group.h"
@@ -287,78 +288,6 @@ oobs_users_config_get_property (GObject      *object,
     }
 }
 
-static OobsUser*
-create_user_from_dbus_reply (OobsObject      *object,
-			     DBusMessage     *reply,
-			     DBusMessageIter  struct_iter)
-{
-  OobsUsersConfigPrivate *priv;
-  OobsUser *user;
-  DBusMessageIter iter, gecos_iter;
-  guint32 uid, gid;
-  const gchar *login, *passwd, *home, *shell;
-  const gchar *name, *room_number, *work_phone, *home_phone, *other_data;
-  const gchar *locale;
-  gint passwd_flags, home_flags;
-  gboolean enc_home, passwd_empty, passwd_disabled;
-
-  priv = OOBS_USERS_CONFIG (object)->_priv;
-  dbus_message_iter_recurse (&struct_iter, &iter);
-
-  login = utils_get_string (&iter);
-  passwd = utils_get_string (&iter);
-  uid = utils_get_uint (&iter);
-  gid = utils_get_uint (&iter);
-
-  /* GECOS fields */
-  dbus_message_iter_recurse (&iter, &gecos_iter);
-
-  name = utils_get_string (&gecos_iter);
-  room_number = utils_get_string (&gecos_iter);
-  work_phone = utils_get_string (&gecos_iter);
-  home_phone = utils_get_string (&gecos_iter);
-  other_data = utils_get_string (&gecos_iter);
-  /* end of GECOS fields */
-
-  dbus_message_iter_next (&iter);
-
-  home = utils_get_string (&iter);
-  shell = utils_get_string (&iter);
-
-  passwd_flags = utils_get_int (&iter);
-  passwd_empty = passwd_flags & 1;
-  passwd_disabled = passwd_flags & (1 << 1);
-
-  enc_home = utils_get_boolean (&iter);
-  home_flags = utils_get_int (&iter);
-  locale = utils_get_string (&iter);
-
-  user = oobs_user_new (login);
-  g_object_set (user,
-                "uid", uid,
-                "home-directory", home,
-                "shell", shell,
-                "full-name", name,
-                "room-number", room_number,
-                "work-phone", work_phone,
-                "home-phone", home_phone,
-                "other-data", other_data,
-                "encrypted-home", enc_home,
-                "home-flags", home_flags,
-                "password-empty", passwd_empty,
-                "password-disabled", passwd_disabled,
-                "locale", locale,
-                NULL);
-
-  /* keep the group name in a hashtable, this will be needed
-   * each time the groups configuration changes
-   */
-  g_hash_table_insert (priv->groups,
-		       g_object_ref (user),
-		       (gpointer) gid);
-  return user;
-}
-
 static void
 query_groups_foreach (OobsUser *user,
 		      gid_t     gid,
@@ -404,6 +333,7 @@ oobs_users_config_update (OobsObject *object)
   DBusMessageIter  iter, elem_iter;
   OobsListIter     list_iter;
   GObject         *user;
+  gid_t            gid;
 
   priv  = OOBS_USERS_CONFIG (object)->_priv;
   reply = _oobs_object_get_dbus_message (object);
@@ -416,11 +346,19 @@ oobs_users_config_update (OobsObject *object)
 
   while (dbus_message_iter_get_arg_type (&elem_iter) == DBUS_TYPE_STRUCT)
     {
-      user = G_OBJECT (create_user_from_dbus_reply (object, reply, elem_iter));
+      user = G_OBJECT (_oobs_user_create_from_dbus_reply (NULL, &gid, reply, elem_iter));
 
       oobs_list_append (priv->users_list, &list_iter);
       oobs_list_set    (priv->users_list, &list_iter, G_OBJECT (user));
-      g_object_unref   (user);
+
+      /* keep the group name in a hashtable, this will be needed
+       * each time the groups configuration changes
+       */
+      g_hash_table_insert (priv->groups,
+                           g_object_ref (user),
+                           (gpointer) gid);
+
+      g_object_unref (user);
 
       dbus_message_iter_next (&elem_iter);
     }



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