[accounts-dialog/gdbus: 3/5] Convert UmUser to a GDBusProxy subclass



commit 215a0735bfb399dca5d3bd20edec0dc538b9687d
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Jul 22 01:03:12 2010 -0400

    Convert UmUser to a GDBusProxy subclass

 src/um-user.c | 1076 ++++++++++++++++++++++++++++++++++-----------------------
 src/um-user.h |    6 +-
 2 files changed, 653 insertions(+), 429 deletions(-)
---
diff --git a/src/um-user.c b/src/um-user.c
index ce92b4e..82869fa 100644
--- a/src/um-user.c
+++ b/src/um-user.c
@@ -37,282 +37,585 @@
 
 #include <gio/gunixoutputstream.h>
 
-#include <dbus/dbus-glib.h>
-
 #include "um-user.h"
 #include "um-account-type.h"
 #include "um-utils.h"
 
 
+static const gchar introspection_xml[] =
+  "<node>"
+  "  <interface name='org.freedesktop.Accounts.User'>"
+  "    <method name='SetUserName'>"
+  "      <arg name='name' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetRealName'>"
+  "      <arg name='name' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetEmail'>"
+  "      <arg name='email' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetLanguage'>"
+  "      <arg name='language' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetLocation'>"
+  "      <arg name='location' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetHomeDirectory'>"
+  "      <arg name='homedir' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetShell'>"
+  "      <arg name='shell' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetIconFile'>"
+  "      <arg name='filename' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetLocked'>"
+  "      <arg name='locked' direction='in' type='b'/>"
+  "    </method>"
+  "    <method name='SetAccountType'>"
+  "      <arg name='accountType' direction='in' type='i'/>"
+  "    </method>"
+  "    <method name='SetPasswordMode'>"
+  "      <arg name='mode' direction='in' type='i'/>"
+  "    </method>"
+  "    <method name='SetPassword'>"
+  "      <arg name='mode' direction='in' type='s'/>"
+  "      <arg name='hint' direction='in' type='s'/>"
+  "    </method>"
+  "    <method name='SetAutomaticLogin'>"
+  "      <arg name='enabled' direction='in' type='b'/>"
+  "    </method>"
+  "    <property name='Uid' type='t' access='read'/>"
+  "    <property name='UserName' type='s' access='read'/>"
+  "    <property name='RealName' type='s' access='read'/>"
+  "    <property name='AccountType' type='i' access='read'/>"
+  "    <property name='HomeDirectory' type='s' access='read'/>"
+  "    <property name='Shell' type='s' access='read'/>"
+  "    <property name='Email' type='s' access='read'/>"
+  "    <property name='Language' type='s' access='read'/>"
+  "    <property name='Location' type='s' access='read'/>"
+  "    <property name='LoginFrequency' type='t' access='read'/>"
+  "    <property name='IconFile' type='s' access='read'/>"
+  "    <property name='Locked' type='b' access='read'/>"
+  "    <property name='PasswordMode' type='i' access='read'/>"
+  "    <property name='PasswordHint' type='s' access='read'/>"
+  "    <property name='AutomaticLogin' type='b' access='read'/>"
+  "    <signal name='Changed'/>"
+  "  </interface>"
+  "</node>";
+
  #define UM_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UM_TYPE_USER, UmUserClass))
  #define UM_IS_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UM_TYPE_USER))
 #define UM_USER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), UM_TYPE_USER, UmUserClass))
 
 #define MAX_FILE_SIZE     65536
 
-typedef struct {
-        uid_t           uid;
-        gchar          *user_name;
-        gchar          *real_name;
-        gint            account_type;
-        gint            password_mode;
-        gchar          *password_hint;
-        gchar          *email;
-        gchar          *language;
-        gchar          *location;
-        guint64         login_frequency;
-        gchar          *icon_file;
-        gboolean        locked;
-        gboolean        automatic_login;
-} UserProperties;
+struct _UmUser {
+        GDBusProxy       parent;
+        gchar           *display_name;
+};
 
