Gadu-Gadu: status refactoring - own status soc.2012.gg

Wed, 08 Aug 2012 10:02:43 +0200

author
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
date
Wed, 08 Aug 2012 10:02:43 +0200
branch
soc.2012.gg
changeset 33336
7c97b5dd3bf4
parent 33335
a6356adbe365
child 33337
458d578d553d

Gadu-Gadu: status refactoring - own status

libpurple/protocols/gg/Makefile.am file | annotate | diff | comparison | revisions
libpurple/protocols/gg/gg.c file | annotate | diff | comparison | revisions
libpurple/protocols/gg/gg.h file | annotate | diff | comparison | revisions
libpurple/protocols/gg/status.c file | annotate | diff | comparison | revisions
libpurple/protocols/gg/status.h file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/gg/Makefile.am	Tue Aug 07 20:23:59 2012 +0200
+++ b/libpurple/protocols/gg/Makefile.am	Wed Aug 08 10:02:43 2012 +0200
@@ -84,6 +84,8 @@
 	xml.h \
 	multilogon.c \
 	multilogon.h \
+	status.c \
+	status.h \
 	oauth/oauth.c \
 	oauth/oauth.h \
 	oauth/oauth-parameter.c \
--- a/libpurple/protocols/gg/gg.c	Tue Aug 07 20:23:59 2012 +0200
+++ b/libpurple/protocols/gg/gg.c	Wed Aug 08 10:02:43 2012 +0200
@@ -26,12 +26,11 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
-#include "internal.h"
+#include <internal.h>
 
 #include "plugin.h"
 #include "version.h"
 #include "notify.h"
-#include "status.h"
 #include "blist.h"
 #include "accountopt.h"
 #include "debug.h"
@@ -50,11 +49,9 @@
 #include "purplew.h"
 #include "libgadu-events.h"
 #include "multilogon.h"
+#include "status.h"
 
 /* Prototypes */
-static int ggp_to_gg_status(PurpleStatus *status, char **msg);
-static void ggp_set_purplestatus(PurpleAccount *account, PurpleStatus *status);
-static gboolean ggp_set_status(PurpleAccount *account, int status, const gchar* msg);
 
 typedef struct
 {
@@ -290,58 +287,6 @@
 		gc);
 }
 
-/* ----- CHANGE STATUS BROADCASTING ------------------------------------------------ */
-
-static void ggp_action_change_status_broadcasting_ok(PurpleConnection *gc, PurpleRequestFields *fields)
-{
-	GGPInfo *info = purple_connection_get_protocol_data(gc);
-	int selected_field;
-	PurpleAccount *account = purple_connection_get_account(gc);
-
-	selected_field = purple_request_fields_get_choice(fields, "status_broadcasting");
-	
-	if (selected_field == 0)
-		info->status_broadcasting = TRUE;
-	else
-		info->status_broadcasting = FALSE;
-	
-	ggp_set_purplestatus(account, purple_account_get_active_status(account));
-}
-
-static void ggp_action_change_status_broadcasting(PurplePluginAction *action)
-{
-	PurpleConnection *gc = (PurpleConnection *)action->context;
-	GGPInfo *info = purple_connection_get_protocol_data(gc);
-	
-	PurpleRequestFields *fields;
-	PurpleRequestFieldGroup *group;
-	PurpleRequestField *field;
-
-	fields = purple_request_fields_new();
-	group = purple_request_field_group_new(NULL);
-	purple_request_fields_add_group(fields, group);
-	
-	field = purple_request_field_choice_new("status_broadcasting", _("Show status to:"), 0);
-	purple_request_field_choice_add(field, _("All people"));
-	purple_request_field_choice_add(field, _("Only buddies"));
-	purple_request_field_group_add_field(group, field);
-
-	if (info->status_broadcasting)
-		purple_request_field_choice_set_default_value(field, 0);
-	else
-		purple_request_field_choice_set_default_value(field, 1);
-
-	purple_request_fields(gc,
-		_("Change status broadcasting"),
-		_("Change status broadcasting"),
-		_("Please, select who can see your status"),
-		fields,
-		_("OK"), G_CALLBACK(ggp_action_change_status_broadcasting_ok),
-		_("Cancel"), NULL,
-		purple_connection_get_account(gc), NULL, NULL,
-		gc);
-}
-
 /* ----- CONFERENCES ---------------------------------------------------- */
 
 static void ggp_callback_add_to_chat_ok(PurpleBuddy *buddy, PurpleRequestFields *fields)
