# HG changeset patch # User Evan Schoenberg # Date 1216533180 0 # Node ID e53a21941d438a6e93db934b5f8ee13f9b0c1de3 # Parent 0a674616953cd2b0f0071f682a9dba9dfe50425a# Parent c3506ae277f6d9463927b20e097c4b9b2028b5f8 merge of '68d7b3372f34b6420c91d6185b81282d1c68b547' and 'a0b2c783a2e0d0d5cd83d13ee1ce1d078b174ba3' diff -r 0a674616953c -r e53a21941d43 configure.ac --- a/configure.ac Sun Jul 20 05:47:42 2008 +0000 +++ b/configure.ac Sun Jul 20 05:53:00 2008 +0000 @@ -47,7 +47,7 @@ m4_define([purple_major_version], [2]) m4_define([purple_minor_version], [5]) m4_define([purple_micro_version], [0]) -m4_define([purple_version_suffix], []) +m4_define([purple_version_suffix], [devel]) m4_define([purple_version], [purple_major_version.purple_minor_version.purple_micro_version]) m4_define([purple_display_version], purple_version[]m4_ifdef([purple_version_suffix],[purple_version_suffix])) @@ -56,7 +56,7 @@ m4_define([gnt_major_version], [2]) m4_define([gnt_minor_version], [5]) m4_define([gnt_micro_version], [0]) -m4_define([gnt_version_suffix], []) +m4_define([gnt_version_suffix], [devel]) m4_define([gnt_version], [gnt_major_version.gnt_minor_version.gnt_micro_version]) m4_define([gnt_display_version], gnt_version[]m4_ifdef([gnt_version_suffix],[gnt_version_suffix])) diff -r 0a674616953c -r e53a21941d43 libpurple/protocols/bonjour/jabber.c --- a/libpurple/protocols/bonjour/jabber.c Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/protocols/bonjour/jabber.c Sun Jul 20 05:53:00 2008 +0000 @@ -672,7 +672,6 @@ bonjour_jabber_start(BonjourJabber *jdata) { struct sockaddr_in my_addr; - int yes = 1; int i; gboolean bind_successful; @@ -686,16 +685,6 @@ return -1; } - /* Make the socket reusable */ - if (setsockopt(jdata->socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0) - { - purple_debug_error("bonjour", "Error setting socket options: %s\n", g_strerror(errno)); - purple_connection_error_reason (jdata->account->gc, - PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Error setting socket options")); - return -1; - } - memset(&my_addr, 0, sizeof(struct sockaddr_in)); my_addr.sin_family = AF_INET; @@ -709,6 +698,8 @@ bind_successful = TRUE; break; } + + purple_debug_info("bonjour", "Unable to bind to port %u.(%s)\n", jdata->port, g_strerror(errno)); jdata->port++; } diff -r 0a674616953c -r e53a21941d43 libpurple/protocols/msn/notification.c --- a/libpurple/protocols/msn/notification.c Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/protocols/msn/notification.c Sun Jul 20 05:53:00 2008 +0000 @@ -989,7 +989,8 @@ PurpleConnection *gc; MsnUserList *userlist; char *who = NULL, *text = NULL; - xmlnode *payloadNode, *from, *textNode; + const char *id = NULL; + xmlnode *payloadNode, *from, *msg, *textNode; purple_debug_misc("msn", "Incoming Page: {%s}\n", payload); @@ -1014,9 +1015,27 @@ */ + /* This is the payload if your message was too long: + + + + + + + + + + + + + + + */ + if (!(payloadNode = xmlnode_from_str(payload, len)) || !(from = xmlnode_get_child(payloadNode, "FROM")) || - !(textNode = xmlnode_get_child(payloadNode, "MSG/BODY/TEXT"))) + !(msg = xmlnode_get_child(payloadNode, "MSG")) || + !(textNode = xmlnode_get_child(msg, "BODY/TEXT"))) return; who = g_strdup(xmlnode_get_attrib(from, "name")); @@ -1026,7 +1045,7 @@ /* Match number to user's mobile number, FROM is a phone number if the other side page you using your phone number */ - if(!strncmp(who, "tel:+", 5)) { + if (!strncmp(who, "tel:+", 5)) { MsnUser *user = msn_userlist_find_user_with_mobile_phone(userlist, who + 4); @@ -1036,7 +1055,20 @@ } } - serv_got_im(gc, who, text, 0, time(NULL)); + id = xmlnode_get_attrib(msg, "id"); + + if (id && !strcmp(id, "407")) { + /* TODO: Use this to NAK the transaction, maybe print the text, too. + unsigned int trId; + id = xmlnode_get_attrib(payloadNode, "id"); + trId = atol(id); + */ + purple_conv_present_error(who, gc->account, + _("Mobile message was not sent because it was too long.")); + + } else { + serv_got_im(gc, who, text, 0, time(NULL)); + } g_free(text); g_free(who); diff -r 0a674616953c -r e53a21941d43 libpurple/protocols/msn/oim.c --- a/libpurple/protocols/msn/oim.c Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/protocols/msn/oim.c Sun Jul 20 05:53:00 2008 +0000 @@ -381,11 +381,11 @@ } else if (g_str_equal(faultcode_str, "q0:InvalidContent")) { str_reason = _("Message was not sent because an unknown " - "encoding error occured."); + "encoding error occurred."); } else { str_reason = _("Message was not sent because an unknown " - "error occured."); + "error occurred."); } msn_session_report_user(oim->session, msg->to_member, diff -r 0a674616953c -r e53a21941d43 libpurple/protocols/msn/switchboard.c --- a/libpurple/protocols/msn/switchboard.c Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/protocols/msn/switchboard.c Sun Jul 20 05:53:00 2008 +0000 @@ -978,7 +978,13 @@ account = cmdproc->session->account; user = msg->remote_user; - serv_got_attention(account->gc, user, MSN_NUDGE); + if (swboard->current_users > 1 || + ((swboard->conv != NULL) && + purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) + purple_prpl_got_attention_in_chat(account->gc, swboard->chat_id, user, MSN_NUDGE); + + else + purple_prpl_got_attention(account->gc, user, MSN_NUDGE); } else if (!strcmp(id, "2")) { /* Wink */ diff -r 0a674616953c -r e53a21941d43 libpurple/protocols/yahoo/yahoo_profile.c --- a/libpurple/protocols/yahoo/yahoo_profile.c Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_profile.c Sun Jul 20 05:53:00 2008 +0000 @@ -1282,6 +1282,10 @@ url_data = purple_util_fetch_url(url, TRUE, NULL, FALSE, yahoo_got_info, data); if (url_data != NULL) yd->url_datas = g_slist_prepend(yd->url_datas, url_data); + else { + g_free(data->name); + g_free(data); + } g_free(url); } diff -r 0a674616953c -r e53a21941d43 libpurple/prpl.c --- a/libpurple/prpl.c Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/prpl.c Sun Jul 20 05:53:00 2008 +0000 @@ -389,6 +389,110 @@ return statuses; } +void +purple_prpl_send_attention(PurpleConnection *gc, const char *who, guint type_code) +{ + PurpleAttentionType *attn; + PurpleMessageFlags flags; + PurplePlugin *prpl; + PurpleConversation *conv; + gboolean (*send_attention)(PurpleConnection *, const char *, guint); + PurpleBuddy *buddy; + const char *alias; + gchar *description; + time_t mtime; + + g_return_if_fail(gc != NULL); + g_return_if_fail(who != NULL); + + prpl = purple_find_prpl(purple_account_get_protocol_id(gc->account)); + send_attention = PURPLE_PLUGIN_PROTOCOL_INFO(prpl)->send_attention; + g_return_if_fail(send_attention != NULL); + + mtime = time(NULL); + + attn = purple_get_attention_type_from_code(gc->account, type_code); + + if ((buddy = purple_find_buddy(purple_connection_get_account(gc), who)) != NULL) + alias = purple_buddy_get_contact_alias(buddy); + else + alias = who; + + if (attn && purple_attention_type_get_outgoing_desc(attn)) { + description = g_strdup_printf(purple_attention_type_get_outgoing_desc(attn), alias); + } else { + description = g_strdup_printf(_("Requesting %s's attention..."), alias); + } + + flags = PURPLE_MESSAGE_SEND | PURPLE_MESSAGE_NOTIFY | PURPLE_MESSAGE_SYSTEM; + + purple_debug_info("server", "serv_send_attention: sending '%s' to %s\n", + description, who); + + if (!send_attention(gc, who, type_code)) + return; + + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, gc->account, who); + purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, description, flags, mtime); + + g_free(description); +} + +static void +got_attention(PurpleConnection *gc, int id, const char *who, guint type_code) +{ + PurpleMessageFlags flags; + PurpleAttentionType *attn; + PurpleBuddy *buddy; + const char *alias; + gchar *description; + time_t mtime; + + mtime = time(NULL); + + attn = purple_get_attention_type_from_code(gc->account, type_code); + + /* PURPLE_MESSAGE_NOTIFY is for attention messages. */ + flags = PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NOTIFY | PURPLE_MESSAGE_RECV; + + /* TODO: if (attn->icon_name) is non-null, use it to lookup an emoticon and display + * it next to the attention command. And if it is null, display a generic icon. */ + + if ((buddy = purple_find_buddy(purple_connection_get_account(gc), who)) != NULL) + alias = purple_buddy_get_contact_alias(buddy); + else + alias = who; + + if (attn && purple_attention_type_get_incoming_desc(attn)) { + description = g_strdup_printf(purple_attention_type_get_incoming_desc(attn), alias); + } else { + description = g_strdup_printf(_("%s has requested your attention!"), alias); + } + + purple_debug_info("server", "got_attention: got '%s' from %s\n", + description, who); + + if (id == -1) + serv_got_im(gc, who, description, flags, mtime); + else + serv_got_chat_in(gc, id, who, flags, description, mtime); + + /* TODO: sounds (depending on PurpleAttentionType), shaking, etc. */ + + g_free(description); +} + +void +purple_prpl_got_attention(PurpleConnection *gc, const char *who, guint type_code) +{ + got_attention(gc, -1, who, type_code); +} + +void +purple_prpl_got_attention_in_chat(PurpleConnection *gc, int id, const char *who, guint type_code) +{ + got_attention(gc, id, who, type_code); +} /************************************************************************** * Protocol Plugin Subsystem API diff -r 0a674616953c -r e53a21941d43 libpurple/prpl.h --- a/libpurple/prpl.h Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/prpl.h Sun Jul 20 05:53:00 2008 +0000 @@ -693,6 +693,41 @@ */ GList *purple_prpl_get_statuses(PurpleAccount *account, PurplePresence *presence); +/** Send an attention request message. + * + * @param gc The connection to send the message on. + * @param who Whose attention to request. + * @param type_code An index into the prpl's attention_types list determining the type + * of the attention request command to send. 0 if prpl only defines one + * (for example, Yahoo and MSN), but some protocols define more (MySpaceIM). + * + * Note that you can't send arbitrary PurpleAttentionType's, because there is + * only a fixed set of attention commands. + * @since 2.5.0 + */ +void purple_prpl_send_attention(PurpleConnection *gc, const char *who, guint type_code); + +/** Process an incoming attention message. + * + * @param gc The connection that received the attention message. + * @param who Who requested your attention. + * @param type_code An index into the prpl's attention_types list determining the type + * of the attention request command to send. + * @since 2.5.0 + */ +void purple_prpl_got_attention(PurpleConnection *gc, const char *who, guint type_code); + +/** Process an incoming attention message in a chat. + * + * @param gc The connection that received the attention message. + * @param id The chat id. + * @param who Who requested your attention. + * @param type_code An index into the prpl's attention_types list determining the type + * of the attention request command to send. + * @since 2.5.0 + */ +void purple_prpl_got_attention_in_chat(PurpleConnection *gc, int id, const char *who, guint type_code); + /*@}*/ /**************************************************************************/ diff -r 0a674616953c -r e53a21941d43 libpurple/server.c --- a/libpurple/server.c Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/server.c Sun Jul 20 05:53:00 2008 +0000 @@ -323,91 +323,13 @@ void serv_send_attention(PurpleConnection *gc, const char *who, guint type_code) { - PurpleAttentionType *attn; - PurpleMessageFlags flags; - PurplePlugin *prpl; - PurpleConversation *conv; - gboolean (*send_attention)(PurpleConnection *, const char *, guint); - PurpleBuddy *buddy; - const char *alias; - gchar *description; - time_t mtime; - - g_return_if_fail(gc != NULL); - g_return_if_fail(who != NULL); - - prpl = purple_find_prpl(purple_account_get_protocol_id(gc->account)); - send_attention = PURPLE_PLUGIN_PROTOCOL_INFO(prpl)->send_attention; - g_return_if_fail(send_attention != NULL); - - mtime = time(NULL); - - attn = purple_get_attention_type_from_code(gc->account, type_code); - - if ((buddy = purple_find_buddy(purple_connection_get_account(gc), who)) != NULL) - alias = purple_buddy_get_contact_alias(buddy); - else - alias = who; - - if (attn && purple_attention_type_get_outgoing_desc(attn)) { - description = g_strdup_printf(purple_attention_type_get_outgoing_desc(attn), alias); - } else { - description = g_strdup_printf(_("Requesting %s's attention..."), alias); - } - - flags = PURPLE_MESSAGE_SEND | PURPLE_MESSAGE_NOTIFY | PURPLE_MESSAGE_SYSTEM; - - purple_debug_info("server", "serv_send_attention: sending '%s' to %s\n", - description, who); - - if (!send_attention(gc, who, type_code)) - return; - - conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, gc->account, who); - purple_conv_im_write(PURPLE_CONV_IM(conv), NULL, description, flags, mtime); - - g_free(description); + purple_prpl_send_attention(gc, who, type_code); } void serv_got_attention(PurpleConnection *gc, const char *who, guint type_code) { - PurpleMessageFlags flags; - PurpleAttentionType *attn; - PurpleBuddy *buddy; - const char *alias; - gchar *description; - time_t mtime; - - mtime = time(NULL); - - attn = purple_get_attention_type_from_code(gc->account, type_code); - - /* PURPLE_MESSAGE_NOTIFY is for attention messages. */ - flags = PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NOTIFY | PURPLE_MESSAGE_RECV; - - /* TODO: if (attn->icon_name) is non-null, use it to lookup an emoticon and display - * it next to the attention command. And if it is null, display a generic icon. */ - - if ((buddy = purple_find_buddy(purple_connection_get_account(gc), who)) != NULL) - alias = purple_buddy_get_contact_alias(buddy); - else - alias = who; - - if (attn && purple_attention_type_get_incoming_desc(attn)) { - description = g_strdup_printf(purple_attention_type_get_incoming_desc(attn), alias); - } else { - description = g_strdup_printf(_("%s has requested your attention!"), alias); - } - - purple_debug_info("server", "serv_got_attention: got '%s' from %s\n", - description, who); - - serv_got_im(gc, who, description, flags, mtime); - - /* TODO: sounds (depending on PurpleAttentionType), shaking, etc. */ - - g_free(description); + purple_prpl_got_attention(gc, who, type_code); } diff -r 0a674616953c -r e53a21941d43 libpurple/server.h --- a/libpurple/server.h Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/server.h Sun Jul 20 05:53:00 2008 +0000 @@ -63,6 +63,8 @@ /** Send an attention request message. * + * @deprecated Use purple_prpl_send_attention() instead. + * * @param gc The connection to send the message on. * @param who Whose attention to request. * @param type_code An index into the prpl's attention_types list determining the type @@ -76,6 +78,8 @@ /** Process an incoming attention message. * + * @deprecated Use purple_prpl_got_attention() instead. + * * @param gc The connection that received the attention message. * @param who Who requested your attention. * @param type_code An index into the prpl's attention_types list determining the type diff -r 0a674616953c -r e53a21941d43 libpurple/win32/libc_interface.c --- a/libpurple/win32/libc_interface.c Sun Jul 20 05:47:42 2008 +0000 +++ b/libpurple/win32/libc_interface.c Sun Jul 20 05:53:00 2008 +0000 @@ -327,9 +327,12 @@ case WSAETIMEDOUT: /* 10060 */ g_snprintf(errbuf, sizeof(errbuf), _("Connection timed out.")); break; - case WSAECONNREFUSED: /*10061 */ + case WSAECONNREFUSED: /* 10061 */ g_snprintf(errbuf, sizeof(errbuf), _("Connection refused.")); break; + case WSAEADDRINUSE: /* 10048 */ + g_snprintf(errbuf, sizeof(errbuf), _("Address already in use.")); + break; default: g_snprintf(errbuf, sizeof(errbuf), "Windows socket error #%d", errornum); } diff -r 0a674616953c -r e53a21941d43 pidgin/gtkaccount.c --- a/pidgin/gtkaccount.c Sun Jul 20 05:47:42 2008 +0000 +++ b/pidgin/gtkaccount.c Sun Jul 20 05:53:00 2008 +0000 @@ -1186,7 +1186,6 @@ char *tmp; gboolean new_acct = FALSE, icon_change = FALSE; PurpleAccount *account; - PurplePluginProtocolInfo *prpl_info; /* Build the username string. */ username = g_strdup(gtk_entry_get_text(GTK_ENTRY(dialog->screenname_entry))); @@ -1254,8 +1253,7 @@ purple_account_set_alias(account, NULL); /* Buddy Icon */ - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(dialog->plugin); - if (prpl_info != NULL && prpl_info->icon_spec.format != NULL) + if (dialog->prpl_info != NULL && dialog->prpl_info->icon_spec.format != NULL) { const char *filename;