changeset 30177:f06142075dca

merge of '5fe1e44e0d84dfc0304df6902508315695625f42' and '8a990059c6b5604893eecc0949bd50938715ef58'
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Tue, 20 Apr 2010 03:40:44 +0000
parents 57a482217ee1 (diff) 50729e095c3c (current diff)
children 29502959f74a
files
diffstat 12 files changed, 81 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog.API	Tue Apr 20 02:31:42 2010 +0000
+++ b/ChangeLog.API	Tue Apr 20 03:40:44 2010 +0000
@@ -42,6 +42,7 @@
 		* purple_certificates_import for importing multiple
 		  certificates from a single file (and corresponding
 		  import_certificates member of PurpleCertificateScheme struct)
+		* autojoin connection signal 
 
 	Pidgin:
 		Added:
@@ -59,7 +60,7 @@
 		  purple_xfer_request_denied if an error is found when selecting
 		  a file to send. Request denied is still used when a receive
 		  request is not allowed.
-		* xmlnode_from_str now properly handles paring an attribute which
+		* xmlnode_from_str now properly handles parsing an attribute which
 		  contain "&lt;br&gt;", which were previously transformed into a
 		  newline character (libxml2 unescapes all entities except
 		  representations of '&', and libpurple's purple_unescape_html
--- a/configure.ac	Tue Apr 20 02:31:42 2010 +0000
+++ b/configure.ac	Tue Apr 20 03:40:44 2010 +0000
@@ -1797,13 +1797,13 @@
 AC_SUBST(GNUTLS_LIBS)
 
 if test "x$enable_gnutls" = "xyes"; then
-	AC_MSG_CHECKING(for gnutls_priority_set_direct)
+	AC_MSG_CHECKING(for gnutls_priority_set_direct and gnutls_priority_set)
 	LIBS_save="$LIBS"
 	LIBS="$LIBS $GNUTLS_LIBS"
 	CPPFLAGS_save="$CPPFLAGS"
 	CPPFLAGS="$CPPFLAGS $GNUTLS_CFLAGS"
 	AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <gnutls/gnutls.h>]],
-                                        [[gnutls_session s; gnutls_priority_set_direct(s, NULL, NULL);]])],
+                                        [[gnutls_session s; gnutls_priority_set_direct(s, NULL, NULL); gnutls_priority_set(s, NULL);]])],
 	               [AC_DEFINE([HAVE_GNUTLS_PRIORITY_FUNCS], 1,
                                   [Define if your gnutls has gnutls_priority_set_direct and friends])
 	                AC_MSG_RESULT(yes)],
--- a/doc/gtkimhtml-signals.dox	Tue Apr 20 02:31:42 2010 +0000
+++ b/doc/gtkimhtml-signals.dox	Tue Apr 20 03:40:44 2010 +0000
@@ -63,7 +63,7 @@
  	@signalproto
 void (*paste) (GtkIMHtml *imhtml, char *format)
 	@endsignalproto
-	@signaldef Emitted when paste from the clipboard is requested.
+	@signaldesc Emitted when paste from the clipboard is requested.
 	@param imhtml  The GtkIMHtml emitting the signal.
 	@param format  If 'text', then the formatting of the clipboard content
 	               will be removed before pasting. If empty or 'html', then
--- a/libpurple/account.h	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/account.h	Tue Apr 20 03:40:44 2010 +0000
@@ -418,6 +418,8 @@
  *
  * @param account      The account.
  * @param privacy_type The privacy type.
+ *
+ * @since 2.7.0
  */
 void purple_account_set_privacy_type(PurpleAccount *account, PurplePrivacyType privacy_type);
 
@@ -696,6 +698,8 @@
  * @param account   The account.
  *
  * @return The privacy type.
+ *
+ * @since 2.7.0
  */
 PurplePrivacyType purple_account_get_privacy_type(const PurpleAccount *account);
 
--- a/libpurple/protocols/jabber/auth.c	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/protocols/jabber/auth.c	Tue Apr 20 03:40:44 2010 +0000
@@ -208,6 +208,11 @@
 		}
 	}
 