@@ -1519,8 +1464,6 @@
 static void ggp_login(PurpleAccount *account)
 {
 	PurpleConnection *gc = purple_account_get_connection(account);
-	PurplePresence *presence;
-	PurpleStatus *status;
 	struct gg_login_params *glp;
 	GGPInfo *info;
 	const char *address;
@@ -1537,14 +1480,15 @@
 	info->chats = NULL;
 	info->chats_count = 0;
 	info->searches = ggp_search_new();
-	info->status_broadcasting = purple_account_get_bool(account, "status_broadcasting", TRUE);
 	
 	purple_connection_set_protocol_data(gc, info);
 
+
 	ggp_image_setup(gc);
 	ggp_avatar_setup(gc);
 	ggp_roster_setup(gc);
 	ggp_multilogon_setup(gc);
+	ggp_status_setup(gc);
 	
 	glp->uin = ggp_str_to_uin(purple_account_get_username(account));
 	glp->password = ggp_convert_to_cp1250(purple_account_get_password(account));
@@ -1563,17 +1507,12 @@
 	if (purple_account_get_bool(account, "show_links_from_strangers", 1))
 		glp->status_flags |= GG_STATUS_FLAG_SPAM;
 
-	presence = purple_account_get_presence(account);
-	status = purple_presence_get_active_status(presence);
-
 	glp->encoding = GG_ENCODING_UTF8;
 	glp->protocol_features = (GG_FEATURE_DND_FFC |
 		GG_FEATURE_TYPING_NOTIFICATION | GG_FEATURE_MULTILOGON |
 		GG_FEATURE_USER_DATA);
 
 	glp->async = 1;
-	glp->status = ggp_to_gg_status(status, &glp->status_descr);
-	info->old_status = g_strdup(glp->status_descr);
 	
 	encryption_type = purple_account_get_string(account, "encryption",
 		"opportunistic_tls");
@@ -1596,8 +1535,7 @@
 		glp->tls = GG_SSL_DISABLED;
 	purple_debug_info("gg", "TLS mode: %d\n", glp->tls);
 
-	if (!info->status_broadcasting)
-		glp->status = glp->status|GG_STATUS_FRIENDS_MASK;
+	ggp_status_set_initial(gc, glp);
 	
 	address = purple_account_get_string(account, "gg_server", "");
 	if (address && *address)
@@ -1649,7 +1587,7 @@
 		{
 			const gchar *status_msg = purple_status_get_attr_string(status, "message");
 			
-			if (ggp_set_status(account,
+			if (ggp_status_set(account,
 				status_msg ? GG_STATUS_NOT_AVAIL_DESCR : GG_STATUS_NOT_AVAIL,
 				status_msg))
 			{
@@ -1671,8 +1609,6 @@
 			gg_free_session(info->session);
 		}
 
-		purple_account_set_bool(account, "status_broadcasting", info->status_broadcasting);
-
 		/* Immediately close any notifications on this handle since that process depends
 		 * upon the contents of info->searches, which we are about to destroy.
 		 */
@@ -1683,8 +1619,8 @@
 		ggp_avatar_cleanup(gc);
 		ggp_roster_cleanup(gc);
 		ggp_multilogon_cleanup(gc);
+		ggp_status_cleanup(gc);
 
-		g_free(info->old_status);
 		if (info->inpa > 0)
 			purple_input_remove(info->inpa);
 
@@ -1858,98 +1794,6 @@
 	purple_debug_info("gg", "ggp_get_info(): Added seq %u", seq);
 }
 
-static int ggp_to_gg_status(PurpleStatus *status, char **msg)
-{
-	const char *status_id = purple_status_get_id(status);
-	int new_status, new_status_descr;
-	const char *new_msg;
-
-	g_return_val_if_fail(msg != NULL, 0);
-
-	purple_debug_info("gg", "ggp_to_gg_status: Requested status = %s\n",
-			status_id);
-
-	if (strcmp(status_id, "available") == 0) {
-		new_status = GG_STATUS_AVAIL;
-		new_status_descr = GG_STATUS_AVAIL_DESCR;
-	} else if (strcmp(status_id, "freeforchat") == 0) {
-		new_status = GG_STATUS_FFC;
-		new_status_descr = GG_STATUS_FFC_DESCR;
-	} else if (strcmp(status_id, "away") == 0) {
-		new_status = GG_STATUS_BUSY;
-		new_status_descr = GG_STATUS_BUSY_DESCR;
-	} else if (strcmp(status_id, "unavailable") == 0) {
-		new_status = GG_STATUS_DND;
-		new_status_descr = GG_STATUS_DND_DESCR;
-	} else if (strcmp(status_id, "invisible") == 0) {
-		new_status = GG_STATUS_INVISIBLE;
-		new_status_descr = GG_STATUS_INVISIBLE_DESCR;
-	} else if (strcmp(status_id, "offline") == 0) {
-		new_status = GG_STATUS_NOT_AVAIL;
-		new_status_descr = GG_STATUS_NOT_AVAIL_DESCR;
-	} else {
-		new_status = GG_STATUS_AVAIL;
-		new_status_descr = GG_STATUS_AVAIL_DESCR;
-		purple_debug_info("gg",
-			"ggp_set_status: unknown status requested (status_id=%s)\n",
-			status_id);
-	}
-
-	new_msg = purple_status_get_attr_string(status, "message");
-
-	if(new_msg) {
-		*msg = purple_markup_strip_html(new_msg);
-		return new_status_descr;
-	} else {
-		*msg = NULL;
-		return new_status;
-	}
-}
-
-static void ggp_set_purplestatus(PurpleAccount *account, PurpleStatus *status)
-{
-	int new_status;
-	gchar *new_msg = NULL;
-	
-	if (!purple_status_is_active(status))
-		return;
-
-	new_status = ggp_to_gg_status(status, &new_msg);
-	
-	ggp_set_status(account, new_status, new_msg);
-	g_free(new_msg);
-}
-
-static gboolean ggp_set_status(PurpleAccount *account, int status, const gchar* msg)
-{
-	PurpleConnection *gc;
-	GGPInfo *info;
-	gboolean new_msg_differs;
-
-	gc = purple_account_get_connection(account);
-	info = purple_connection_get_protocol_data(gc);
-
-	if (!info->status_broadcasting)
-		status = status|GG_STATUS_FRIENDS_MASK;
-	
-	new_msg_differs = (0 != g_strcmp0(info->old_status, msg));
-	g_free(info->old_status);
-	info->old_status = g_strdup(msg);
-	if (!new_msg_differs && (status == GG_STATUS_NOT_AVAIL || status == GG_STATUS_NOT_AVAIL_DESCR))
-	{
-		purple_debug_info("gg", "ggp_set_status: new status doesn't differ when closing connection - ignore\n");
-		return FALSE;
-	}
-	
-	if (msg == NULL) {
-		gg_change_status(info->session, status);
-	} else {
-		gg_change_status_descr(info->session, status, msg);
-	}
-	
-	return TRUE;
-}
-
 static void ggp_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group, const char *message)
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
@@ -2103,6 +1947,11 @@
 	ggp_account_chpass((PurpleConnection *)action->context);
 }
 
+static void ggp_action_status_broadcasting(PurplePluginAction *action)
+{
+	ggp_status_broadcasting_dialog((PurpleConnection *)action->context);
+}
+
 static GList *ggp_actions(PurplePlugin *plugin, gpointer context)
 {
 	GList *m = NULL;
@@ -2116,8 +1965,8 @@
 				     ggp_find_buddies);
 	m = g_list_append(m, act);
 
-	act = purple_plugin_action_new(_("Change status broadcasting"),
-				     ggp_action_change_status_broadcasting);
+	act = purple_plugin_action_new(_("Show status only for buddies"),
+		ggp_action_status_broadcasting);
 	m = g_list_append(m, act);
 
 	m = g_list_append(m, NULL);
@@ -2192,7 +2041,7 @@
 	NULL,				/* set_info */
 	ggp_send_typing,		/* send_typing */
 	ggp_get_info,			/* get_info */
-	ggp_set_purplestatus,		/* set_away */
+	ggp_status_set_purplestatus,	/* set_away */
 	NULL,				/* set_idle */
 	NULL,				/* change_passwd */
 	ggp_add_buddy,			/* add_buddy */
--- a/libpurple/protocols/gg/gg.h	Tue Aug 07 20:23:59 2012 +0200
+++ b/libpurple/protocols/gg/gg.h	Wed Aug 08 10:02:43 2012 +0200
@@ -34,6 +34,7 @@
 #include "account.h"
 #include "roster.h"
 #include "multilogon.h"
+#include "status.h"
 
 #define PUBDIR_RESULTS_MAX 20
 
@@ -54,13 +55,12 @@
 	GList *chats;
 	GGPSearches *searches;
 	int chats_count;
-	gboolean status_broadcasting; //When TRUE status is visible to all, when FALSE status is visible only to friends.
-	gchar *old_status;
 
 	ggp_image_connection_data image_data;
 	ggp_avatar_session_data avatar_data;
 	ggp_roster_session_data roster_data;
 	ggp_multilogon_session_data *multilogon_data;
+	ggp_status_session_data *status_data;
 } GGPInfo;
 
 void ggp_recv_message_handler(PurpleConnection *gc, const struct gg_event_msg *ev, gboolean multilogon);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/gg/status.c	Wed Aug 08 10:02:43 2012 +0200
