# HG changeset patch # User Elliott Sales de Andrade # Date 1271734844 0 # Node ID f06142075dca54bc044cb33f076412d4979573c2 # Parent 57a482217ee188d6ef12f6ef10bac7f084752848# Parent 50729e095c3cc3e368119adc7d8b632342691006 merge of '5fe1e44e0d84dfc0304df6902508315695625f42' and '8a990059c6b5604893eecc0949bd50938715ef58' diff -r 50729e095c3c -r f06142075dca ChangeLog.API --- 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 "<br>", which were previously transformed into a newline character (libxml2 unescapes all entities except representations of '&', and libpurple's purple_unescape_html diff -r 50729e095c3c -r f06142075dca configure.ac --- 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_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)], diff -r 50729e095c3c -r f06142075dca doc/gtkimhtml-signals.dox --- 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 diff -r 50729e095c3c -r f06142075dca libpurple/account.h --- 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); diff -r 50729e095c3c -r f06142075dca libpurple/protocols/jabber/auth.c --- 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, diff -r 50729e095c3c -r f06142075dca libpurple/protocols/jabber/auth_scram.c --- 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; } diff -r 50729e095c3c -r f06142075dca libpurple/protocols/jabber/jabber.c --- 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(); diff -r 50729e095c3c -r f06142075dca libpurple/protocols/jabber/presence.c --- 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 */ diff -r 50729e095c3c -r f06142075dca libpurple/protocols/msn/msn.c --- 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; } diff -r 50729e095c3c -r f06142075dca libpurple/protocols/msn/notification.c --- 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 diff -r 50729e095c3c -r f06142075dca libpurple/protocols/msn/slplink.c --- 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; diff -r 50729e095c3c -r f06142075dca libpurple/protocols/msn/slplink.h --- 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); /**