-static void
-collect_props (const gchar    *key,
-               const GValue   *value,
-               UserProperties *props)
+typedef struct _UmUserClass
 {
-        gboolean handled = TRUE;
+        GDBusProxyClass  parent_class;
 
-        if (strcmp (key, "Uid") == 0) {
-                props->uid = g_value_get_uint64 (value);
-        }
-        else if (strcmp (key, "UserName") == 0) {
-                props->user_name = g_value_dup_string (value);
-        }
-        else if (strcmp (key, "RealName") == 0) {
-                props->real_name = g_value_dup_string (value);
-        }
-        else if (strcmp (key, "AccountType") == 0) {
-                props->account_type = g_value_get_int (value);
-        }
-        else if (strcmp (key, "Email") == 0) {
-                props->email = g_value_dup_string (value);
-        }
-        else if (strcmp (key, "Language") == 0) {
-                props->language = g_value_dup_string (value);
-        }
-        else if (strcmp (key, "Location") == 0) {
-                props->location = g_value_dup_string (value);
-        }
-        else if (strcmp (key, "LoginFrequency") == 0) {
-                props->login_frequency = g_value_get_uint64 (value);
-        }
-        else if (strcmp (key, "IconFile") == 0) {
-                props->icon_file = g_value_dup_string (value);
-        }
-        else if (strcmp (key, "Locked") == 0) {
-                props->locked = g_value_get_boolean (value);
-        }
-        else if (strcmp (key, "AutomaticLogin") == 0) {
-                props->automatic_login = g_value_get_boolean (value);
-        }
-        else if (strcmp (key, "PasswordMode") == 0) {
-                props->password_mode = g_value_get_int (value);
-        }
-        else if (strcmp (key, "PasswordHint") == 0) {
-                props->password_hint = g_value_dup_string (value);
-        }
-        else if (strcmp (key, "HomeDirectory") == 0) {
-                /* ignore */
-        }
-        else if (strcmp (key, "Shell") == 0) {
-                /* ignore */
-        }
-        else {
-                handled = FALSE;
+        void (*changed) (UmUser *user);
+} UmUserClass;
+
+static GDBusInterfaceInfo *
+um_user_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);
         }
 
-        if (!handled)
-                g_debug ("unhandled property %s", key);
+        return info;
 }
 
