[accounts-dialog/gdbus: 4/5] Continue porting to GDBus



commit 434db36810fdd13b83c0150a0c0a9a9cdb53473a
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Jul 22 20:58:59 2010 -0400

    Continue porting to GDBus

 src/um-login-options.c |    4 +-
 src/um-user-manager.c  |  597 ++++++++++++++++++++++++++----------------------
 src/um-user-manager.h  |   25 +--
 src/um-user-panel.c    |    6 +-
 4 files changed, 336 insertions(+), 296 deletions(-)
---
diff --git a/src/um-login-options.c b/src/um-login-options.c
index 76db545..7a9b636 100644
--- a/src/um-login-options.c
+++ b/src/um-login-options.c
@@ -111,7 +111,7 @@ user_added (UmUserManager *um, UmUser *user, UmLoginOptions *d)
 }
 
 static void
-user_removed (UmUserManager *um, UmUser *user, UmLoginOptions *d)
+user_deleted (UmUserManager *um, UmUser *user, UmLoginOptions *d)
 {
         GtkComboBox *combo;
         GtkTreeModel *model;
@@ -174,7 +174,7 @@ users_loaded (UmUserManager  *manager,
         g_slist_free (list);
 
         g_signal_connect (manager, "user-added", G_CALLBACK (user_added), d);
-        g_signal_connect (manager, "user-removed", G_CALLBACK (user_removed), d);
+        g_signal_connect (manager, "user-deleted", G_CALLBACK (user_deleted), d);
         g_signal_connect (manager, "user-changed", G_CALLBACK (user_changed), d);
 }
 
diff --git a/src/um-user-manager.c b/src/um-user-manager.c
index 1e39018..0493b46 100644
--- a/src/um-user-manager.c
+++ b/src/um-user-manager.c
@@ -44,32 +44,269 @@
 
 #include "um-user-manager.h"
 
+static const gchar introspection_xml[] =
+  "<node>"
+  "  <interface name='org.freedesktop.Accounts'>"
+  "    <method name='ListCachedUsers'>"
+  "      <arg name='users' direction='out' type='ao'/>"
+  "    </method>"
+  "    <method name='FindUserById'>"
+  "      <arg name='id' direction='in' type='x'/>"
+  "      <arg name='user' direction='out' type='o'/>"
+  "    </method>"
+  "    <method name='FindUserByName'>"
+  "      <arg name='name' direction='in' type='s'/>"
+  "      <arg name='user' direction='out' type='o'/>"
+  "    </method>"
+  "    <method name='CreateUser'>"
+  "      <arg name='name' direction='in' type='s'/>"
+  "      <arg name='fullname' direction='in' type='s'/>"
+  "      <arg name='accountType' direction='in' type='i'/>"
+  "      <arg name='user' direction='out' type='o'/>"
+  "    </method>"
+  "    <method name='DeleteUser'>"
+  "      <arg name='id' direction='in' type='x'/>"
+  "      <arg name='removeFiles' direction='in' type='b'/>"
+  "    </method>"
+  "    <signal name='UserAdded'>"
+  "      <arg name='user' type='o'/>"
+  "    </signal>"
+  "    <signal name='UserDeleted'>"
+  "      <arg name='user' type='o'/>"
+  "    </signal>"
+  "    <property name='DaemonVersion' type='s' access='read'/>"
+  "  </interface>"
+  "</node>";
+
+struct _UmUserManager
+{
+        GDBusProxy parent;
+
+        GHashTable *user_by_object_path;
+        GHashTable *user_by_name;
+
+        gboolean no_service;
+};
+
+static GDBusInterfaceInfo *
+um_user_manager_get_interface_info (void)
+{
+        static gsize has_info = 0;
+        static GDBusInterfaceInfo *info = NULL;
+        if (g_once_init_enter (&has_info)) {
+                GDBusNodeInfo *introspection_data;
+                introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
+                info = introspection_data->interfaces[0];
+                g_once_init_leave (&has_info, 1);
+        }
+        return info;
+}
+
+enum {
+        PROP_0,
+        PROP_DAEMON_VERSION
+};
+
 enum {
         USERS_LOADED,
         USER_ADDED,
-        USER_REMOVED,
+        USER_DELETED,
         USER_CHANGED,
         LAST_SIGNAL
 };
 
 static guint signals [LAST_SIGNAL] = { 0, };
 
-static void     um_user_manager_class_init (UmUserManagerClass *klass);
-static void     um_user_manager_init       (UmUserManager      *user_manager);
-static void     um_user_manager_finalize   (GObject            *object);
-
 static gpointer user_manager_object = NULL;
 
-G_DEFINE_TYPE (UmUserManager, um_user_manager, G_TYPE_OBJECT)
+G_DEFINE_TYPE (UmUserManager, um_user_manager, G_TYPE_DBUS_PROXY)
+
+static void add_user_to_dupe_ring (UmUserManager *manager, UmUser *user);
+static void remove_user_from_dupe_ring (UmUserManager *manager, UmUser *user);
+static void clear_dup (gpointer key, gpointer value, gpointer data);
+static void load_users (UmUserManager *manager);
+
+static void
+um_user_manager_finalize (GObject *object)
+{
+        UmUserManager *manager;
+
+        manager = UM_USER_MANAGER (object);
+
+        g_hash_table_foreach (manager->user_by_object_path, clear_dup, NULL);
+        g_hash_table_destroy (manager->user_by_object_path);
+        g_hash_table_destroy (manager->user_by_name);
+
+        G_OBJECT_CLASS (um_user_manager_parent_class)->finalize (object);
+}
+
+static void
+um_user_manager_init (UmUserManager *manager)
+{
+        g_dbus_proxy_set_interface_info (G_DBUS_PROXY (manager),
+                                         um_user_manager_get_interface_info ());
+
+        manager->user_by_object_path = g_hash_table_new_full (g_str_hash,
+                                                              g_str_equal,
+                                                              g_free,
+                                                              g_object_unref);
+
+        manager->user_by_name = g_hash_table_new_full (g_str_hash,
+                                                       g_str_equal,
+                                                       g_free,
+                                                       g_object_unref);
+
+        load_users (manager);
+}
+
+static void
+um_user_manager_get_property (GObject    *object,
+                              guint       prop_id,
+                              GValue     *value,
+                              GParamSpec *pspec)
+{
+        UmUserManager *um = UM_USER_MANAGER (object);
+
+        switch (prop_id) {
+        case PROP_DAEMON_VERSION:
+                g_value_set_string (value, um_user_manager_get_daemon_version (um));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+const gchar *
+um_user_manager_get_daemon_version (UmUserManager *um)
+{
+        GVariant *value;
+        const gchar *ret;
+
+        g_return_val_if_fail (UM_IS_USER_MANAGER (um), NULL);
+
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (um), "DaemonVersion");
+        ret = g_variant_get_string (value, NULL);
+        g_variant_unref (value);
+
+        return ret;
+}
+
+static void
+user_changed_handler (UmUser        *user,
+                      UmUserManager *manager)
+{
+        remove_user_from_dupe_ring (manager, user);
+        add_user_to_dupe_ring (manager, user);
+        g_signal_emit (manager, signals[USER_CHANGED], 0, user);
+}
+
+static void
+user_added_handler (UmUserManager *manager, const gchar *object_path)
+{
+        UmUser *user;
+ 
+        if (g_hash_table_lookup (manager->user_by_object_path, object_path))
+                return;
+
+        user = um_user_new_from_object_path (object_path);
+        if (!user)
+                return;
+
+        add_user_to_dupe_ring (manager, user);
+
+        g_signal_connect (user, "changed",
+                          G_CALLBACK (user_changed_handler), manager);
+
+        g_hash_table_insert (manager->user_by_object_path,
+                             g_strdup (object_path),
+                             g_object_ref (user));
+        g_hash_table_insert (manager->user_by_name,
+                             g_strdup (um_user_get_user_name (user)),
+                             g_object_ref (user));
+
+        g_signal_emit (manager, signals[USER_ADDED], 0, user);
+
+        g_object_unref (user);
+}
+
+static void
+user_deleted_handler (UmUserManager *manager, const gchar *object_path)
+{
+        UmUser *user;
+
+        user = g_hash_table_lookup (manager->user_by_object_path, object_path);
+        g_object_ref (user);
+        g_signal_handlers_disconnect_by_func (user, user_changed_handler, manager);
+
+        remove_user_from_dupe_ring (manager, user);
+
+        g_hash_table_remove (manager->user_by_object_path, object_path);
+        g_hash_table_remove (manager->user_by_name, um_user_get_user_name (user));
+
+        g_signal_emit (manager, signals[USER_DELETED], 0, user);
+
+        g_object_unref (user);
+}
+
+static void
+um_user_manager_g_signal (GDBusProxy  *proxy,
+                          const gchar *sender_name,
+                          const gchar *signal_name,
+                          GVariant    *parameters)
+{
+        UmUserManager *um = UM_USER_MANAGER (proxy);
+        const gchar *object_path;
+
+        if (g_strcmp0 (signal_name, "UserAdded") == 0) {
+                object_path = g_variant_get_string (parameters, NULL);
+                user_added_handler (um, object_path);
+        }
+        else if (g_strcmp0 (signal_name, "UserDeleted") == 0) {
+                object_path = g_variant_get_string (parameters, NULL);
+                user_deleted_handler (um, object_path);
+        }
+}
+
+static void
+um_user_manager_g_properties_changed (GDBusProxy         *proxy,
+                                      GVariant           *changed_properties,
+                                      const gchar* const *invalidated_properties)
+{
+        UmUserManager *um = UM_USER_MANAGER (proxy);
+        GVariantIter *iter;
+        const gchar *key;
+
+        if (changed_properties != NULL) {
+                g_variant_get (changed_properties, "a{sv}", &iter);
+                while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+                        if (g_strcmp0 (key, "DaemonVersion") == 0)
+                                g_object_notify (G_OBJECT (um), "daemon-version");
+                }
+                g_variant_iter_free (iter);
+        }
+}
 
 static void
 um_user_manager_class_init (UmUserManagerClass *klass)
 {
-        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
+        GObjectClass *object_class;
+        GDBusProxyClass *proxy_class;
 
+        object_class = G_OBJECT_CLASS (klass);
+        object_class->get_property = um_user_manager_get_property;
         object_class->finalize = um_user_manager_finalize;
 
-       signals [USERS_LOADED] =
+        proxy_class = G_DBUS_PROXY_CLASS (klass);
+        proxy_class->g_signal = um_user_manager_g_signal;
+        proxy_class->g_properties_changed = um_user_manager_g_properties_changed;
+
+        g_object_class_install_property (object_class, PROP_DAEMON_VERSION,
+                g_param_spec_string ("daemon-version", "Daemon version", "Daemon version",
+                                     NULL, G_PARAM_READABLE));
+
+        signals [USERS_LOADED] =
                 g_signal_new ("users-loaded",
                               G_TYPE_FROM_CLASS (klass),
                               G_SIGNAL_RUN_LAST,
@@ -86,14 +323,16 @@ um_user_manager_class_init (UmUserManagerClass *klass)
                               NULL, NULL,
                               g_cclosure_marshal_VOID__OBJECT,
                               G_TYPE_NONE, 1, UM_TYPE_USER);
-        signals [USER_REMOVED] =
-                g_signal_new ("user-removed",
+
+        signals [USER_DELETED] =
+                g_signal_new ("user-deleted",
                               G_TYPE_FROM_CLASS (klass),
                               G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (UmUserManagerClass, user_removed),
+                              G_STRUCT_OFFSET (UmUserManagerClass, user_deleted),
                               NULL, NULL,
                               g_cclosure_marshal_VOID__OBJECT,
                               G_TYPE_NONE, 1, UM_TYPE_USER);
+
         signals [USER_CHANGED] =
                 g_signal_new ("user-changed",
                               G_TYPE_FROM_CLASS (klass),
@@ -102,6 +341,7 @@ um_user_manager_class_init (UmUserManagerClass *klass)
                               NULL, NULL,
                               g_cclosure_marshal_VOID__OBJECT,
                               G_TYPE_NONE, 1, UM_TYPE_USER);
+
 }
 
 
@@ -183,176 +423,62 @@ add_user_to_dupe_ring (UmUserManager *manager,
 }
 
 static void
-user_changed_handler (UmUser        *user,
-                      UmUserManager *manager)
-{
-        remove_user_from_dupe_ring (manager, user);
-        add_user_to_dupe_ring (manager, user);
-        g_signal_emit (manager, signals[USER_CHANGED], 0, user);
-}
-
-static void
-user_added_handler (DBusGProxy *proxy,
-                    const char *object_path,
-                    gpointer    user_data)
-{
-        UmUserManager *manager = UM_USER_MANAGER (user_data);
-        UmUser *user;
- 
-        if (g_hash_table_lookup (manager->user_by_object_path, object_path))
-                return;
-
-        user = um_user_new_from_object_path (object_path);
-        if (!user)
-                return;
-
-        add_user_to_dupe_ring (manager, user);
-
-        g_signal_connect (user, "changed",
-                          G_CALLBACK (user_changed_handler), manager);
-        g_hash_table_insert (manager->user_by_object_path, g_strdup (um_user_get_object_path (user)), g_object_ref (user));
-        g_hash_table_insert (manager->user_by_name, g_strdup (um_user_get_user_name (user)), g_object_ref (user));
-
-        g_signal_emit (manager, signals[USER_ADDED], 0, user);
-        g_object_unref (user);
-}
-
-static void
-user_deleted_handler (DBusGProxy *proxy,
-                      const char *object_path,
-                      gpointer    user_data)
+clear_dup (gpointer key,
+           gpointer value,
+           gpointer data)
 {
-        UmUserManager *manager = UM_USER_MANAGER (user_data);
-        UmUser *user;
-
-        user = g_hash_table_lookup (manager->user_by_object_path, object_path);
-        g_object_ref (user);
-        g_signal_handlers_disconnect_by_func (user, user_changed_handler, manager);
-
-        remove_user_from_dupe_ring (manager, user);
+        GList *dupes;
 
-        g_hash_table_remove (manager->user_by_object_path, um_user_get_object_path (user));
-        g_hash_table_remove (manager->user_by_name, um_user_get_user_name (user));
-        g_signal_emit (manager, signals[USER_REMOVED], 0, user);
-        g_object_unref (user);
-}
+        /* don't bother maintaining the ring, we're destroying the
+         * entire hash table anyway
+         */
+        dupes = g_object_get_data (G_OBJECT (value), "dupes");
 
-static void
-add_user (const gchar   *object_path,
-          UmUserManager *manager)
-{
-        user_added_handler (NULL, object_path, manager);
+        if (dupes) {
+                g_list_free_1 (dupes);
+                g_object_set_data (G_OBJECT (value), "dupes", NULL);
+        }
 }
 
 static void
-got_users (DBusGProxy     *proxy,
-           DBusGProxyCall *call_id,
-           gpointer        data)
+load_users_done (GObject      *source,
+                 GAsyncResult *res,
+                 gpointer      user_data)
 {
-        UmUserManager *manager = data;
+        UmUserManager *manager = user_data;
         GError *error = NULL;
-        GPtrArray *paths;
+        GVariant *ret;
+        GVariantIter iter;
+        const gchar *object_path;
 
-        if (!dbus_g_proxy_end_call (proxy,
-                                    call_id,
-                                    &error,
-                                    dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &paths,
-                                    G_TYPE_INVALID)) {
+        ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (manager), res, &error);
+        if (ret == NULL) {
                 manager->no_service = TRUE;
                 g_error_free (error);
                 goto done;
         }
 
-        g_ptr_array_foreach (paths, (GFunc)add_user, manager);
+        g_variant_iter_init (&iter, ret);
+        while (g_variant_iter_loop (&iter, "ao", &object_path)) {
+                user_added_handler (manager, object_path);
+        }
 
-        g_ptr_array_foreach (paths, (GFunc)g_free, NULL);
-        g_ptr_array_free (paths, TRUE);
+        g_variant_unref (ret);
 
  done:
         g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0);
 }
 
 static void
-get_users (UmUserManager *manager)
+load_users (UmUserManager *manager)
 {
         g_debug ("calling 'ListCachedUsers'");
-        dbus_g_proxy_begin_call (manager->proxy,
-                                 "ListCachedUsers",
-                                 got_users,
-                                 manager,
-                                 NULL,
-                                 G_TYPE_INVALID);
-}
-
-static void
-um_user_manager_init (UmUserManager *manager)
-{
-        GError *error = NULL;
-
-        manager->user_by_object_path = g_hash_table_new_full (g_str_hash,
-                                                              g_str_equal,
-                                                              g_free,
-                                                              g_object_unref);
-        manager->user_by_name = g_hash_table_new_full (g_str_hash,
-                                                       g_str_equal,
-                                                       g_free,
-                                                       g_object_unref);
-
-        manager->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
-        if (manager->bus == NULL) {
-                g_warning ("Couldn't connect to system bus: %s", error->message);
-                g_error_free (error);
-                goto error;
-        }
-
-        manager->proxy = dbus_g_proxy_new_for_name (manager->bus,
-                                                    "org.freedesktop.Accounts",
-                                                    "/org/freedesktop/Accounts",
-                                                    "org.freedesktop.Accounts");
-
-        dbus_g_proxy_add_signal (manager->proxy, "UserAdded", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
-        dbus_g_proxy_add_signal (manager->proxy, "UserDeleted", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
-
-        dbus_g_proxy_connect_signal (manager->proxy, "UserAdded",
-                                     G_CALLBACK (user_added_handler), manager, NULL);
-        dbus_g_proxy_connect_signal (manager->proxy, "UserDeleted",
-                                     G_CALLBACK (user_deleted_handler), manager, NULL);
-
-        get_users (manager);
-
- error: ;
-}
-
-static void
-clear_dup (gpointer key,
-           gpointer value,
-           gpointer data)
-{
-        GList *dupes;
-
-        /* don't bother maintaining the ring, we're destroying the
-         * entire hash table anyway
-         */
-        dupes = g_object_get_data (G_OBJECT (value), "dupes");
-
-        if (dupes) {
-                g_list_free_1 (dupes);
-                g_object_set_data (G_OBJECT (value), "dupes", NULL);
-        }
-}
-
-static void
-um_user_manager_finalize (GObject *object)
-{
-        UmUserManager *manager;
-
-        manager = UM_USER_MANAGER (object);
-
-        g_hash_table_foreach (manager->user_by_object_path, clear_dup, NULL);
-        g_hash_table_destroy (manager->user_by_object_path);
-        g_hash_table_destroy (manager->user_by_name);
-
-        G_OBJECT_CLASS (um_user_manager_parent_class)->finalize (object);
+        g_dbus_proxy_call (G_DBUS_PROXY (manager),
+                           "ListCachedUsers",
+                           NULL,
+                           G_DBUS_CALL_FLAGS_NONE,
+                           -1, NULL,
+                           load_users_done, manager);
 }
 
 UmUserManager *
@@ -361,7 +487,12 @@ um_user_manager_ref_default (void)
         if (user_manager_object != NULL) {
                 g_object_ref (user_manager_object);
         } else {
-                user_manager_object = g_object_new (UM_TYPE_USER_MANAGER, NULL);
+                user_manager_object = g_object_new (UM_TYPE_USER_MANAGER,
+                                                    "g-bus-type", G_BUS_TYPE_SYSTEM,
+                                                    "g-name", "org.freedesktop.Accounts",
+                                                    "g-object-path", "/org/freedesktop/Accounts",
+                                                    "g-interface-name", "org.freedesktop.Accounts",
+                                                    NULL);
                 g_object_add_weak_pointer (user_manager_object,
                                            (gpointer *) &user_manager_object);
         }
@@ -383,63 +514,21 @@ async_user_op_data_free (gpointer d)
         AsyncUserOpData *data = d;
 
         g_object_unref (data->manager);
-
         g_free (data->user_name);
-
         if (data->destroy)
                 data->destroy (data->data);
-
         g_free (data);
 }
 
 static void
-create_user_done (DBusGProxy     *proxy,
-                  DBusGProxyCall *call_id,
-                  gpointer        user_data)
+async_user_op_done (GObject      *source,
+                    GAsyncResult *res,
+                    gpointer      user_data)
 {
         AsyncUserOpData *data = user_data;
-        gchar *path;
-        GError *error;
-        GSimpleAsyncResult *res;
-
-        res = g_simple_async_result_new (G_OBJECT (data->manager),
-                                         data->callback,
-                                         data->data,
-                                         um_user_manager_create_user);
-        error = NULL;
-        if (!dbus_g_proxy_end_call (proxy,
-                                    call_id,
-                                    &error,
-                                    DBUS_TYPE_G_OBJECT_PATH, &path,
-                                    G_TYPE_INVALID)) {
-                /* dbus-glib fail:
-                 * We have to translate the errors manually here, since
-                 * calling dbus_g_error_has_name on the error returned in
-                 * um_user_manager_create_user_finish doesn't work.
-                 */
-                if (dbus_g_error_has_name (error, "org.freedesktop.Accounts.Error.PermissionDenied")) {
-                        g_simple_async_result_set_error (res,
-                                                         UM_USER_MANAGER_ERROR,
-                                                         UM_USER_MANAGER_ERROR_PERMISSION_DENIED,
-                                                         "Not authorized");
-                }
-                else if (dbus_g_error_has_name (error, "org.freedesktop.Accounts.Error.UserExists")) {
-                        g_simple_async_result_set_error (res,
-                                                         UM_USER_MANAGER_ERROR,
-                                                         UM_USER_MANAGER_ERROR_USER_EXISTS,
-                                                         _("A user with name '%s' already exists."),
-                                                         data->user_name);
-                }
-                else {
-                        g_simple_async_result_set_from_error (res, error);
-                }
-                g_error_free (error);
-        }
-        else {
-                g_simple_async_result_set_op_res_gpointer (res, path, g_free);
-        }
 
-        data->callback (G_OBJECT (data->manager), G_ASYNC_RESULT (res), data->data);
+        data->callback (G_OBJECT (data->manager), res, data->data);
+        async_user_op_data_free (data);
 }
 
 gboolean
@@ -448,19 +537,18 @@ um_user_manager_create_user_finish (UmUserManager  *manager,
                                     UmUser        **user,
                                     GError        **error)
 {
-        gchar *path;
-        GSimpleAsyncResult *res;
-
-        res = G_SIMPLE_ASYNC_RESULT (result);
+        GVariant *ret;
+        const gchar *path;
 
         *user = NULL;
 
-        if (g_simple_async_result_propagate_error (res, error)) {
+        ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (manager), result, error);
+        if (ret == NULL)
                 return FALSE;
-        }
 
-        path = g_simple_async_result_get_op_res_gpointer (res);
+        path = g_variant_get_string (ret, NULL);
         *user = g_hash_table_lookup (manager->user_by_object_path, path);
+        g_variant_unref (ret);
 
         return TRUE;
 }
@@ -483,54 +571,15 @@ um_user_manager_create_user (UmUserManager       *manager,
         data->data = done_data;
         data->destroy = destroy;
 
-        dbus_g_proxy_begin_call (manager->proxy,
-                                 "CreateUser",
-                                 create_user_done,
-                                 data,
-                                 async_user_op_data_free,
-                                 G_TYPE_STRING, user_name,
-                                 G_TYPE_STRING, real_name,
-                                 G_TYPE_INT, account_type,
-                                 G_TYPE_INVALID);
-}
-
-static void
-delete_user_done (DBusGProxy     *proxy,
-                  DBusGProxyCall *call_id,
-                  gpointer        user_data)
-{
-        AsyncUserOpData *data = user_data;
-        GError *error;
-        GSimpleAsyncResult *res;
-
-        res = g_simple_async_result_new (G_OBJECT (data->manager),
-                                         data->callback,
-                                         data->data,
-                                         um_user_manager_delete_user);
-        error = NULL;
-        if (!dbus_g_proxy_end_call (proxy,
-                                    call_id,
-                                    &error,
-                                    G_TYPE_INVALID)) {
-                if (dbus_g_error_has_name (error, "org.freedesktop.Accounts.Error.PermissionDenied")) {
-                        g_simple_async_result_set_error (res,
-                                                         UM_USER_MANAGER_ERROR,
-                                                         UM_USER_MANAGER_ERROR_PERMISSION_DENIED,
-                                                         "Not authorized");
-                }
-                else if (dbus_g_error_has_name (error, "org.freedesktop.Accounts.Error.UserDoesntExists")) {
-                        g_simple_async_result_set_error (res,
-                                                         UM_USER_MANAGER_ERROR,
-                                                         UM_USER_MANAGER_ERROR_USER_DOES_NOT_EXIST,
-                                                         _("This user does not exist."));
-                }
-                else {
-                        g_simple_async_result_set_from_error (res, error);
-                        g_error_free (error);
-                }
-        }
-
-        data->callback (G_OBJECT (data->manager), G_ASYNC_RESULT (res), data->data);
+        g_dbus_proxy_call (G_DBUS_PROXY (manager),
+                           "CreateUser",
+                           g_variant_new ("(ssi)",
+                                          user_name,
+                                          real_name,
+                                          account_type),
+                           G_DBUS_CALL_FLAGS_NONE,
+                           -1, NULL,
+                           async_user_op_done, data);
 }
 
 gboolean
@@ -538,13 +587,13 @@ um_user_manager_delete_user_finish (UmUserManager  *manager,
                                     GAsyncResult   *result,
                                     GError        **error)
 {
-        GSimpleAsyncResult *res;
-
-        res = G_SIMPLE_ASYNC_RESULT (result);
+        GVariant *ret;
 
-        if (g_simple_async_result_propagate_error (res, error)) {
+        ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (manager), result, error);
+        if (ret == NULL)
                 return FALSE;
-        }
+
+        g_variant_unref (ret);
 
         return TRUE;
 }
