/pidgin/main: b34e47e69218: Merged in dequisdequis/pidgin/releas...

Gary Kramlich grim at reaperworld.com
Thu Jun 16 23:31:07 EDT 2016


Changeset: b34e47e69218de23c205b7609f446b8aed9bbfbe
Author:	 Gary Kramlich <grim at reaperworld.com>
Date:	 2016-06-16 22:30 -0500
Branch:	 release-2.x.y
URL: https://hg.pidgin.im/pidgin/main/rev/b34e47e69218

Description:

Merged in dequisdequis/pidgin/release-2.x.y (pull request #71)

Add PurplePrefsUiOps API from instantbird

diffstat:

 ChangeLog.API     |    4 +-
 libpurple/prefs.c |  384 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 libpurple/prefs.h |   82 +++++++++++
 3 files changed, 430 insertions(+), 40 deletions(-)

diffs (truncated from 835 to 300 lines):

diff --git a/ChangeLog.API b/ChangeLog.API
--- a/ChangeLog.API
+++ b/ChangeLog.API
@@ -6,7 +6,9 @@ version 2.11.0:
 		* account-status-changing signal (account signals)
 		* buddy-removed-from-group signal (blist signals)
 		* PurpleCommandsUiOps, to allow the UI to override the
-		built-in handling of commands.
+		  built-in handling of commands.
+		* PurplePrefsUiOps, to allow the UI to override the way global
+		  preferences are stored.
 
 version 2.10.12:
 	* No changes
diff --git a/libpurple/prefs.c b/libpurple/prefs.c
--- a/libpurple/prefs.c
+++ b/libpurple/prefs.c
@@ -40,11 +40,15 @@
 #include "win32dep.h"
 #endif
 
-struct pref_cb {
+static PurplePrefsUiOps *prefs_ui_ops = NULL;
+
+struct _PurplePrefCallbackData {
 	PurplePrefCallback func;
 	gpointer data;
 	guint id;
 	void *handle;
+	void *ui_data;
+	char *name;
 };
 
 /* TODO: This should use PurpleValues? */
@@ -78,6 +82,24 @@ static struct purple_pref prefs = {
 static GHashTable *prefs_hash = NULL;
 static guint       save_timer = 0;
 static gboolean    prefs_loaded = FALSE;
+static GSList     *ui_callbacks = NULL;
+
+#define PURPLE_PREFS_UI_OP_CALL(member, ...) \
+	{ \
+		PurplePrefsUiOps *uiop = purple_prefs_get_ui_ops(); \
+		if (uiop && uiop->member) { \
+			uiop->member(__VA_ARGS__); \
+			return; \
+		} \
+	}
+
+#define PURPLE_PREFS_UI_OP_CALL_RETURN(member, ...) \
+	{ \
+		PurplePrefsUiOps *uiop = purple_prefs_get_ui_ops(); \
+		if (uiop && uiop->member) { \
+			return uiop->member(__VA_ARGS__); \
+		} \
+	}
 
 
 /*********************************************************************
@@ -207,6 +229,8 @@ sync_prefs(void)
 		return;
 	}
 
+	PURPLE_PREFS_UI_OP_CALL(save);
+
 	node = prefs_to_xmlnode();
 	data = xmlnode_to_formatted_str(node, NULL);
 	purple_util_write_data_to_file("prefs.xml", data, -1);
@@ -225,6 +249,8 @@ save_cb(gpointer data)
 static void
 schedule_prefs_save(void)
 {
+	PURPLE_PREFS_UI_OP_CALL(schedule_save);
+
 	if (save_timer == 0)
 		save_timer = purple_timeout_add_seconds(5, save_cb, NULL);
 }
@@ -376,12 +402,21 @@ static GMarkupParser prefs_parser = {
 gboolean
 purple_prefs_load()
 {
-	gchar *filename = g_build_filename(purple_user_dir(), "prefs.xml", NULL);
+	gchar *filename;
 	gchar *contents = NULL;
 	gsize length;
 	GMarkupParseContext *context;
 	GError *error = NULL;
 
+	PurplePrefsUiOps *uiop = purple_prefs_get_ui_ops();
+
+	if (uiop && uiop->load) {
+		prefs_loaded = TRUE;
+		return uiop->load();
+	}
+
+	filename = g_build_filename(purple_user_dir(), "prefs.xml", NULL);
+
 	if (!filename) {
 		prefs_loaded = TRUE;
 		return FALSE;
@@ -605,13 +640,19 @@ add_pref(PurplePrefType type, const char
 void
 purple_prefs_add_none(const char *name)
 {
+	PURPLE_PREFS_UI_OP_CALL(add_none, name);
+
 	add_pref(PURPLE_PREF_NONE, name);
 }
 
 void
 purple_prefs_add_bool(const char *name, gboolean value)
 {
-	struct purple_pref *pref = add_pref(PURPLE_PREF_BOOLEAN, name);
+	struct purple_pref *pref;
+
+	PURPLE_PREFS_UI_OP_CALL(add_bool, name, value);
+
+	pref = add_pref(PURPLE_PREF_BOOLEAN, name);
 
 	if(!pref)
 		return;
@@ -622,7 +663,11 @@ purple_prefs_add_bool(const char *name, 
 void
 purple_prefs_add_int(const char *name, int value)
 {
-	struct purple_pref *pref = add_pref(PURPLE_PREF_INT, name);
+	struct purple_pref *pref;
+
+	PURPLE_PREFS_UI_OP_CALL(add_int, name, value);
+
+	pref = add_pref(PURPLE_PREF_INT, name);
 
 	if(!pref)
 		return;
@@ -640,6 +685,8 @@ purple_prefs_add_string(const char *name
 		return;
 	}
 
+	PURPLE_PREFS_UI_OP_CALL(add_string, name, value);
+
 	pref = add_pref(PURPLE_PREF_STRING, name);
 
 	if(!pref)
@@ -651,9 +698,13 @@ purple_prefs_add_string(const char *name
 void
 purple_prefs_add_string_list(const char *name, GList *value)
 {
-	struct purple_pref *pref = add_pref(PURPLE_PREF_STRING_LIST, name);
+	struct purple_pref *pref;
 	GList *tmp;
 
+	PURPLE_PREFS_UI_OP_CALL(add_string_list, name, value);
+
+	pref = add_pref(PURPLE_PREF_STRING_LIST, name);
+
 	if(!pref)
 		return;
 
@@ -670,7 +721,12 @@ purple_prefs_add_string_list(const char 
 void
 purple_prefs_add_path(const char *name, const char *value)
 {
-	struct purple_pref *pref = add_pref(PURPLE_PREF_PATH, name);
+	struct purple_pref *pref;
+
+	/* re-use the string UI OP */
+	PURPLE_PREFS_UI_OP_CALL(add_string, name, value);
+
+	pref = add_pref(PURPLE_PREF_PATH, name);
 
 	if(!pref)
 		return;
@@ -681,9 +737,14 @@ purple_prefs_add_path(const char *name, 
 void
 purple_prefs_add_path_list(const char *name, GList *value)
 {
-	struct purple_pref *pref = add_pref(PURPLE_PREF_PATH_LIST, name);
+	struct purple_pref *pref;
 	GList *tmp;
 
+	/* re-use the string list UI OP */
+	PURPLE_PREFS_UI_OP_CALL(add_string_list, name, value);
+
+	pref = add_pref(PURPLE_PREF_PATH_LIST, name);
+
 	if(!pref)
 		return;
 
@@ -740,7 +801,11 @@ remove_pref(struct purple_pref *pref)
 void
 purple_prefs_remove(const char *name)
 {
-	struct purple_pref *pref = find_pref(name);
+	struct purple_pref *pref;
+
+	PURPLE_PREFS_UI_OP_CALL(remove, name);
+
+	pref = find_pref(name);
 
 	if(!pref)
 		return;
@@ -761,16 +826,51 @@ do_callbacks(const char* name, struct pu
 	struct purple_pref *cb_pref;
 	for(cb_pref = pref; cb_pref; cb_pref = cb_pref->parent) {
 		for(cbs = cb_pref->callbacks; cbs; cbs = cbs->next) {
-			struct pref_cb *cb = cbs->data;
+			PurplePrefCallbackData *cb = cbs->data;
 			cb->func(name, pref->type, pref->value.generic, cb->data);
 		}
 	}
 }
 
+static void
+do_ui_callbacks(const char *name)
+{
+	GSList *cbs;
+
+	purple_debug_misc("prefs", "trigger callback %s\n", name);
+
+	for (cbs = ui_callbacks; cbs; cbs = cbs->next) {
+		PurplePrefCallbackData *cb = cbs->data;
+		const char *cb_name = cb->name;
+		size_t len = strlen(cb_name);
+		if (!strncmp(cb_name, name, len) &&
+		    (name[len] == 0 || name[len] == '/' ||
+		     (len && name[len - 1] == '/'))) {
+			/* This test should behave like this:
+			 * name    = /toto/tata
+			 * cb_name = /toto/tata --> true
+			 * cb_name = /toto/tatatiti --> false
+			 * cb_name = / --> true
+			 * cb_name = /toto --> true
+			 * cb_name = /toto/ --> true
+			 */
+			purple_prefs_trigger_callback_object(cbs->data);
+		}
+	}
+}
+
 void
 purple_prefs_trigger_callback(const char *name)
 {
-	struct purple_pref *pref = find_pref(name);
+	struct purple_pref *pref;
+	PurplePrefsUiOps *uiop = purple_prefs_get_ui_ops();
+
+	if (uiop && uiop->connect_callback) {
+		do_ui_callbacks(name);
+		return;
+	}
+
+	pref = find_pref(name);
 
 	if(!pref) {
 		purple_debug_error("prefs",
@@ -781,6 +881,7 @@ purple_prefs_trigger_callback(const char
 	do_callbacks(name, pref);
 }
 
+/* this function is deprecated, so it doesn't get the new UI ops */
 void
 purple_prefs_set_generic(const char *name, gpointer value)
 {
@@ -799,7 +900,11 @@ purple_prefs_set_generic(const char *nam
 void
 purple_prefs_set_bool(const char *name, gboolean value)
 {
-	struct purple_pref *pref = find_pref(name);
+	struct purple_pref *pref;
+
+	PURPLE_PREFS_UI_OP_CALL(set_bool, name, value);
+
+	pref = find_pref(name);
 
 	if(pref) {
 		if(pref->type != PURPLE_PREF_BOOLEAN) {
@@ -820,7 +925,11 @@ purple_prefs_set_bool(const char *name, 
 void
 purple_prefs_set_int(const char *name, int value)
 {
-	struct purple_pref *pref = find_pref(name);
+	struct purple_pref *pref;
+
+	PURPLE_PREFS_UI_OP_CALL(set_int, name, value);
+
+	pref = find_pref(name);
 
 	if(pref) {
 		if(pref->type != PURPLE_PREF_INT) {
@@ -841,13 +950,17 @@ purple_prefs_set_int(const char *name, i
 void
 purple_prefs_set_string(const char *name, const char *value)
 {
-	struct purple_pref *pref = find_pref(name);
+	struct purple_pref *pref;
 
 	if(value != NULL && !g_utf8_validate(value, -1, NULL)) {
 		purple_debug_error("prefs", "purple_prefs_set_string: Cannot store invalid UTF8 for string pref %s\n", name);
 		return;
 	}



More information about the Commits mailing list