+
+enum {
+        PROP_0,
+        PROP_UID,
+        PROP_USER_NAME,
+        PROP_REAL_NAME,
+        PROP_ACCOUNT_TYPE,
+        PROP_HOME_DIRECTORY,
+        PROP_SHELL,
+        PROP_EMAIL,
+        PROP_LANGUAGE,
+        PROP_LOCATION,
+        PROP_LOGIN_FREQUENCY,
+        PROP_ICON_FILE,
+        PROP_LOCKED,
+        PROP_PASSWORD_MODE,
+        PROP_PASSWORD_HINT,
+        PROP_AUTOMATIC_LOGIN
+};
+
+enum {
+        CHANGED,
+        LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (UmUser, um_user, G_TYPE_DBUS_PROXY);
+
 static void
-user_properties_free (UserProperties *props)
+um_user_finalize (GObject *object)
 {
-        g_free (props->user_name);
-        g_free (props->real_name);
-        g_free (props->password_hint);
-        g_free (props->email);
-        g_free (props->language);
-        g_free (props->location);
-        g_free (props->icon_file);
-        g_free (props);
+        UmUser *user;
+
+        user = UM_USER (object);
+
+        g_free (user->display_name);
+
+        (*G_OBJECT_CLASS (um_user_parent_class)->finalize) (object);
 }
 
-static UserProperties *
-user_properties_get (DBusGConnection *bus,
-                     const gchar     *object_path)
+static void
+um_user_init (UmUser *user)
 {
-        UserProperties *props;
-        GError *error;
-        DBusGProxy *proxy;
-        GHashTable *hash_table;
+        g_dbus_proxy_set_interface_info (G_DBUS_PROXY (user),
+                                         um_user_get_interface_info ());
+}
 
-        props = g_new0 (UserProperties, 1);
+static void
+um_user_get_property (GObject    *object,
+                      guint       prop_id,
+                      GValue     *value,
+                      GParamSpec *pspec)
+{
+        UmUser *user = UM_USER (object);
 
-        proxy = dbus_g_proxy_new_for_name (bus,
-                                           "org.freedesktop.Accounts",
-                                           object_path,
-                                           "org.freedesktop.DBus.Properties");
-        error = NULL;
-        if (!dbus_g_proxy_call (proxy,
-                                "GetAll",
-                                &error,
-                                G_TYPE_STRING,
-                                "org.freedesktop.Accounts.User",
-                                G_TYPE_INVALID,
-                                dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
-                                &hash_table,
-                                G_TYPE_INVALID)) {
-                g_debug ("Error calling GetAll() when retrieving properties for %s: %s", object_path, error->message);
-                g_error_free (error);
-                g_free (props);
-                props = NULL;
-                goto out;
-        }
-        g_hash_table_foreach (hash_table, (GHFunc) collect_props, props);
-        g_hash_table_unref (hash_table);
+        switch (prop_id) {
 
- out:
-        g_object_unref (proxy);
-        return props;
-}
+        case PROP_UID:
+                g_value_set_uint64 (value, um_user_get_uid (user));
+                break;
 
+        case PROP_USER_NAME:
+                g_value_set_string (value, um_user_get_user_name (user));
+                break;
 
-struct _UmUser {
-        GObject         parent;
+        case PROP_REAL_NAME:
+                g_value_set_string (value, um_user_get_real_name (user));
+                break;
 
-        DBusGConnection *bus;
-        DBusGProxy      *proxy;
-        gchar           *object_path;
+        case PROP_ACCOUNT_TYPE:
+                g_value_set_int (value, um_user_get_account_type (user));
+                break;
 
-        UserProperties  *props;
+        case PROP_HOME_DIRECTORY:
+                g_value_set_string (value, um_user_get_home_directory (user));
+                break;
 
-        gchar           *display_name;
-};
+        case PROP_SHELL:
+                g_value_set_string (value, um_user_get_shell (user));
+                break;
 
-typedef struct _UmUserClass
-{
-        GObjectClass parent_class;
-} UmUserClass;
+        case PROP_EMAIL:
+                g_value_set_string (value, um_user_get_email (user));
+                break;
 
-enum {
-        CHANGED,
-        LAST_SIGNAL
-};
+        case PROP_LANGUAGE:
+                g_value_set_string (value, um_user_get_language (user));
+                break;
 
-static guint signals[LAST_SIGNAL] = { 0 };
+        case PROP_LOCATION:
+                g_value_set_string (value, um_user_get_location (user));
+                break;
+
+        case PROP_LOGIN_FREQUENCY:
+                g_value_set_uint64 (value, um_user_get_login_frequency (user));
+                break;
 
-static void um_user_finalize (GObject *object);
+        case PROP_ICON_FILE:
+                g_value_set_string (value, um_user_get_icon_file (user));
+                break;
 
-G_DEFINE_TYPE (UmUser, um_user, G_TYPE_OBJECT)
+        case PROP_LOCKED:
+                g_value_set_boolean (value, um_user_get_locked (user));
+                break;
+
+        case PROP_PASSWORD_MODE:
+                g_value_set_int (value, um_user_get_password_mode (user));
+                break;
+
+        case PROP_PASSWORD_HINT:
+                g_value_set_string (value, um_user_get_password_hint (user));
+                break;
+
+        case PROP_AUTOMATIC_LOGIN:
+                g_value_set_boolean (value, um_user_get_automatic_login (user));
+                break;
+
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+static void
+um_user_g_signal (GDBusProxy   *proxy,
+                  const gchar  *sender_name,
+                  const gchar  *signal_name,
+                  GVariant     *parameters)
+{
+        UmUser *user = UM_USER (proxy);
+
+        if (g_strcmp0 (signal_name, "Changed") == 0)
+                g_signal_emit (user, signals[CHANGED], 0);
+}
+
+static void
+um_user_g_properties_changed (GDBusProxy          *proxy,
+                              GVariant            *changed_properties,
+                              const gchar* const  *invalidated_properties)
+{
+        UmUser *user = UM_USER (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, "Uid") == 0)
+                                g_object_notify (G_OBJECT (user), "uid");
+                        else if (g_strcmp0 (key, "UserName") == 0)
+                                g_object_notify (G_OBJECT (user), "user-name");
+                        else if (g_strcmp0 (key, "RealName") == 0)
+                                g_object_notify (G_OBJECT (user), "real-name");
+                        else if (g_strcmp0 (key, "AccountType") == 0)
+                                g_object_notify (G_OBJECT (user), "account-type");
+                        else if (g_strcmp0 (key, "HomeDirectory") == 0)
+                                g_object_notify (G_OBJECT (user), "home-directory");
+                        else if (g_strcmp0 (key, "Shell") == 0)
+                                g_object_notify (G_OBJECT (user), "shell");
+                        else if (g_strcmp0 (key, "Email") == 0)
+                                g_object_notify (G_OBJECT (user), "email");
+                        else if (g_strcmp0 (key, "Language") == 0)
+                                g_object_notify (G_OBJECT (user), "language");
+                        else if (g_strcmp0 (key, "Location") == 0)
+                                g_object_notify (G_OBJECT (user), "location");
+                        else if (g_strcmp0 (key, "LoginFrequency") == 0)
+                                g_object_notify (G_OBJECT (user), "login-frequency");
+                        else if (g_strcmp0 (key, "IconFile") == 0)
+                                g_object_notify (G_OBJECT (user), "icon-file");
+                        else if (g_strcmp0 (key, "Locked") == 0)
+                                g_object_notify (G_OBJECT (user), "locked");
+                        else if (g_strcmp0 (key, "PasswordMode") == 0)
+                                g_object_notify (G_OBJECT (user), "password-mode");
+                        else if (g_strcmp0 (key, "PasswordHint") == 0)
+                                g_object_notify (G_OBJECT (user), "password-hint");
+                        else if (g_strcmp0 (key, "AutomaticLogin") == 0)
+                                g_object_notify (G_OBJECT (user), "automatic-login");
+                }
+                g_variant_iter_free (iter);
+        }
+}
 
 static void
 um_user_class_init (UmUserClass *class)
 {
         GObjectClass *gobject_class;
+        GDBusProxyClass *proxy_class;
 
         gobject_class = G_OBJECT_CLASS (class);
-
+        gobject_class->get_property = um_user_get_property;
         gobject_class->finalize = um_user_finalize;
 
+        proxy_class = G_DBUS_PROXY_CLASS (class);
+        proxy_class->g_signal = um_user_g_signal;
+        proxy_class->g_properties_changed = um_user_g_properties_changed;
+
+        g_object_class_install_property (gobject_class, PROP_UID,
+                g_param_spec_uint64 ("uid", "Uid", "The numeric id of the user",
+                                     0, G_MAXUINT64, 0, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_USER_NAME,
+                g_param_spec_string ("user-name", "User name", "The user name of the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_REAL_NAME,
+                g_param_spec_string ("real-name", "Real name", "The real name of the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_ACCOUNT_TYPE,
+                g_param_spec_int ("account-type", "Account type", "The account type of the user",
+                                  0, 2, 0, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_HOME_DIRECTORY,
+                g_param_spec_string ("home-directory", "Home directory", "The home directory of the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_SHELL,
+                g_param_spec_string ("shell", "Shell", "The shell of the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_EMAIL,
+                g_param_spec_string ("email", "Email", "The email address of the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_LANGUAGE,
+                g_param_spec_string ("language", "Language", "The language of the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_LOCATION,
+                g_param_spec_string ("location", "Location", "The location of the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_LOGIN_FREQUENCY,
+                g_param_spec_uint64 ("login-frequency", "Login frequency", "The login frequency of the user",
+                                     0, G_MAXUINT64, 0, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_ICON_FILE,
+                g_param_spec_string ("icon-file", "Icon file", "The icon file for the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_LOCKED,
+                g_param_spec_boolean ("locked", "Locked", "Whether the user account is locked",
+                                      FALSE, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_PASSWORD_MODE,
+                g_param_spec_int ("password-mode", "Password mode", "The password mode of the user",
+                                  0, 4, 3, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_PASSWORD_HINT,
+                g_param_spec_string ("password-hint", "Password hint", "The password hint for the user",
+                                     NULL, G_PARAM_READABLE));
+
+        g_object_class_install_property (gobject_class, PROP_AUTOMATIC_LOGIN,
+                g_param_spec_boolean ("automatic-login", "Automatic login", "Whether automatic login is enabled for the user",
+                                      FALSE, G_PARAM_READABLE));
+
         signals[CHANGED] = g_signal_new ("changed",
                                          G_TYPE_FROM_CLASS (class),
                                          G_SIGNAL_RUN_LAST,
-                                         0,
+                                         G_STRUCT_OFFSET (UmUserClass, changed),
                                          NULL, NULL,
                                          g_cclosure_marshal_VOID__VOID,
                                          G_TYPE_NONE, 0);
 }
 
 
-static void
-um_user_init (UmUser *user)
+uid_t
+um_user_get_uid (UmUser *user)
 {
+        GVariant *value;
+        uid_t ret;
+
+        g_return_val_if_fail (UM_IS_USER (user), -1);
+
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "Uid");
+        ret = g_variant_get_uint64 (value);
+        g_variant_unref (value);
+
+        return ret;
 }
 
-static void
-um_user_finalize (GObject *object)
+const gchar *
+um_user_get_user_name (UmUser *user)
 {
-        UmUser *user;
+        GVariant *value;
+        const gchar *ret;
 
-        user = UM_USER (object);
+        g_return_val_if_fail (UM_IS_USER (user), NULL);
 
-        dbus_g_connection_unref (user->bus);
-        g_free (user->object_path);
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "UserName");
+        ret = g_variant_get_string (value, NULL);
+        g_variant_unref (value);
+
+        return ret;
+}
 
-        if (user->proxy != NULL)
-                g_object_unref (user->proxy);
+const gchar *
+um_user_get_real_name (UmUser *user)
+{
+        GVariant *value;
+        const gchar *ret;
 
-        if (user->props != NULL)
-                user_properties_free (user->props);
+        g_return_val_if_fail (UM_IS_USER (user), NULL);
 
-        (*G_OBJECT_CLASS (um_user_parent_class)->finalize) (object);
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "RealName");
+        ret = g_variant_get_string (value, NULL);
+        g_variant_unref (value);
+
+        return ret;
 }
 
-uid_t
-um_user_get_uid (UmUser *user)
+gint
+um_user_get_account_type (UmUser *user)
 {
-        g_return_val_if_fail (UM_IS_USER (user), -1);
+        GVariant *value;
+        gint ret;
 
-        return user->props->uid;
+        g_return_val_if_fail (UM_IS_USER (user), UM_ACCOUNT_TYPE_STANDARD);
+
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "AccountType");
+        ret = g_variant_get_int32 (value);
+        g_variant_unref (value);
+
+        return ret;
+}
+
+guint64
+um_user_get_login_frequency (UmUser *user)
+{
+        GVariant *value;
+        guint64 ret;
+
+        g_return_val_if_fail (UM_IS_USER (user), 0);
+
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "LoginFrequency");
+        ret = g_variant_get_uint64 (value);
+        g_variant_unref (value);
+
+        return ret;
 }
 
 const gchar *
-um_user_get_real_name (UmUser *user)
+um_user_get_location (UmUser *user)
 {
+        GVariant *value;
+        const gchar *ret;
+
         g_return_val_if_fail (UM_IS_USER (user), NULL);
 
-        return user->props->real_name;
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "Location");
+        ret = g_variant_get_string (value, NULL);
+        g_variant_unref (value);
+
+        return ret;
+}
+
+gint
+um_user_get_password_mode (UmUser *user)
+{
+        GVariant *value;
+        gint ret;
+
+        g_return_val_if_fail (UM_IS_USER (user), UM_PASSWORD_MODE_NONE);
+
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "PasswordMode");
+        ret = g_variant_get_int32 (value);
+        g_variant_unref (value);
+
+        return ret;
 }
 
 const gchar *
-um_user_get_display_name (UmUser *user)
+um_user_get_password_hint (UmUser *user)
 {
+        GVariant *value;
+        const gchar *ret;
+
         g_return_val_if_fail (UM_IS_USER (user), NULL);
 
-       return user->display_name ? user->display_name
-                                 : user->props->real_name;
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "PasswordHint");
+        ret = g_variant_get_string (value, NULL);
+        g_variant_unref (value);
+
+        return ret;
 }
 
 const gchar *
-um_user_get_user_name (UmUser *user)
+um_user_get_icon_file (UmUser *user)
 {
+        GVariant *value;
+        const gchar *ret;
+
         g_return_val_if_fail (UM_IS_USER (user), NULL);
 
-        return user->props->user_name;
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "IconFile");
+        ret = g_variant_get_string (value, NULL);
+        g_variant_unref (value);
+
+        return ret;
 }
 
-gint
-um_user_get_account_type (UmUser *user)
+gboolean
+um_user_get_locked (UmUser *user)
 {
-        g_return_val_if_fail (UM_IS_USER (user), UM_ACCOUNT_TYPE_STANDARD);
+        GVariant *value;
+        gboolean ret;
+
+        g_return_val_if_fail (UM_IS_USER (user), FALSE);
 
-        return user->props->account_type;
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "Locked");
+        ret = g_variant_get_boolean (value);
+        g_variant_unref (value);
+
+        return ret;
 }
 
-gulong
-um_user_get_login_frequency (UmUser *user)
+gboolean
+um_user_get_automatic_login (UmUser *user)
 {
-        g_return_val_if_fail (UM_IS_USER (user), 0);
+        GVariant *value;
+        gboolean ret;
+
+        g_return_val_if_fail (UM_IS_USER (user), FALSE);
+
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "AutomaticLogin");
+        ret = g_variant_get_boolean (value);
+        g_variant_unref (value);
+
+        return ret;
+}
+
+const gchar *
+um_user_get_email (UmUser *user)
+{
+        GVariant *value;
+        const gchar *ret;
+
+        g_return_val_if_fail (UM_IS_USER (user), NULL);
+
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "Email");
+        ret = g_variant_get_string (value, NULL);
+        g_variant_unref (value);
+
+        return ret;
+}
+
+const gchar *
+um_user_get_language (UmUser *user)
+{
+        GVariant *value;
+        const gchar *ret;
 
-        return user->props->login_frequency;
+        g_return_val_if_fail (UM_IS_USER (user), NULL);
+
+        value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "Language");
+        ret = g_variant_get_string (value, NULL);
+        g_variant_unref (value);
+
+        if (*ret == '\0')
+                ret = NULL;
+
+        return ret;
 }
 
 gint
 um_user_collate (UmUser *user1,
-                  UmUser *user2)
+                 UmUser *user2)
 {
-        const char *str1;
-        const char *str2;
-        gulong      num1;
-        gulong      num2;
+        const gchar *str1;
+        const gchar *str2;
+        guint64      num1;
+        guint64      num2;
 
         g_return_val_if_fail (UM_IS_USER (user1), 0);
         g_return_val_if_fail (UM_IS_USER (user2), 0);
 
-        num1 = user1->props->login_frequency;
-        num2 = user2->props->login_frequency;
+        num1 = um_user_get_login_frequency (user1);
+        num2 = um_user_get_login_frequency (user2);
         if (num1 > num2) {
                 return -1;
         }
@@ -322,16 +625,14 @@ um_user_collate (UmUser *user1,
         }
 
         /* if login frequency is equal try names */
-        if (user1->props->real_name != NULL) {
-                str1 = user1->props->real_name;
-        } else {
-                str1 = user1->props->user_name;
+        str1 = um_user_get_real_name (user1);
+        if (str1 == NULL) {
+                str1 = um_user_get_user_name (user1);
         }
 
-        if (user2->props->real_name != NULL) {
-                str2 = user2->props->real_name;
-        } else {
-                str2 = user2->props->user_name;
+        str2 = um_user_get_real_name (user2);
+        if (str2 == NULL) {
+                str2 = um_user_get_user_name (user2);
         }
 
         if (str1 == NULL && str2 != NULL) {
@@ -350,8 +651,8 @@ um_user_collate (UmUser *user1,
 }
 
 static gboolean
-check_user_file (const char *filename,
-                 gssize      max_file_size)
+check_user_file (const gchar *filename,
+                 gssize       max_file_size)
 {
         struct stat fileinfo;
 
@@ -561,16 +862,17 @@ um_user_render_icon (UmUser   *user,
         GdkPixbuf    *framed;
         gboolean      res;
         GError       *error;
+        const gchar *icon_file;
 
         g_return_val_if_fail (UM_IS_USER (user), NULL);
         g_return_val_if_fail (icon_size > 12, NULL);
 
         pixbuf = NULL;
-        if (user->props->icon_file) {
-                res = check_user_file (user->props->icon_file,
-                                       MAX_FILE_SIZE);
+        icon_file = um_user_get_icon_file (user);
+        if (icon_file) {
+                res = check_user_file (icon_file, MAX_FILE_SIZE);
                 if (res) {
-                        pixbuf = gdk_pixbuf_new_from_file_at_size (user->props->icon_file,
+                        pixbuf = gdk_pixbuf_new_from_file_at_size (icon_file,
                                                                    icon_size,
                                                                    icon_size,
                                                                    NULL);
@@ -609,146 +911,19 @@ um_user_render_icon (UmUser   *user,
         return pixbuf;
 }
 
-const gchar *
-um_user_get_email (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), NULL);
-
-        return user->props->email;
-}
-
-const gchar *
-um_user_get_language (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), NULL);
-
-        if (*user->props->language == '\0')
-                return NULL;
-        return user->props->language;
-}
-
-const gchar *
-um_user_get_location (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), NULL);
-
-        return user->props->location;
-}
-
-gint
-um_user_get_password_mode (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), UM_PASSWORD_MODE_NONE);
-
-        return user->props->password_mode;
-}
-
-const char *
-um_user_get_password_hint (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), NULL);
-
-        return user->props->password_hint;
-}
-
-const char *
-um_user_get_icon_file (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), NULL);
-
-        return user->props->icon_file;
-}
-
-gboolean
-um_user_get_locked (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), FALSE);
-
-        return user->props->locked;
-}
-
-gboolean
-um_user_get_automatic_login (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), FALSE);
-
-        return user->props->automatic_login;
-}
-
-const gchar *
-um_user_get_object_path (UmUser *user)
-{
-        g_return_val_if_fail (UM_IS_USER (user), NULL);
-
-        return user->object_path;
-}
-
-static gboolean
-update_info (UmUser *user)
-{
-        UserProperties *props;
-
-        props = user_properties_get (user->bus, user->object_path);
-        if (props != NULL) {
-                if (user->props != NULL)
-                        user_properties_free (user->props);
-                user->props = props;
-                return TRUE;
-        }
-        else {
-                return FALSE;
-        }
-}
-
-static void
-changed_handler (DBusGProxy *proxy,
-                 gpointer   *data)
-{
-        UmUser *user = UM_USER (data);
-
-        if (update_info (user)) {
-                if (user->display_name != NULL) {
-                        um_user_show_full_display_name (user);
-                }
-
-                g_signal_emit (user, signals[CHANGED], 0);
-        }
-}
-
 UmUser *
 um_user_new_from_object_path (const gchar *object_path)
 {
         UmUser *user;
-        GError *error;
-
-        user = (UmUser *)g_object_new (UM_TYPE_USER, NULL);
-        user->object_path = g_strdup (object_path);
-
-        error = NULL;
-        user->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
-        if (user->bus == NULL) {
-                g_warning ("Couldn't connect to system bus: %s", error->message);
-                goto error;
-        }
-
-        user->proxy = dbus_g_proxy_new_for_name (user->bus,
-                                                 "org.freedesktop.Accounts",
-                                                 user->object_path,
-                                                 "org.freedesktop.Accounts.User");
-        dbus_g_proxy_set_default_timeout (user->proxy, INT_MAX);
-        dbus_g_proxy_add_signal (user->proxy, "Changed", G_TYPE_INVALID);
-
-        dbus_g_proxy_connect_signal (user->proxy, "Changed",
-                                     G_CALLBACK (changed_handler), user, NULL);
 
-        if (!update_info (user))
-                goto error;
+        user = g_object_new (UM_TYPE_USER,
+                             "g-bus-type", G_BUS_TYPE_SYSTEM,
+                             "g-name", "org.freedesktop.Accounts",
+                             "g-object-path", object_path,
+                             "g-interface-name", "org.freedesktop.Accounts.User",
+                             NULL);
 
         return user;
-
- error:
-        g_object_unref (user);
-        return NULL;
 }
 
 void
