Description: Addition of FormatsLocale property and SetFormatsLocale method. Author: Gunnar Hjalmarsson Last-Update: 2011-11-12 --- accountsservice.orig/data/org.freedesktop.Accounts.User.xml 2011-10-17 21:56:32 +0200 +++ accountsservice/data/org.freedesktop.Accounts.User.xml 2011-11-11 19:59:17 +0100 @@ -150,6 +150,41 @@ + + + + + + The new regional formats, as a locale specification like "de_DE.UTF-8". + + + + + + + Sets the users regional formats. + + + + The caller needs one of the following PolicyKit authorizations: + + + org.freedesktop.accounts.change-own-user-data + To change his own language + + + org.freedesktop.accounts.user-administration + To change the language of another user + + + + + if the caller lacks the appropriate PolicyKit authorization + if the operation failed + + + + @@ -621,6 +656,16 @@ + + + + + + + The users regional formats, as a locale specification like "de_DE.UTF-8". + + + --- accountsservice.orig/src/libaccountsservice/act-user.c 2011-10-17 21:56:32 +0200 +++ accountsservice/src/libaccountsservice/act-user.c 2011-11-11 19:59:45 +0100 @@ -59,6 +59,7 @@ PROP_LOGIN_FREQUENCY, PROP_ICON_FILE, PROP_LANGUAGE, + PROP_FORMATS_LOCALE, PROP_X_SESSION, PROP_IS_LOADED }; @@ -88,6 +89,7 @@ char *location; char *icon_file; char *language; + char *formats_locale; char *x_session; GList *sessions; int login_frequency; @@ -237,6 +239,9 @@ case PROP_LANGUAGE: g_value_set_string (value, user->language); break; + case PROP_FORMATS_LOCALE: + g_value_set_string (value, user->formats_locale); + break; case PROP_X_SESSION: g_value_set_string (value, user->x_session); break; @@ -371,6 +376,13 @@ NULL, G_PARAM_READABLE)); g_object_class_install_property (gobject_class, + PROP_FORMATS_LOCALE, + g_param_spec_string ("formats_locale", + "Regional Formats", + "User's regional formats.", + NULL, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, PROP_X_SESSION, g_param_spec_string ("x-session", "X session", @@ -461,6 +473,7 @@ g_free (user->email); g_free (user->location); g_free (user->language); + g_free (user->formats_locale); if (user->accounts_proxy != NULL) { g_object_unref (user->accounts_proxy); @@ -834,6 +847,22 @@ } /** + * act_user_get_formats_locale: + * @user: a #ActUser + * + * Returns the path to the configured formats locale of @user. + * + * Returns: (transfer none): a path to an icon + */ +const char * +act_user_get_formats_locale (ActUser *user) +{ + g_return_val_if_fail (ACT_IS_USER (user), NULL); + + return user->formats_locale; +} + +/** * act_user_get_x_session: * @user: a #ActUser * @@ -1033,6 +1062,17 @@ user->language = g_value_dup_string (value); g_object_notify (G_OBJECT (user), "language"); } + + } else if (strcmp (key, "FormatsLocale") == 0) { + const char *new_formats_locale; + + new_formats_locale = g_value_get_string (value); + if (g_strcmp0 (user->formats_locale, new_formats_locale) != 0) { + g_free (user->formats_locale); + user->formats_locale = g_value_dup_string (value); + g_object_notify (G_OBJECT (user), "formats_locale"); + } + } else if (strcmp (key, "XSession") == 0) { const char *new_x_session; @@ -1255,6 +1295,37 @@ g_error_free (error); return; } +} + +/** + * act_user_set_formats_locale: + * @user: the user object to alter. + * @formats_locale: a locale (e.g. en_US.utf8) + * + * Assigns a new formats locale for @user. + * + * Note this function is synchronous and ignores errors. + **/ +void +act_user_set_formats_locale (ActUser *user, + const char *formats_locale) +{ + GError *error = NULL; + + g_return_if_fail (ACT_IS_USER (user)); + g_return_if_fail (formats_locale != NULL); + g_return_if_fail (DBUS_IS_G_PROXY (user->accounts_proxy)); + + if (!dbus_g_proxy_call (user->accounts_proxy, + "SetFormatsLocale", + &error, + G_TYPE_STRING, formats_locale, + G_TYPE_INVALID, + G_TYPE_INVALID)) { + g_warning ("SetFormatsLocale call failed: %s", error->message); + g_error_free (error); + return; + } } /** --- accountsservice.orig/src/libaccountsservice/act-user.h 2011-10-17 21:56:32 +0200 +++ accountsservice/src/libaccountsservice/act-user.h 2011-11-11 20:00:15 +0100 @@ -71,6 +71,7 @@ gboolean act_user_is_system_account (ActUser *user); const char *act_user_get_icon_file (ActUser *user); const char *act_user_get_language (ActUser *user); +const char *act_user_get_formats_locale (ActUser *user); const char *act_user_get_x_session (ActUser *user); const char *act_user_get_primary_session_id (ActUser *user); @@ -82,6 +83,8 @@ const char *email); void act_user_set_language (ActUser *user, const char *language); +void act_user_set_formats_locale (ActUser *user, + const char *formats_locale); void act_user_set_x_session (ActUser *user, const char *x_session); void act_user_set_location (ActUser *user, --- accountsservice.orig/src/user.c 2011-11-11 19:56:47 +0100 +++ accountsservice/src/user.c 2011-11-11 19:57:36 +0100 @@ -60,6 +60,7 @@ PROP_ACCOUNT_TYPE, PROP_EMAIL, PROP_LANGUAGE, + PROP_FORMATS_LOCALE, PROP_X_SESSION, PROP_LOCATION, PROP_PASSWORD_MODE, @@ -97,6 +98,7 @@ gchar *shell; gchar *email; gchar *language; + gchar *formats_locale; gchar *x_session; gchar *location; guint64 login_frequency; @@ -130,6 +132,9 @@ case PROP_LANGUAGE: user->language = g_value_dup_string (value); break; + case PROP_FORMATS_LOCALE: + user->formats_locale = g_value_dup_string (value); + break; case PROP_X_SESSION: user->x_session = g_value_dup_string (value); break; @@ -190,6 +195,9 @@ case PROP_LANGUAGE: g_value_set_string (value, user->language); break; + case PROP_FORMATS_LOCALE: + g_value_set_string (value, user->formats_locale); + break; case PROP_X_SESSION: g_value_set_string (value, user->x_session); break; @@ -326,6 +334,13 @@ NULL, G_PARAM_READABLE)); g_object_class_install_property (gobject_class, + PROP_FORMATS_LOCALE, + g_param_spec_string ("formats_locale", + "Regional Formats", + "The regional formats for this user.", + NULL, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, PROP_X_SESSION, g_param_spec_string ("x-session", "X Session", @@ -395,6 +410,7 @@ user->icon_file = NULL; user->email = NULL; user->language = NULL; + user->formats_locale = NULL; user->x_session = NULL; user->location = NULL; user->password_mode = PASSWORD_MODE_REGULAR; @@ -419,6 +435,7 @@ g_free (user->icon_file); g_free (user->email); g_free (user->language); + g_free (user->formats_locale); g_free (user->x_session); g_free (user->location); g_free (user->password_hint); @@ -624,6 +641,12 @@ user->language = s; } + s = g_key_file_get_string (keyfile, "User", "FormatsLocale", NULL); + if (s != NULL) { + g_free (user->formats_locale); + user->formats_locale = s; + } + s = g_key_file_get_string (keyfile, "User", "XSession", NULL); if (s != NULL) { g_free (user->x_session); @@ -667,6 +690,9 @@ if (user->language) g_key_file_set_string (keyfile, "User", "Language", user->language); + if (user->formats_locale) + g_key_file_set_string (keyfile, "User", "FormatsLocale", user->formats_locale); + if (user->x_session) g_key_file_set_string (keyfile, "User", "XSession", user->x_session); @@ -1112,6 +1138,68 @@ return TRUE; } + +static void +user_change_formats_locale_authorized_cb (Daemon *daemon, + User *user, + DBusGMethodInvocation *context, + gpointer data) + +{ + gchar *formats_locale = data; + + if (g_strcmp0 (user->formats_locale, formats_locale) != 0) { + g_free (user->formats_locale); + user->formats_locale = g_strdup (formats_locale); + + save_extra_data (user); + + g_signal_emit (user, signals[CHANGED], 0); + + g_object_notify (G_OBJECT (user), "formats_locale"); + } + + dbus_g_method_return (context); +} + +gboolean +user_set_formats_locale (User *user, + const gchar *formats_locale, + DBusGMethodInvocation *context) +{ + gchar *sender; + DBusConnection *connection; + DBusError dbus_error; + uid_t uid; + const gchar *action_id; + + connection = dbus_g_connection_get_connection (user->system_bus_connection); + sender = dbus_g_method_get_sender (context); + dbus_error_init (&dbus_error); + uid = dbus_bus_get_unix_user (connection, sender, &dbus_error); + if (dbus_error_is_set (&dbus_error)) { + throw_error (context, ERROR_FAILED, dbus_error.message); + dbus_error_free (&dbus_error); + + return TRUE; + } + + if (user->uid == uid) + action_id = "org.freedesktop.accounts.change-own-user-data"; + else + action_id = "org.freedesktop.accounts.user-administration"; + + daemon_local_check_auth (user->daemon, + user, + action_id, + TRUE, + user_change_formats_locale_authorized_cb, + context, + g_strdup (formats_locale), + (GDestroyNotify) g_free); + + return TRUE; +} static void user_change_x_session_authorized_cb (Daemon *daemon, --- accountsservice.orig/src/user.h 2011-10-17 21:56:32 +0200 +++ accountsservice/src/user.h 2011-11-11 20:12:03 +0100 @@ -80,6 +80,9 @@ gboolean user_set_language (User *user, const gchar *language, DBusGMethodInvocation *context); +gboolean user_set_formats_locale (User *user, + const gchar *formats_locale, + DBusGMethodInvocation *context); gboolean user_set_x_session (User *user, const gchar *x_session, DBusGMethodInvocation *context);