--- a/ChangeLog.API Thu Jun 16 00:04:47 2016 -0500
+++ b/ChangeLog.API Thu Jun 16 14:04:10 2016 -0300
@@ -9,6 +9,8 @@
built-in handling of commands.
* PurplePrefsUiOps, to allow the UI to override the way global
+ * PurpleAccountPrefsUiOps, to allow the UI to handle storage + of account preferences. * purple_media_set_encryption_parameters
* purple_media_set_decryption_parameters
--- a/libpurple/account.c Thu Jun 16 00:04:47 2016 -0500
+++ b/libpurple/account.c Thu Jun 16 14:04:10 2016 -0300
@@ -84,6 +84,7 @@
} PurpleAccountRequestInfo;
static PurpleAccountUiOps *account_ui_ops = NULL;
+static PurpleAccountPrefsUiOps *account_prefs_ui_ops = NULL; static GList *accounts = NULL;
static guint save_timer = 0;
@@ -480,6 +481,7 @@
+ PurpleAccountPrefsUiOps *ui_ops; @@ -490,6 +492,13 @@
+ ui_ops = purple_account_prefs_get_ui_ops(); + if (ui_ops != NULL && ui_ops->save != NULL) { node = accounts_to_xmlnode();
data = xmlnode_to_formatted_str(node, NULL);
purple_util_write_data_to_file("accounts.xml", data, -1);
@@ -508,6 +517,15 @@
schedule_accounts_save(void)
+ PurpleAccountPrefsUiOps *ui_ops; + ui_ops = purple_account_prefs_get_ui_ops(); + if (ui_ops != NULL && ui_ops->schedule_save != NULL) { + ui_ops->schedule_save(); save_timer = purple_timeout_add_seconds(5, save_cb, NULL);
@@ -1019,10 +1037,19 @@
+ PurpleAccountPrefsUiOps *ui_ops; + ui_ops = purple_account_prefs_get_ui_ops(); + if (ui_ops != NULL && ui_ops->load != NULL) { + _purple_buddy_icons_account_loaded_cb(); node = purple_util_read_xml_from_file("accounts.xml", _("accounts"));
@@ -2036,6 +2063,7 @@
purple_account_set_int(PurpleAccount *account, const char *name, int value)
PurpleAccountSetting *setting;
+ PurpleAccountPrefsUiOps *ui_ops; g_return_if_fail(account != NULL);
g_return_if_fail(name != NULL);
@@ -2047,6 +2075,12 @@
g_hash_table_insert(account->settings, g_strdup(name), setting);
+ ui_ops = purple_account_prefs_get_ui_ops(); + if (ui_ops != NULL && ui_ops->set_int != NULL) { + ui_ops->set_int(account, name, value); schedule_accounts_save();
@@ -2055,6 +2089,7 @@
PurpleAccountSetting *setting;
+ PurpleAccountPrefsUiOps *ui_ops; g_return_if_fail(account != NULL);
g_return_if_fail(name != NULL);
@@ -2066,6 +2101,12 @@
g_hash_table_insert(account->settings, g_strdup(name), setting);
+ ui_ops = purple_account_prefs_get_ui_ops(); + if (ui_ops != NULL && ui_ops->set_string != NULL) { + ui_ops->set_string(account, name, value); schedule_accounts_save();
@@ -2073,6 +2114,7 @@
purple_account_set_bool(PurpleAccount *account, const char *name, gboolean value)
PurpleAccountSetting *setting;
+ PurpleAccountPrefsUiOps *ui_ops; g_return_if_fail(account != NULL);
g_return_if_fail(name != NULL);
@@ -2084,6 +2126,12 @@
g_hash_table_insert(account->settings, g_strdup(name), setting);
+ ui_ops = purple_account_prefs_get_ui_ops(); + if (ui_ops != NULL && ui_ops->set_bool != NULL) { + ui_ops->set_bool(account, name, value); schedule_accounts_save();
@@ -3150,6 +3198,18 @@
+purple_account_prefs_set_ui_ops(PurpleAccountPrefsUiOps *ops) + account_prefs_ui_ops = ops; +PurpleAccountPrefsUiOps * +purple_account_prefs_get_ui_ops(void) + return account_prefs_ui_ops; purple_accounts_get_handle(void)
--- a/libpurple/account.h Thu Jun 16 00:04:47 2016 -0500
+++ b/libpurple/account.h Thu Jun 16 14:04:10 2016 -0300
@@ -32,6 +32,8 @@
/** @copydoc _PurpleAccountUiOps */
typedef struct _PurpleAccountUiOps PurpleAccountUiOps;
+/** @copydoc _PurpleAccountPrefsUiOps */ +typedef struct _PurpleAccountPrefsUiOps PurpleAccountPrefsUiOps; /** @copydoc _PurpleAccount */
typedef struct _PurpleAccount PurpleAccount;
@@ -121,6 +123,29 @@
void (*_purple_reserved4)(void);
+/** Account prefs UI operations, to allow the UI to catch account preference + * changes. Unlike the #PurplePrefsUiOps API, these are always stored + * internally in a hash table. If the UI wants to handle accounts settings, + * it must set them to the account on load and handle changes with set_ + * methods. Implementing load/save/schedule_save disables the built-in +struct _PurpleAccountPrefsUiOps + void (*set_int)(PurpleAccount *account, const char *name, int value); + void (*set_string)(PurpleAccount *account, const char *name, const char *value); + void (*set_bool)(PurpleAccount *account, const char *name, gboolean value); + void (*schedule_save)(void); + void (*_purple_reserved1)(void); + void (*_purple_reserved2)(void); + void (*_purple_reserved3)(void); + void (*_purple_reserved4)(void); /** Structure representing an account.
@@ -1160,6 +1185,20 @@
PurpleAccountUiOps *purple_accounts_get_ui_ops(void);
+ * Sets the UI operations structure to be used for account preferences. + * @param ops The UI operations structure. +void purple_account_prefs_set_ui_ops(PurpleAccountPrefsUiOps *ops); + * Returns the UI operations structure used for account preferences. + * @return The UI operations structure in use. +PurpleAccountPrefsUiOps *purple_account_prefs_get_ui_ops(void);