@@ -756,16 +931,19 @@ um_user_set_email (UmUser      *user,
                    const gchar *email)
 {
         GError *error = NULL;
-
-        if (!dbus_g_proxy_call (user->proxy,
-                                "SetEmail",
-                                &error,
-                                G_TYPE_STRING, email,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
+        GVariant *ret;
+
+        ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                      "SetEmail",
+                                      g_variant_new ("(s)", email),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        if (ret == NULL) {
                 g_warning ("SetEmail call failed: %s", error->message);
                 g_error_free (error);
-                return;
+        }
+        else {
+                g_variant_unref (ret);
         }
 }
 
@@ -774,16 +952,19 @@ um_user_set_language (UmUser      *user,
                       const gchar *language)
 {
         GError *error = NULL;
-
-        if (!dbus_g_proxy_call (user->proxy,
-                                "SetLanguage",
-                                &error,
-                                G_TYPE_STRING, language,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
+        GVariant *ret;
+
+        ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                      "SetLanguage",
+                                      g_variant_new ("(s)", language),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        if (ret == NULL) {
                 g_warning ("SetLanguage call failed: %s", error->message);
                 g_error_free (error);
-                return;
+        }
+        else {
+                g_variant_unref (ret);
         }
 }
 
@@ -792,16 +973,19 @@ um_user_set_location (UmUser      *user,
                       const gchar *location)
 {
         GError *error = NULL;
-
-        if (!dbus_g_proxy_call (user->proxy,
-                                "SetLocation",
-                                &error,
-                                G_TYPE_STRING, location,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
+        GVariant *ret;
+
+        ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                      "SetLocation",
+                                      g_variant_new ("(s)", location),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        if (ret == NULL) {
                 g_warning ("SetLocation call failed: %s", error->message);
                 g_error_free (error);
-                return;
+        }
+        else {
+                g_variant_unref (ret);
         }
 }
 
@@ -810,16 +994,19 @@ um_user_set_user_name (UmUser      *user,
                        const gchar *user_name)
 {
         GError *error = NULL;
-
-        if (!dbus_g_proxy_call (user->proxy,
-                                "SetUserName",
-                                &error,
-                                G_TYPE_STRING, user_name,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
+        GVariant *ret;
+
+        ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                      "SetUserName",
+                                      g_variant_new ("(s)", user_name),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        if (ret == NULL) {
                 g_warning ("SetUserName call failed: %s", error->message);
                 g_error_free (error);
-                return;
+        }
+        else {
+                g_variant_unref (ret);
         }
 }
 
@@ -828,16 +1015,19 @@ um_user_set_real_name (UmUser      *user,
                        const gchar *real_name)
 {
         GError *error = NULL;
-
-        if (!dbus_g_proxy_call (user->proxy,
-                                "SetRealName",
-                                &error,
-                                G_TYPE_STRING, real_name,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
+        GVariant *ret;
+
+        ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                      "SetRealName",
+                                      g_variant_new ("(s)", real_name),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        if (ret == NULL) {
                 g_warning ("SetRealName call failed: %s", error->message);
                 g_error_free (error);
-                return;
+        }
+        else {
+                g_variant_unref (ret);
         }
 }
 
@@ -846,16 +1036,19 @@ um_user_set_icon_file (UmUser      *user,
                        const gchar *icon_file)
 {
         GError *error = NULL;
-
-        if (!dbus_g_proxy_call (user->proxy,
-                                "SetIconFile",
-                                &error,
-                                G_TYPE_STRING, icon_file,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
+        GVariant *ret;
+
+        ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                      "SetIconFile",
+                                      g_variant_new ("(s)", icon_file),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        if (ret == NULL) {
                 g_warning ("SetIconFile call failed: %s", error->message);
                 g_error_free (error);
-                return;
+        }
+        else {
+                g_variant_unref (ret);
         }
 }
 
@@ -904,16 +1097,19 @@ um_user_set_account_type (UmUser *user,
                           gint    account_type)
 {
         GError *error = NULL;
-
-        if (!dbus_g_proxy_call (user->proxy,
-                                "SetAccountType",
-                                &error,
-                                G_TYPE_INT, account_type,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
+        GVariant *ret;
+
+        ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                      "SetAccountType",
+                                      g_variant_new ("(i)", account_type),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        if (ret == NULL) {
                 g_warning ("SetAccountType call failed: %s", error->message);
                 g_error_free (error);
-                return;
+        }
+        else {
+                g_variant_unref (ret);
         }
 }
 
@@ -961,112 +1157,133 @@ um_user_set_password (UmUser      *user,
 {
         GError *error = NULL;
         gchar *crypted;
+        GVariant *ret;
 
         if (password_mode == 0) {
                 crypted = make_crypted (password);
-                if (!dbus_g_proxy_call (user->proxy,
-                                        "SetPassword",
-                                        &error,
-                                        G_TYPE_STRING, crypted,
-                                        G_TYPE_STRING, hint,
-                                        G_TYPE_INVALID,
-                                        G_TYPE_INVALID)) {
+                ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                              "SetPassword",
+                                              g_variant_new ("(ss)",
+                                                             crypted,
+                                                             hint),
+                                              G_DBUS_CALL_FLAGS_NONE,
+                                              -1, NULL, &error);
+                if (ret == NULL) {
                         g_warning ("SetPassword call failed: %s", error->message);
                         g_error_free (error);
                 }
+                else {
+                        g_variant_unref (ret);
+                }
                 memset (crypted, 0, strlen (crypted));
                 g_free (crypted);
         }
         else if (password_mode == 3 || password_mode == 4) {
-                if (!dbus_g_proxy_call (user->proxy,
-                                        "SetLocked",
-                                        &error,
-                                        G_TYPE_BOOLEAN, (password_mode == 3),
-                                        G_TYPE_INVALID,
-                                        G_TYPE_INVALID)) {
+                ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                              "SetLocked",
+                                              g_variant_new ("(b)",
+                                                             password_mode == 3),
+                                              G_DBUS_CALL_FLAGS_NONE,
+                                              -1, NULL, &error);
+                if (ret == NULL) {
                         g_warning ("SetLocked call failed: %s", error->message);
                         g_error_free (error);
                 }
+                else {
+                        g_variant_unref (ret);
+                }
         }
         else {
-                if (!dbus_g_proxy_call (user->proxy,
-                                        "SetPasswordMode",
-                                        &error,
-                                        G_TYPE_INT, password_mode,
-                                        G_TYPE_INVALID,
-                                        G_TYPE_INVALID)) {
+                ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                              "SetPasswordMode",
+                                              g_variant_new ("(i)", password_mode),
+                                              G_DBUS_CALL_FLAGS_NONE,
+                                              -1, NULL, &error);
+                if (ret == NULL) {
                         g_warning ("SetPasswordMode call failed: %s", error->message);
                         g_error_free (error);
                 }
+                else {
+                        g_variant_unref (ret);
+                }
         }
 }
 
 gboolean
 um_user_is_logged_in (UmUser *user)
 {
-        DBusGProxy *proxy;
+        GDBusProxy *proxy;
         GPtrArray *array;
         GError *error;
         gint n_sessions;
+        GVariant *ret;
 
-        proxy = dbus_g_proxy_new_for_name (user->bus,
+        proxy = g_dbus_proxy_new_for_name (G_BUS_TYPE_SYSTEM,
+                                           G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+                                           G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
+                                           NULL,
                                            "org.freedesktop.ConsoleKit",
                                            "/org/freedesktop/ConsoleKit/Manager",
-                                           "org.freedesktop.ConsoleKit.Manager");
+                                           "org.freedesktop.ConsoleKit.Manager",
+                                           NULL, NULL);
 
         array = NULL;
         error = NULL;
-        if (!dbus_g_proxy_call (proxy,
-                                "GetSessionsForUnixUser",
-                                &error,
-                                G_TYPE_UINT, um_user_get_uid (user),
-                                G_TYPE_INVALID,
-                                dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &array,
-                                G_TYPE_INVALID)) {
+        ret = g_dbus_proxy_call_sync (proxy,
+                                      "GetSessionsForUnixUser",
+                                      g_variant_new ("(u)", um_user_get_uid (user)),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        g_object_unref (proxy);
+
+        if (ret == NULL) {
                 g_warning ("GetSessionsForUnixUser failed: %s", error->message);
                 g_error_free (error);
                 return FALSE;
         }
 
-        n_sessions = array->len;
+        n_sessions = g_variant_n_children (ret);
 
-        g_ptr_array_foreach (array, (GFunc)g_free, NULL);
-        g_ptr_array_free (array, TRUE);
-
-        g_object_unref (proxy);
+        g_variant_unref (ret);
 
         return n_sessions > 0;
 }
 
-
 void
 um_user_set_automatic_login (UmUser   *user,
                              gboolean  enabled)
 {
         GError *error = NULL;
-
-        if (!dbus_g_proxy_call (user->proxy,
-                                "SetAutomaticLogin",
-                                &error,
-                                G_TYPE_BOOLEAN, enabled,
-                                G_TYPE_INVALID,
-                                G_TYPE_INVALID)) {
+        GVariant *ret;
+
+        ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
+                                      "SetAutomaticLogin",
+                                      g_variant_new ("(b)", enabled),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      -1, NULL, &error);
+        if (ret == NULL) {
                 g_warning ("SetAutomaticLogin call failed: %s", error->message);
                 g_error_free (error);
         }
+        else {
+                g_variant_unref (ret);
+        }
 }
 
 void
 um_user_show_full_display_name (UmUser *user)
 {
-        char *uniq_name;
+        const gchar *real_name;
+        const gchar *user_name;
+        gchar *uniq_name;
 
         g_return_if_fail (UM_IS_USER (user));
 
-        if (user->props->real_name != NULL) {
-                uniq_name = g_strdup_printf ("%s (%s)",
-                                             user->props->real_name,
-                                             user->props->user_name);
+        user_name = um_user_get_user_name (user);
+        real_name = um_user_get_real_name (user);
+
+        if (real_name != NULL) {
+                uniq_name = g_strdup_printf ("%s (%s)", real_name, user_name);
         } else {
                 uniq_name = NULL;
         }
@@ -1091,3 +1308,14 @@ um_user_show_short_display_name (UmUser *user)
         }
 }
 
+const gchar *
+um_user_get_display_name (UmUser *user)
+{
+        g_return_val_if_fail (UM_IS_USER (user), NULL);
+
+        if (user->display_name)
+                return user->display_name;
+
+        return um_user_get_real_name (user);
+}
+
diff --git a/src/um-user.h b/src/um-user.h
index 43a88b0..b7383ad 100644
--- a/src/um-user.h
+++ b/src/um-user.h
@@ -18,15 +18,11 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/*
- * Facade object for user data, owned by UmUserManager
- */
-
 #ifndef __UM_USER__
 #define __UM_USER__
 
 #include <sys/types.h>
-#include <gtk/gtk.h>
+#include <gio/gio.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
 #include "um-account-type.h"



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