@@ -565,14 +614,14 @@ um_user_manager_delete_user (UmUserManager       *manager,
         data->data = done_data;
         data->destroy = destroy;
 
-        dbus_g_proxy_begin_call (manager->proxy,
-                                 "DeleteUser",
-                                 delete_user_done,
-                                 data,
-                                 async_user_op_data_free,
-                                 G_TYPE_INT64, um_user_get_uid (user),
-                                 G_TYPE_BOOLEAN, remove_files,
-                                 G_TYPE_INVALID);
+        g_dbus_proxy_call (G_DBUS_PROXY (manager),
+                           "DeleteUser",
+                           g_variant_new ("(tb)",
+                                          um_user_get_uid (user),
+                                          remove_files),
+                           G_DBUS_CALL_FLAGS_NONE,
+                           -1, NULL,
+                           async_user_op_done, data);
 }
 
 GSList *
diff --git a/src/um-user-manager.h b/src/um-user-manager.h
index b051a88..bc13a12 100644
--- a/src/um-user-manager.h
+++ b/src/um-user-manager.h
@@ -23,7 +23,6 @@
 
 #include <glib-object.h>
 #include <gio/gio.h>
-#include <dbus/dbus-glib.h>
 
 #include "um-user.h"
 
@@ -36,31 +35,21 @@ G_BEGIN_DECLS
 #define UM_IS_USER_MANAGER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), UM_TYPE_USER_MANAGER))
 #define UM_USER_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), UM_TYPE_USER_MANAGER, UmUserManagerClass))
 