+	while (mechanisms) {
+		g_free(mechanisms->data);
+		mechanisms = g_slist_delete_link(mechanisms, mechanisms);
+	}
+
 	if (js->auth_mech == NULL) {
 		/* Found no good mechanisms... */
 		purple_connection_error_reason(js->gc,
--- a/libpurple/protocols/jabber/auth_scram.c	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/protocols/jabber/auth_scram.c	Tue Apr 20 03:40:44 2010 +0000
@@ -301,11 +301,17 @@
 #endif
 
 		ret = jabber_scram_calc_proofs(data, salt, iterations);
-		if (!ret)
+
+		g_string_free(salt, TRUE);
+		salt = NULL;
+		if (!ret) {
+			g_free(nonce);
 			return FALSE;
+		}
 
 		proof = purple_base64_encode((guchar *)data->client_proof->str, data->client_proof->len);
 		*out = g_strdup_printf("c=%s,r=%s,p=%s", "biws", nonce, proof);
+		g_free(nonce);
 		g_free(proof);
 	} else if (data->step == 2) {
 		gchar *server_sig, *enc_server_sig;
@@ -419,7 +425,7 @@
 {
 	JabberScramData *data = js->auth_mech_data;
 	xmlnode *reply;
-	gchar *enc_in, *dec_in;
+	gchar *enc_in, *dec_in = NULL;
 	gchar *enc_out = NULL, *dec_out = NULL;
 	gsize len;
 	JabberSaslState state = JABBER_SASL_STATE_FAIL;
@@ -434,7 +440,6 @@
 	}
 
 	dec_in = (gchar *)purple_base64_decode(enc_in, &len);
-	g_free(enc_in);
 	if (!dec_in || len != strlen(dec_in)) {
 		/* Danger afoot; SCRAM shouldn't contain NUL bytes */
 		reply = xmlnode_new("abort");
@@ -468,6 +473,8 @@
 	state = JABBER_SASL_STATE_CONTINUE;
 
 out:
+	g_free(enc_in);
+	g_free(dec_in);
 	g_free(enc_out);
 	g_free(dec_out);
 
@@ -506,11 +513,13 @@
 	purple_debug_misc("jabber", "decoded success: %s\n", dec_in);
 
 	if (!jabber_scram_feed_parser(data, dec_in, &dec_out) || dec_out != NULL) {
+		g_free(dec_in);
 		g_free(dec_out);
 		*error = g_strdup(_("Invalid challenge from server"));
 		return JABBER_SASL_STATE_FAIL;
 	}
 
+	g_free(dec_in);
 	/* Hooray */
 	return JABBER_SASL_STATE_OK;
 }
--- a/libpurple/protocols/jabber/jabber.c	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Tue Apr 20 03:40:44 2010 +0000
@@ -842,6 +842,7 @@
 		purple_connection_error_reason(gc,
 			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
 			_("Invalid XMPP ID"));
+		g_free(user);
 		/* Destroying the connection will free the JabberStream */
 		return NULL;
 	}
@@ -850,6 +851,7 @@
 		purple_connection_error_reason(gc,
 			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
 			_("Invalid XMPP ID. Username portion must be set."));
+		g_free(user);
 		/* Destroying the connection will free the JabberStream */
 		return NULL;
 	}
@@ -858,6 +860,7 @@
 		purple_connection_error_reason(gc,
 			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
 			_("Invalid XMPP ID. Domain must be set."));
+		g_free(user);
 		/* Destroying the connection will free the JabberStream */
 		return NULL;
 	}
@@ -3684,6 +3687,11 @@
 	jabber_presence_uninit();
 	jabber_iq_uninit();
 
+#ifdef USE_VV
+	g_signal_handlers_disconnect_by_func(G_OBJECT(purple_media_manager_get()),
+			G_CALLBACK(jabber_caps_broadcast_change), NULL);
+#endif
+
 	jabber_auth_uninit();
 	jabber_features_destroy();
 	jabber_identities_destroy();
