# HG changeset patch # User Marcus Lundblad # Date 1234475361 0 # Node ID fa22ec9d1e84fe8701cacb374b9f2ac5c70e404d # Parent fa5987472e007fb203543c3a5a140731ced51372# Parent 3c9af6627767b954681a60ec0159ff5b775adff6 propagate from branch 'im.pidgin.pidgin' (head b79100551ea19cf35ee8952a34a44b97204e75f3) to branch 'im.pidgin.cpw.malu.xmpp.attention' (head f69342263cd52989b48a99f90e368a32d58325db) diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/data.c diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/data.h diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/google.c diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/google.h diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/iq.c diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Thu Feb 12 02:33:05 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Thu Feb 12 21:49:21 2009 +0000 @@ -1786,9 +1786,12 @@ PurpleStatusType *type; GList *types = NULL; PurpleValue *priority_value; + PurpleValue *buzz_enabled; priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 1); + buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN); + purple_value_set_boolean(buzz_enabled, TRUE); type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_ONLINE), NULL, TRUE, TRUE, FALSE, @@ -1797,12 +1800,14 @@ "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), - "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), + "buzz", _("Allow Buzz"), buzz_enabled, NULL); types = g_list_append(types, type); priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 1); + buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN); + purple_value_set_boolean(buzz_enabled, TRUE); type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT), _("Chatty"), TRUE, TRUE, FALSE, @@ -1811,12 +1816,14 @@ "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), - "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), + "buzz", _("Allow Buzz"), buzz_enabled, NULL); types = g_list_append(types, type); priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 0); + buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN); + purple_value_set_boolean(buzz_enabled, TRUE); type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY), NULL, TRUE, TRUE, FALSE, @@ -1825,12 +1832,14 @@ "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), - "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), + "buzz", _("Allow Buzz"), buzz_enabled, NULL); types = g_list_append(types, type); priority_value = purple_value_new(PURPLE_TYPE_INT); purple_value_set_int(priority_value, 0); + buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN); + purple_value_set_boolean(buzz_enabled, TRUE); type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY, jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA), NULL, TRUE, TRUE, FALSE, @@ -1839,7 +1848,7 @@ "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), - "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), + "buzz", _("Allow Buzz"), buzz_enabled, NULL); types = g_list_append(types, type); @@ -1853,7 +1862,6 @@ "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), - "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), NULL); types = g_list_append(types, type); @@ -2436,63 +2444,92 @@ JabberBuddy *jb; JabberBuddyResource *jbr; - GList *iter; - + PurpleConnection *gc = js->gc; + PurpleBuddy *buddy = + purple_find_buddy(purple_connection_get_account(gc), username); + const gchar *alias = + buddy ? purple_buddy_get_contact_alias(buddy) : username; + if(!username) return FALSE; jb = jabber_buddy_find(js, username, FALSE); if(!jb) { - *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); + *error = g_strdup_printf(_("Unable to buzz, because there is nothing " + "known about %s."), alias); return FALSE; } - + jbr = jabber_buddy_find_resource(jb, NULL); - if(!jbr) { - *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), username); - return FALSE; - } - - if(!jbr->caps) { - *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); + if (!jbr) { + *error = g_strdup_printf(_("Unable to buzz, because %s might be offline."), + alias); return FALSE; } - - for(iter = jbr->caps->features; iter; iter = g_list_next(iter)) { - if(!strcmp(iter->data, "http://www.xmpp.org/extensions/xep-0224.html#ns")) { - xmlnode *buzz, *msg = xmlnode_new("message"); - gchar *to; - - to = g_strdup_printf("%s/%s", username, jbr->name); - xmlnode_set_attrib(msg, "to", to); - g_free(to); - - /* avoid offline storage */ - xmlnode_set_attrib(msg, "type", "headline"); - - buzz = xmlnode_new_child(msg, "attention"); - xmlnode_set_namespace(buzz, "http://www.xmpp.org/extensions/xep-0224.html#ns"); - - jabber_send(js, msg); - xmlnode_free(msg); - - return TRUE; - } + + if (jabber_resource_has_capability(jbr, XEP_0224_NAMESPACE)) { + xmlnode *buzz, *msg = xmlnode_new("message"); + gchar *to; + + to = g_strdup_printf("%s/%s", username, jbr->name); + xmlnode_set_attrib(msg, "to", to); + g_free(to); + + /* avoid offline storage */ + xmlnode_set_attrib(msg, "type", "headline"); + + buzz = xmlnode_new_child(msg, "attention"); + xmlnode_set_namespace(buzz, XEP_0224_NAMESPACE); + + jabber_send(js, msg); + xmlnode_free(msg); + + return TRUE; + } else { + *error = g_strdup_printf(_("Unable to buzz, because %s does " + "not support it or do not wish to receive buzzes now."), alias); + return FALSE; } - - *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), username); - return FALSE; } static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, const char *cmd, char **args, char **error, void *data) { JabberStream *js = conv->account->gc->proto_data; - - if(!args || !args[0]) + const gchar *who; + + if (!args || !args[0]) { + /* use the buddy from conversation, if it's a one-to-one conversation */ + if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { + who = purple_conversation_get_name(conv); + } else { + return PURPLE_CMD_RET_FAILED; + } + } else { + who = args[0]; + } + + if (_jabber_send_buzz(js, who, error)) { + const gchar *alias; + gchar *str; + PurpleBuddy *buddy = + purple_find_buddy(purple_connection_get_account(conv->account->gc), + who); + + if (buddy != NULL) + alias = purple_buddy_get_contact_alias(buddy); + else + alias = who; + + str = g_strdup_printf(_("Buzzing %s..."), alias); + purple_conversation_write(conv, NULL, str, + PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL)); + g_free(str); + + return PURPLE_CMD_RET_OK; + } else { return PURPLE_CMD_RET_FAILED; - - return _jabber_send_buzz(js, args[0], error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED; + } } GList *jabber_attention_types(PurpleAccount *account) @@ -2605,8 +2642,9 @@ "prpl-jabber", jabber_cmd_ping, _("ping <jid>: Ping a user/component/server."), NULL); - purple_cmd_register("buzz", "s", PURPLE_CMD_P_PRPL, - PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY, + purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, + PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY | + PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, "prpl-jabber", jabber_cmd_buzz, _("buzz: Buzz a user to get their attention"), NULL); } diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/libxmpp.c --- a/libpurple/protocols/jabber/libxmpp.c Thu Feb 12 02:33:05 2009 +0000 +++ b/libpurple/protocols/jabber/libxmpp.c Thu Feb 12 21:49:21 2009 +0000 @@ -283,7 +283,7 @@ jabber_add_feature("avatarmeta", AVATARNAMESPACEMETA, jabber_pep_namespace_only_when_pep_enabled_cb); jabber_add_feature("avatardata", AVATARNAMESPACEDATA, jabber_pep_namespace_only_when_pep_enabled_cb); - jabber_add_feature("buzz", "http://www.xmpp.org/extensions/xep-0224.html#ns", + jabber_add_feature("buzz", XEP_0224_NAMESPACE, jabber_buzz_isenabled); jabber_add_feature("bob", XEP_0231_NAMESPACE, jabber_custom_smileys_isenabled); diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/message.c --- a/libpurple/protocols/jabber/message.c Thu Feb 12 02:33:05 2009 +0000 +++ b/libpurple/protocols/jabber/message.c Thu Feb 12 21:49:21 2009 +0000 @@ -290,7 +290,6 @@ PurpleBuddy *buddy; PurpleAccount *account; PurpleConversation *c; - char *username; /* Delayed buzz MUST NOT be accepted */ if(jm->delayed) @@ -309,11 +308,8 @@ if (c == NULL) c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, jm->from); - username = g_markup_escape_text(purple_buddy_get_alias(buddy), -1); /* xmpp only has 1 attention type, so index is 0 */ - purple_prpl_got_attention(jm->js->gc, username, 0); - - g_free(username); + purple_prpl_got_attention(jm->js->gc, jm->from, 0); } /* used internally by the functions below */ @@ -731,7 +727,7 @@ jm->type = JABBER_MESSAGE_EVENT; for(items = xmlnode_get_child(child,"items"); items; items = items->next) jm->eventitems = g_list_append(jm->eventitems, items); - } else if(!strcmp(child->name, "attention") && !strcmp(xmlns,"http://www.xmpp.org/extensions/xep-0224.html#ns")) { + } else if(!strcmp(child->name, "attention") && !strcmp(xmlns, XEP_0224_NAMESPACE)) { jm->hasBuzz = TRUE; } else if(!strcmp(child->name, "delay") && !strcmp(xmlns,"urn:xmpp:delay")) { const char *timestamp = xmlnode_get_attrib(child, "stamp"); diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/message.h --- a/libpurple/protocols/jabber/message.h Thu Feb 12 02:33:05 2009 +0000 +++ b/libpurple/protocols/jabber/message.h Thu Feb 12 21:49:21 2009 +0000 @@ -26,6 +26,8 @@ #include "jabber.h" #include "xmlnode.h" +#define XEP_0224_NAMESPACE "urn:xmpp:attention:0" + typedef struct _JabberMessage { JabberStream *js; enum { diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/ping.c diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/ping.h diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/si.c diff -r fa5987472e00 -r fa22ec9d1e84 libpurple/protocols/jabber/si.h