-typedef struct
-{
-        GObject parent;
+typedef struct _UmUserManager UmUserManager;
+typedef struct _UmUserManagerClass UmUserManagerClass;
 
-        DBusGConnection *bus;
-        DBusGProxy *proxy;
 
-        GHashTable *user_by_object_path;
-        GHashTable *user_by_name;
-
-        gboolean no_service;
-} UmUserManager;
-
-typedef struct
-{
-        GObjectClass   parent_class;
+struct _UmUserManagerClass {
+        GDBusProxyClass parent_class;
 
         void          (* users_loaded)              (UmUserManager *user_managaer);
         void          (* user_added)                (UmUserManager *user_manager,
                                                      UmUser        *user);
-        void          (* user_removed)              (UmUserManager *user_manager,
+        void          (* user_deleted)              (UmUserManager *user_manager,
                                                      UmUser        *user);
         void          (* user_changed)              (UmUserManager *user_manager,
                                                      UmUser        *user);
-} UmUserManagerClass;
+};
 
 
 typedef enum {
@@ -107,6 +96,8 @@ gboolean           um_user_manager_delete_user_finish    (UmUserManager       *m
                                                           GAsyncResult        *result,
                                                           GError             **error);
 
+const gchar       *um_user_manager_get_daemon_version    (UmUserManager       *manager);
+
 G_END_DECLS
 
 #endif /* __UM_USER_MANAGER__ */
diff --git a/src/um-user-panel.c b/src/um-user-panel.c
index 03efb16..024c4df 100644
--- a/src/um-user-panel.c
+++ b/src/um-user-panel.c
@@ -207,7 +207,7 @@ get_next_user_row (GtkTreeModel *model,
 }
 
 static void
-user_removed (UmUserManager *um, UmUser *user, UmUserPanelPrivate *d)
+user_deleted (UmUserManager *um, UmUser *user, UmUserPanelPrivate *d)
 {
         GtkTreeView *tv;
         GtkTreeModel *model;
@@ -216,7 +216,7 @@ user_removed (UmUserManager *um, UmUser *user, UmUserPanelPrivate *d)
         GtkTreeIter iter, next;
         UmUser *u;
 
-        g_debug ("user removed: %s\n", um_user_get_user_name (user));
+        g_debug ("user deleted: %s\n", um_user_get_user_name (user));
         tv = (GtkTreeView *)get_widget (d, "list-treeview");
         selection = gtk_tree_view_get_selection (tv);
         model = gtk_tree_view_get_model (tv);
@@ -832,7 +832,7 @@ users_loaded (UmUserManager     *manager,
         g_slist_free (list);
 
         g_signal_connect (d->um, "user-added", G_CALLBACK (user_added), d);
-        g_signal_connect (d->um, "user-removed", G_CALLBACK (user_removed), d);
+        g_signal_connect (d->um, "user-deleted", G_CALLBACK (user_deleted), d);
 }
 
 static void



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