@@ -0,0 +1,186 @@
+#include "status.h"
+
+#include <libgadu.h>
+#include <debug.h>
+#include <request.h>
+
+#include "gg.h"
+
+struct _ggp_status_session_data
+{
+	gboolean status_broadcasting;
+	gchar *current_description;
+};
+
+static inline ggp_status_session_data *
+ggp_status_get_ssdata(PurpleConnection *gc);
+
+static int ggp_status_from_purplestatus(PurpleStatus *status, gchar **message);
+
+static void ggp_status_broadcasting_dialog_ok(PurpleConnection *gc,
+	PurpleRequestFields *fields);
+
+////
+
+static inline ggp_status_session_data *
+ggp_status_get_ssdata(PurpleConnection *gc)
+{
+	GGPInfo *accdata = purple_connection_get_protocol_data(gc);
+	return accdata->status_data;
+}
+
+void ggp_status_setup(PurpleConnection *gc)
+{
+	GGPInfo *accdata = purple_connection_get_protocol_data(gc);
+	PurpleAccount *account = purple_connection_get_account(gc);
+
+	ggp_status_session_data *ssdata = g_new0(ggp_status_session_data, 1);
+	accdata->status_data = ssdata;
+	
+	ssdata->status_broadcasting =
+		purple_account_get_bool(account, "status_broadcasting", TRUE);
+}
+
+void ggp_status_cleanup(PurpleConnection *gc)
+{
+	ggp_status_session_data *ssdata = ggp_status_get_ssdata(gc);
+	g_free(ssdata->current_description);
+	g_free(ssdata);
+}
+
+static int ggp_status_from_purplestatus(PurpleStatus *status, gchar **message)
+{
+	const char *status_id = purple_status_get_id(status);
+	const char *status_message =
+		purple_status_get_attr_string(status, "message");
+	
+	g_return_val_if_fail(message != NULL, 0);
+	
+	*message = NULL;
+	if (status_message)
+		*message = purple_markup_strip_html(status_message);
+	
+	if (0 == strcmp(status_id, "available"))
+		return status_message ? GG_STATUS_AVAIL_DESCR : GG_STATUS_AVAIL;
+	if (0 == strcmp(status_id, "freeforchat"))
+		return status_message ? GG_STATUS_FFC_DESCR : GG_STATUS_FFC;
+	if (0 == strcmp(status_id, "away"))
+		return status_message ? GG_STATUS_BUSY_DESCR : GG_STATUS_BUSY;
+	if (0 == strcmp(status_id, "unavailable"))
+		return status_message ? GG_STATUS_DND_DESCR : GG_STATUS_DND;
+	if (0 == strcmp(status_id, "invisible"))
+		return status_message ?
+			GG_STATUS_INVISIBLE_DESCR : GG_STATUS_INVISIBLE;
+	if (0 == strcmp(status_id, "offline"))
+		return status_message ?
+			GG_STATUS_NOT_AVAIL_DESCR : GG_STATUS_NOT_AVAIL;
+	
+	purple_debug_error("gg", "ggp_status_from_purplestatus: "
+		"unknown status requested (%s)\n", status_id);
+	return status_message ? GG_STATUS_AVAIL_DESCR : GG_STATUS_AVAIL;
+}
+
+/*******************************************************************************
+ * Own status.
+ ******************************************************************************/
+
+void ggp_status_set_initial(PurpleConnection *gc, struct gg_login_params *glp)
+{
+	ggp_status_session_data *ssdata = ggp_status_get_ssdata(gc);
+	PurpleAccount *account = purple_connection_get_account(gc);
+	
+	glp->status = ggp_status_from_purplestatus(
+		purple_account_get_active_status(account), &glp->status_descr);
+	if (!ggp_status_get_status_broadcasting(gc))
+		glp->status |= GG_STATUS_FRIENDS_MASK;
+	ssdata->current_description = g_strdup(glp->status_descr);
+}
+
+gboolean ggp_status_set(PurpleAccount *account, int status, const gchar* msg)
+{
+	PurpleConnection *gc = purple_account_get_connection(account);
+	ggp_status_session_data *ssdata = ggp_status_get_ssdata(gc);
+	GGPInfo *accdata = purple_connection_get_protocol_data(gc);
+	
+	if (!ssdata->status_broadcasting)
+		status |= GG_STATUS_FRIENDS_MASK;
+	
+	if ((status == GG_STATUS_NOT_AVAIL ||
+		status == GG_STATUS_NOT_AVAIL_DESCR) &&
+		0 == g_strcmp0(ssdata->current_description, msg))
+	{
+		purple_debug_info("gg", "ggp_status_set: new status doesn't "
+			"differ when closing connection - ignore\n");
+		return FALSE;
+	}
+	g_free(ssdata->current_description);
+	ssdata->current_description = g_strdup(msg);
+	
+	if (msg == NULL)
+		gg_change_status(accdata->session, status);
+	else
+		gg_change_status_descr(accdata->session, status, msg);
+	
+	return TRUE;
+}
+
+void ggp_status_set_purplestatus(PurpleAccount *account, PurpleStatus *status)
+{
+	int status_gg;
+	gchar *msg = NULL;
+	
+	if (!purple_status_is_active(status))
+		return;
+	
+	status_gg = ggp_status_from_purplestatus(status, &msg);
+	ggp_status_set(account, status_gg, msg);
+	g_free(msg);
+}
+
+gboolean ggp_status_get_status_broadcasting(PurpleConnection *gc)
+{
+	return ggp_status_get_ssdata(gc)->status_broadcasting;
+}
+
+void ggp_status_set_status_broadcasting(PurpleConnection *gc,
+	gboolean broadcasting)
+{
+	PurpleAccount *account = purple_connection_get_account(gc);
+
+	ggp_status_get_ssdata(gc)->status_broadcasting = broadcasting;
+	purple_account_set_bool(account, "status_broadcasting", broadcasting);
+	ggp_status_set_purplestatus(account,
+		purple_account_get_active_status(account));
+}
+
+void ggp_status_broadcasting_dialog(PurpleConnection *gc)
+{
+	PurpleRequestFields *fields;
+	PurpleRequestFieldGroup *group;
+	PurpleRequestField *field;
+	
+	fields = purple_request_fields_new();
+	group = purple_request_field_group_new(NULL);
+	purple_request_fields_add_group(fields, group);
+	
+	field = purple_request_field_bool_new("buddies_only",
+		_("Show status only for buddies"),
+		!ggp_status_get_status_broadcasting(gc));
+	purple_request_field_group_add_field(group, field);
+	
+	purple_request_fields(gc,
+		_("Change status broadcasting"),
+		_("Please, select who can see your status"),
+		NULL,
+		fields,
+		_("OK"), G_CALLBACK(ggp_status_broadcasting_dialog_ok),
+		_("Cancel"), NULL,
+		purple_connection_get_account(gc), NULL, NULL, gc);
+}
+
+static void ggp_status_broadcasting_dialog_ok(PurpleConnection *gc,
+	PurpleRequestFields *fields)
+{
+	ggp_status_set_status_broadcasting(gc,
+		!purple_request_fields_get_bool(fields, "buddies_only"));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/gg/status.h	Wed Aug 08 10:02:43 2012 +0200
@@ -0,0 +1,24 @@
+#ifndef _GGP_STATUS_H
+#define _GGP_STATUS_H
+
+#include <internal.h>
+#include <libgadu.h>
+
+typedef struct _ggp_status_session_data ggp_status_session_data;
+
+void ggp_status_setup(PurpleConnection *gc);
+void ggp_status_cleanup(PurpleConnection *gc);
+
+// own status
+
+void ggp_status_set_initial(PurpleConnection *gc, struct gg_login_params *glp);
+
+gboolean ggp_status_set(PurpleAccount *account, int status, const gchar* msg);
+void ggp_status_set_purplestatus(PurpleAccount *account, PurpleStatus *status);
+
+gboolean ggp_status_get_status_broadcasting(PurpleConnection *gc);
+void ggp_status_set_status_broadcasting(PurpleConnection *gc,
+	gboolean broadcasting);
+void ggp_status_broadcasting_dialog(PurpleConnection *gc);
+
+#endif /* _GGP_STATUS_H */

mercurial