--- a/libpurple/protocols/jabber/presence.c	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/protocols/jabber/presence.c	Tue Apr 20 03:40:44 2010 +0000
@@ -823,6 +823,7 @@
 		if (presence->jb != js->user_jb) {
 			purple_debug_warning("jabber", "Got presence for unknown buddy %s on account %s (%p)\n",
 					buddy_name, purple_account_get_username(account), account);
+			g_free(buddy_name);
 			return FALSE;
 		} else {
 			/* this is a different resource of our own account. Resume even when this account isn't on our blist */
--- a/libpurple/protocols/msn/msn.c	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/protocols/msn/msn.c	Tue Apr 20 03:40:44 2010 +0000
@@ -589,6 +589,14 @@
 {
 	MsnSlpLink *slplink = xfer->data;
 	msn_slplink_request_ft(slplink, xfer);
+	msn_slplink_unref(slplink);
+}
+
+static void
+t_msn_xfer_cancel_send(PurpleXfer *xfer)
+{
+	MsnSlpLink *slplink = xfer->data;
+	msn_slplink_unref(slplink);
 }
 
 static PurpleXfer*
@@ -603,9 +611,10 @@
 
 	g_return_val_if_fail(xfer != NULL, NULL);
 
-	xfer->data = msn_session_get_slplink(session, who);
+	xfer->data = msn_slplink_ref(msn_session_get_slplink(session, who));
 
 	purple_xfer_set_init_fnc(xfer, t_msn_xfer_init);
+	purple_xfer_set_cancel_send_fnc(xfer, t_msn_xfer_cancel_send);
 
 	return xfer;
 }
--- a/libpurple/protocols/msn/notification.c	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/protocols/msn/notification.c	Tue Apr 20 03:40:44 2010 +0000
@@ -983,19 +983,12 @@
 static void
 fln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
-	MsnSlpLink *slplink;
 	MsnUser *user;
 
 	/* Tell libpurple that the user has signed off */
 	user = msn_userlist_find_user(cmdproc->session->userlist, cmd->params[0]);
 	msn_user_set_state(user, NULL);
 	msn_user_update(user);
-
-	/* If we have an open MsnSlpLink with the user then close it */
-	slplink = msn_session_find_slplink(cmdproc->session, cmd->params[0]);
-	if (slplink != NULL)
-		msn_slplink_destroy(slplink);
-
 }
 
 static void
--- a/libpurple/protocols/msn/slplink.c	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/protocols/msn/slplink.c	Tue Apr 20 03:40:44 2010 +0000
@@ -78,7 +78,7 @@
 	session->slplinks =
 		g_list_append(session->slplinks, slplink);
 
-	return slplink;
+	return msn_slplink_ref(slplink);
 }
 
 void
@@ -94,6 +94,11 @@
 	if (slplink->swboard != NULL)
 		slplink->swboard->slplinks = g_list_remove(slplink->swboard->slplinks, slplink);
 
+	if (slplink->refs > 1) {
+		slplink->refs--;
+		return;
+	}
+
 	session = slplink->session;
 
 #if 0
@@ -115,6 +120,31 @@
 }
 
 MsnSlpLink *
+msn_slplink_ref(MsnSlpLink *slplink)
+{
+	g_return_val_if_fail(slplink != NULL, NULL);
+
+	slplink->refs++;
+	if (purple_debug_is_verbose())
+		purple_debug_info("msn", "slplink ref (%p)[%d]\n", slplink, slplink->refs);
+
+	return slplink;
+}
+
+void
+msn_slplink_unref(MsnSlpLink *slplink)
+{
+	g_return_if_fail(slplink != NULL);
+
+	slplink->refs--;
+	if (purple_debug_is_verbose())
+		purple_debug_info("msn", "slplink unref (%p)[%d]\n", slplink, slplink->refs);
+
+	if (slplink->refs == 0)
+		msn_slplink_destroy(slplink);
+}
+
+MsnSlpLink *
 msn_session_find_slplink(MsnSession *session, const char *who)
 {
 	GList *l;
--- a/libpurple/protocols/msn/slplink.h	Tue Apr 20 02:31:42 2010 +0000
+++ b/libpurple/protocols/msn/slplink.h	Tue Apr 20 03:40:44 2010 +0000
@@ -43,6 +43,8 @@
 	MsnSession *session;
 	MsnSwitchBoard *swboard;
 
+	int refs;
+
 	char *remote_user;
 
 	int slp_seq_id;
@@ -55,6 +57,9 @@
 	GQueue *slp_msg_queue;
 };
 
+MsnSlpLink *msn_slplink_ref(MsnSlpLink *slplink);
+void msn_slplink_unref(MsnSlpLink *slplink);
+
 void msn_slplink_destroy(MsnSlpLink *slplink);
 
 /**