[accounts-dialog/gdbus: 3/5] Convert UmUser to a GDBusProxy subclass
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [accounts-dialog/gdbus: 3/5] Convert UmUser to a GDBusProxy subclass
- Date: Fri, 23 Jul 2010 01:05:45 +0000 (UTC)
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]