libpurple/protocols/jabber/jabber.c

branch
cpw.attention_ui
changeset 25948
38b4f66e3f65
parent 25947
72760f7f3b10
child 26048
9eeed41d0004
equal deleted inserted replaced
25947:72760f7f3b10 25948:38b4f66e3f65
182 182
183 static void jabber_stream_features_parse(JabberStream *js, xmlnode *packet) 183 static void jabber_stream_features_parse(JabberStream *js, xmlnode *packet)
184 { 184 {
185 if(xmlnode_get_child(packet, "starttls")) { 185 if(xmlnode_get_child(packet, "starttls")) {
186 if(jabber_process_starttls(js, packet)) 186 if(jabber_process_starttls(js, packet))
187 187
188 return; 188 return;
189 } else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !js->gsc) { 189 } else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !js->gsc) {
190 purple_connection_error_reason (js->gc, 190 purple_connection_error_reason (js->gc,
191 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, 191 PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
192 _("You require encryption, but it is not available on this server.")); 192 _("You require encryption, but it is not available on this server."));
465 { 465 {
466 JabberStream *js = gc->proto_data; 466 JabberStream *js = gc->proto_data;
467 467
468 if (js->keepalive_timeout == -1) { 468 if (js->keepalive_timeout == -1) {
469 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_GET); 469 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_GET);
470 470
471 xmlnode *ping = xmlnode_new_child(iq->node, "ping"); 471 xmlnode *ping = xmlnode_new_child(iq->node, "ping");
472 xmlnode_set_namespace(ping, "urn:xmpp:ping"); 472 xmlnode_set_namespace(ping, "urn:xmpp:ping");
473 473
474 js->keepalive_timeout = purple_timeout_add_seconds(120, (GSourceFunc)(jabber_pong_timeout), gc); 474 js->keepalive_timeout = purple_timeout_add_seconds(120, (GSourceFunc)(jabber_pong_timeout), gc);
475 jabber_iq_set_callback(iq, jabber_pong_cb, NULL); 475 jabber_iq_set_callback(iq, jabber_pong_cb, NULL);
476 jabber_iq_send(iq); 476 jabber_iq_send(iq);
477 } 477 }
478 } 478 }
576 576
577 if(js->state == JABBER_STREAM_CONNECTING) 577 if(js->state == JABBER_STREAM_CONNECTING)
578 jabber_send_raw(js, "<?xml version='1.0' ?>", -1); 578 jabber_send_raw(js, "<?xml version='1.0' ?>", -1);
579 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); 579 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING);
580 purple_ssl_input_add(gsc, jabber_recv_cb_ssl, gc); 580 purple_ssl_input_add(gsc, jabber_recv_cb_ssl, gc);
581 581
582 /* Tell the app that we're doing encryption */ 582 /* Tell the app that we're doing encryption */
583 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION); 583 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION);
584 } 584 }
585 585
586 586
734 purple_connection_error_reason (gc, 734 purple_connection_error_reason (gc,
735 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, 735 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
736 _("Invalid XMPP ID")); 736 _("Invalid XMPP ID"));
737 return; 737 return;
738 } 738 }
739 739
740 if (!js->user->domain || *(js->user->domain) == '\0') { 740 if (!js->user->domain || *(js->user->domain) == '\0') {
741 purple_connection_error_reason (gc, 741 purple_connection_error_reason (gc,
742 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, 742 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
743 _("Invalid XMPP ID. Domain must be set.")); 743 _("Invalid XMPP ID. Domain must be set."));
744 return; 744 return;
745 } 745 }
746 746
747 if((my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE))) 747 if((my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE)))
748 my_jb->subscription |= JABBER_SUB_BOTH; 748 my_jb->subscription |= JABBER_SUB_BOTH;
749 749
750 jabber_stream_set_state(js, JABBER_STREAM_CONNECTING); 750 jabber_stream_set_state(js, JABBER_STREAM_CONNECTING);
751 751
851 purple_notify_info(NULL, _("Unregistration Successful"), 851 purple_notify_info(NULL, _("Unregistration Successful"),
852 _("Unregistration Successful"), buf); 852 _("Unregistration Successful"), buf);
853 g_free(buf); 853 g_free(buf);
854 } else { 854 } else {
855 char *msg = jabber_parse_error(js, packet, NULL); 855 char *msg = jabber_parse_error(js, packet, NULL);
856 856
857 if(!msg) 857 if(!msg)
858 msg = g_strdup(_("Unknown Error")); 858 msg = g_strdup(_("Unknown Error"));
859 859
860 purple_notify_error(NULL, _("Unregistration Failed"), 860 purple_notify_error(NULL, _("Unregistration Failed"),
861 _("Unregistration Failed"), msg); 861 _("Unregistration Failed"), msg);
862 g_free(msg); 862 g_free(msg);
863 } 863 }
864 g_free(to); 864 g_free(to);
897 iq = jabber_iq_new_query(cbdata->js, JABBER_IQ_SET, "jabber:iq:register"); 897 iq = jabber_iq_new_query(cbdata->js, JABBER_IQ_SET, "jabber:iq:register");
898 query = xmlnode_get_child(iq->node, "query"); 898 query = xmlnode_get_child(iq->node, "query");
899 if (cbdata->who) 899 if (cbdata->who)
900 xmlnode_set_attrib(iq->node,"to",cbdata->who); 900 xmlnode_set_attrib(iq->node,"to",cbdata->who);
901 xmlnode_new_child(query, "remove"); 901 xmlnode_new_child(query, "remove");
902 902
903 jabber_iq_set_callback(iq, jabber_unregistration_result_cb, cbdata->who); 903 jabber_iq_set_callback(iq, jabber_unregistration_result_cb, cbdata->who);
904 904
905 jabber_iq_send(iq); 905 jabber_iq_send(iq);
906 g_free(cbdata); 906 g_free(cbdata);
907 return; 907 return;
908 } 908 }
909 } else { 909 } else {
1029 (account->registration_cb)(account, FALSE, account->registration_cb_user_data); 1029 (account->registration_cb)(account, FALSE, account->registration_cb_user_data);
1030 jabber_connection_schedule_close(js); 1030 jabber_connection_schedule_close(js);
1031 return; 1031 return;
1032 } 1032 }
1033 } 1033 }
1034 1034
1035 if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:data"))) { 1035 if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:data"))) {
1036 jabber_x_data_request(js, x, jabber_register_x_data_cb, g_strdup(from)); 1036 jabber_x_data_request(js, x, jabber_register_x_data_cb, g_strdup(from));
1037 return; 1037 return;
1038 1038
1039 } else if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:oob"))) { 1039 } else if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:oob"))) {
1180 jabber_iq_send(iq); 1180 jabber_iq_send(iq);
1181 } 1181 }
1182 1182
1183 void jabber_register_gateway(JabberStream *js, const char *gateway) { 1183 void jabber_register_gateway(JabberStream *js, const char *gateway) {
1184 JabberIq *iq; 1184 JabberIq *iq;
1185 1185
1186 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:register"); 1186 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:register");
1187 xmlnode_set_attrib(iq->node, "to", gateway); 1187 xmlnode_set_attrib(iq->node, "to", gateway);
1188 jabber_iq_send(iq); 1188 jabber_iq_send(iq);
1189 } 1189 }
1190 1190
1255 static void jabber_unregister_account_iq_cb(JabberStream *js, xmlnode *packet, gpointer data) { 1255 static void jabber_unregister_account_iq_cb(JabberStream *js, xmlnode *packet, gpointer data) {
1256 PurpleAccount *account = purple_connection_get_account(js->gc); 1256 PurpleAccount *account = purple_connection_get_account(js->gc);
1257 const char *type = xmlnode_get_attrib(packet,"type"); 1257 const char *type = xmlnode_get_attrib(packet,"type");
1258 if(!strcmp(type,"error")) { 1258 if(!strcmp(type,"error")) {
1259 char *msg = jabber_parse_error(js, packet, NULL); 1259 char *msg = jabber_parse_error(js, packet, NULL);
1260 1260
1261 purple_notify_error(js->gc, _("Error unregistering account"), 1261 purple_notify_error(js->gc, _("Error unregistering account"),
1262 _("Error unregistering account"), msg); 1262 _("Error unregistering account"), msg);
1263 g_free(msg); 1263 g_free(msg);
1264 if(js->unregistration_cb) 1264 if(js->unregistration_cb)
1265 js->unregistration_cb(account, FALSE, js->unregistration_user_data); 1265 js->unregistration_cb(account, FALSE, js->unregistration_user_data);
1289 } 1289 }
1290 1290
1291 void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data) { 1291 void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data) {
1292 PurpleConnection *gc = purple_account_get_connection(account); 1292 PurpleConnection *gc = purple_account_get_connection(account);
1293 JabberStream *js; 1293 JabberStream *js;
1294 1294
1295 if(gc->state != PURPLE_CONNECTED) { 1295 if(gc->state != PURPLE_CONNECTED) {
1296 if(gc->state != PURPLE_CONNECTING) 1296 if(gc->state != PURPLE_CONNECTING)
1297 jabber_login(account); 1297 jabber_login(account);
1298 js = gc->proto_data; 1298 js = gc->proto_data;
1299 js->unregistration = TRUE; 1299 js->unregistration = TRUE;
1300 js->unregistration_cb = cb; 1300 js->unregistration_cb = cb;
1301 js->unregistration_user_data = user_data; 1301 js->unregistration_user_data = user_data;
1302 return; 1302 return;
1303 } 1303 }
1304 1304
1305 js = gc->proto_data; 1305 js = gc->proto_data;
1306 1306
1307 if (js->unregistration) { 1307 if (js->unregistration) {
1308 purple_debug_error("jabber", "Unregistration in process; ignoring duplicate request.\n"); 1308 purple_debug_error("jabber", "Unregistration in process; ignoring duplicate request.\n");
1309 return; 1309 return;
1600 1600
1601 feat = g_new0(JabberFeature,1); 1601 feat = g_new0(JabberFeature,1);
1602 feat->shortname = g_strdup(shortname); 1602 feat->shortname = g_strdup(shortname);
1603 feat->namespace = g_strdup(namespace); 1603 feat->namespace = g_strdup(namespace);
1604 feat->is_enabled = cb; 1604 feat->is_enabled = cb;
1605 1605
1606 /* try to remove just in case it already exists in the list */ 1606 /* try to remove just in case it already exists in the list */
1607 jabber_remove_feature(shortname); 1607 jabber_remove_feature(shortname);
1608 1608
1609 jabber_features = g_list_append(jabber_features, feat); 1609 jabber_features = g_list_append(jabber_features, feat);
1610 } 1610 }
1611 1611
1612 void jabber_remove_feature(const char *shortname) { 1612 void jabber_remove_feature(const char *shortname) {
1613 GList *feature; 1613 GList *feature;
1614 for(feature = jabber_features; feature; feature = feature->next) { 1614 for(feature = jabber_features; feature; feature = feature->next) {
1615 JabberFeature *feat = (JabberFeature*)feature->data; 1615 JabberFeature *feat = (JabberFeature*)feature->data;
1616 if(!strcmp(feat->shortname, shortname)) { 1616 if(!strcmp(feat->shortname, shortname)) {
1617 g_free(feat->shortname); 1617 g_free(feat->shortname);
1618 g_free(feat->namespace); 1618 g_free(feat->namespace);
1619 1619
1620 g_free(feature->data); 1620 g_free(feature->data);
1621 jabber_features = g_list_delete_link(jabber_features, feature); 1621 jabber_features = g_list_delete_link(jabber_features, feature);
1622 break; 1622 break;
1623 } 1623 }
1624 } 1624 }
1631 1631
1632 const char* jabber_list_emblem(PurpleBuddy *b) 1632 const char* jabber_list_emblem(PurpleBuddy *b)
1633 { 1633 {
1634 JabberStream *js; 1634 JabberStream *js;
1635 JabberBuddy *jb = NULL; 1635 JabberBuddy *jb = NULL;
1636 1636 PurpleConnection *gc = purple_account_get_connection(purple_buddy_get_account(b));
1637 if(!b->account->gc) 1637
1638 if(!gc)
1638 return NULL; 1639 return NULL;
1639 1640
1640 js = b->account->gc->proto_data; 1641 js = gc->proto_data;
1641 if(js) 1642 if(js)
1642 jb = jabber_buddy_find(js, b->name, FALSE); 1643 jb = jabber_buddy_find(js, purple_buddy_get_name(b), FALSE);
1643 1644
1644 if(!PURPLE_BUDDY_IS_ONLINE(b)) { 1645 if(!PURPLE_BUDDY_IS_ONLINE(b)) {
1645 if(jb && (jb->subscription & JABBER_SUB_PENDING || 1646 if(jb && (jb->subscription & JABBER_SUB_PENDING ||
1646 !(jb->subscription & JABBER_SUB_TO))) 1647 !(jb->subscription & JABBER_SUB_TO)))
1647 return "not-authorized"; 1648 return "not-authorized";
1651 1652
1652 char *jabber_status_text(PurpleBuddy *b) 1653 char *jabber_status_text(PurpleBuddy *b)
1653 { 1654 {
1654 char *ret = NULL; 1655 char *ret = NULL;
1655 JabberBuddy *jb = NULL; 1656 JabberBuddy *jb = NULL;
1656 1657 PurpleAccount *account = purple_buddy_get_account(b);
1657 if (b->account->gc && b->account->gc->proto_data) 1658 PurpleConnection *gc = purple_account_get_connection(account);
1658 jb = jabber_buddy_find(b->account->gc->proto_data, b->name, FALSE); 1659
1660 if (gc && gc->proto_data)
1661 jb = jabber_buddy_find(gc->proto_data, purple_buddy_get_name(b), FALSE);
1659 1662
1660 if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && (jb->subscription & JABBER_SUB_PENDING || !(jb->subscription & JABBER_SUB_TO))) { 1663 if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && (jb->subscription & JABBER_SUB_PENDING || !(jb->subscription & JABBER_SUB_TO))) {
1661 ret = g_strdup(_("Not Authorized")); 1664 ret = g_strdup(_("Not Authorized"));
1662 } else if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) { 1665 } else if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) {
1663 ret = g_strdup(jb->error_msg); 1666 ret = g_strdup(jb->error_msg);
1682 } 1685 }
1683 1686
1684 void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full) 1687 void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full)
1685 { 1688 {
1686 JabberBuddy *jb; 1689 JabberBuddy *jb;
1690 PurpleAccount *account;
1691 PurpleConnection *gc;
1687 1692
1688 g_return_if_fail(b != NULL); 1693 g_return_if_fail(b != NULL);
1689 g_return_if_fail(b->account != NULL); 1694
1690 g_return_if_fail(b->account->gc != NULL); 1695 account = purple_buddy_get_account(b);
1691 g_return_if_fail(b->account->gc->proto_data != NULL); 1696 g_return_if_fail(account != NULL);
1692 1697
1693 jb = jabber_buddy_find(b->account->gc->proto_data, b->name, 1698 gc = purple_account_get_connection(account);
1694 FALSE); 1699 g_return_if_fail(gc != NULL);
1700 g_return_if_fail(gc->proto_data != NULL);
1701
1702 jb = jabber_buddy_find(gc->proto_data, purple_buddy_get_name(b), FALSE);
1695 1703
1696 if(jb) { 1704 if(jb) {
1697 JabberBuddyResource *jbr = NULL; 1705 JabberBuddyResource *jbr = NULL;
1698 PurplePresence *presence = purple_buddy_get_presence(b); 1706 PurplePresence *presence = purple_buddy_get_presence(b);
1699 const char *sub; 1707 const char *sub;
1817 NULL); 1825 NULL);
1818 types = g_list_append(types, type); 1826 types = g_list_append(types, type);
1819 1827
1820 priority_value = purple_value_new(PURPLE_TYPE_INT); 1828 priority_value = purple_value_new(PURPLE_TYPE_INT);
1821 purple_value_set_int(priority_value, 1); 1829 purple_value_set_int(priority_value, 1);
1830 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1831 purple_value_set_boolean(buzz_enabled, TRUE);
1822 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, 1832 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
1823 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT), 1833 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT),
1824 _("Chatty"), TRUE, TRUE, FALSE, 1834 _("Chatty"), TRUE, TRUE, FALSE,
1825 "priority", _("Priority"), priority_value, 1835 "priority", _("Priority"), priority_value,
1826 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1836 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1831 NULL); 1841 NULL);
1832 types = g_list_append(types, type); 1842 types = g_list_append(types, type);
1833 1843
1834 priority_value = purple_value_new(PURPLE_TYPE_INT); 1844 priority_value = purple_value_new(PURPLE_TYPE_INT);
1835 purple_value_set_int(priority_value, 0); 1845 purple_value_set_int(priority_value, 0);
1846 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1847 purple_value_set_boolean(buzz_enabled, TRUE);
1836 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY, 1848 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY,
1837 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY), 1849 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY),
1838 NULL, TRUE, TRUE, FALSE, 1850 NULL, TRUE, TRUE, FALSE,
1839 "priority", _("Priority"), priority_value, 1851 "priority", _("Priority"), priority_value,
1840 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1852 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1841 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1853 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1842 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1854 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1843 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1855 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1844 "buzz", _("Allow Buzz"), buzz_enabled, 1856 "buzz", _("Allow Buzz"), buzz_enabled,
1845 NULL); 1857 NULL);
1846 types = g_list_append(types, type); 1858 types = g_list_append(types, type);
1847 1859
1848 priority_value = purple_value_new(PURPLE_TYPE_INT); 1860 priority_value = purple_value_new(PURPLE_TYPE_INT);
1849 purple_value_set_int(priority_value, 0); 1861 purple_value_set_int(priority_value, 0);
1862 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1863 purple_value_set_boolean(buzz_enabled, TRUE);
1850 type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY, 1864 type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY,
1851 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA), 1865 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA),
1852 NULL, TRUE, TRUE, FALSE, 1866 NULL, TRUE, TRUE, FALSE,
1853 "priority", _("Priority"), priority_value, 1867 "priority", _("Priority"), priority_value,
1854 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1868 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1855 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1869 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1856 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1870 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1857 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1871 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1858 "buzz", _("Allow Buzz"), buzz_enabled, 1872 "buzz", _("Allow Buzz"), buzz_enabled,
1859 NULL); 1873 NULL);
1860 types = g_list_append(types, type); 1874 types = g_list_append(types, type);
1861 1875
1862 priority_value = purple_value_new(PURPLE_TYPE_INT); 1876 priority_value = purple_value_new(PURPLE_TYPE_INT);
1863 purple_value_set_int(priority_value, 0); 1877 purple_value_set_int(priority_value, 0);
2012 2026
2013 purple_debug_info("jabber", "jabber_actions: have pep: %s\n", js->pep?"YES":"NO"); 2027 purple_debug_info("jabber", "jabber_actions: have pep: %s\n", js->pep?"YES":"NO");
2014 2028
2015 if(js->pep) 2029 if(js->pep)
2016 jabber_pep_init_actions(&m); 2030 jabber_pep_init_actions(&m);
2017 2031
2018 if(js->commands) 2032 if(js->commands)
2019 jabber_adhoc_init_server_commands(js, &m); 2033 jabber_adhoc_init_server_commands(js, &m);
2020 2034
2021 return m; 2035 return m;
2022 } 2036 }
2027 JabberID *jid; 2041 JabberID *jid;
2028 2042
2029 if(!(jid = jabber_id_new(name))) 2043 if(!(jid = jabber_id_new(name)))
2030 return NULL; 2044 return NULL;
2031 2045
2032 for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { 2046 for(gnode = purple_blist_get_root(); gnode;
2033 for(cnode = gnode->child; cnode; cnode = cnode->next) { 2047 gnode = purple_blist_node_get_sibling_next(gnode)) {
2048 for(cnode = purple_blist_node_get_first_child(gnode);
2049 cnode;
2050 cnode = purple_blist_node_get_sibling_next(cnode)) {
2034 PurpleChat *chat = (PurpleChat*)cnode; 2051 PurpleChat *chat = (PurpleChat*)cnode;
2035 const char *room, *server; 2052 const char *room, *server;
2053 GHashTable *components;
2036 if(!PURPLE_BLIST_NODE_IS_CHAT(cnode)) 2054 if(!PURPLE_BLIST_NODE_IS_CHAT(cnode))
2037 continue; 2055 continue;
2038 2056
2039 if(chat->account != account) 2057 if (purple_chat_get_account(chat) != account)
2040 continue; 2058 continue;
2041 2059
2042 if(!(room = g_hash_table_lookup(chat->components, "room"))) 2060 components = purple_chat_get_components(chat);
2061 if(!(room = g_hash_table_lookup(components, "room")))
2043 continue; 2062 continue;
2044 if(!(server = g_hash_table_lookup(chat->components, "server"))) 2063 if(!(server = g_hash_table_lookup(components, "server")))
2045 continue; 2064 continue;
2046 2065
2047 if(jid->node && jid->domain && 2066 if(jid->node && jid->domain &&
2048 !g_utf8_collate(room, jid->node) && !g_utf8_collate(server, jid->domain)) { 2067 !g_utf8_collate(room, jid->node) && !g_utf8_collate(server, jid->domain)) {
2049 jabber_id_free(jid); 2068 jabber_id_free(jid);
2059 { 2078 {
2060 JabberStream *js = gc->proto_data; 2079 JabberStream *js = gc->proto_data;
2061 JabberID *jid; 2080 JabberID *jid;
2062 JabberBuddy *jb; 2081 JabberBuddy *jb;
2063 JabberBuddyResource *jbr; 2082 JabberBuddyResource *jbr;
2064 2083
2065 if(!(jid = jabber_id_new(who))) 2084 if(!(jid = jabber_id_new(who)))
2066 return; 2085 return;
2067 2086
2068 if((jb = jabber_buddy_find(js, who, TRUE)) && 2087 if((jb = jabber_buddy_find(js, who, TRUE)) &&
2069 (jbr = jabber_buddy_find_resource(jb, jid->resource))) { 2088 (jbr = jabber_buddy_find_resource(jb, jid->resource))) {
2320 JabberChat *chat = jabber_chat_find_by_conv(conv); 2339 JabberChat *chat = jabber_chat_find_by_conv(conv);
2321 2340
2322 if (!chat || !args || !args[0] || !args[1]) 2341 if (!chat || !args || !args[0] || !args[1])
2323 return PURPLE_CMD_RET_FAILED; 2342 return PURPLE_CMD_RET_FAILED;
2324 2343
2325 if (strcmp(args[1], "owner") != 0 && 2344 if (strcmp(args[1], "owner") != 0 &&
2326 strcmp(args[1], "admin") != 0 && 2345 strcmp(args[1], "admin") != 0 &&
2327 strcmp(args[1], "member") != 0 && 2346 strcmp(args[1], "member") != 0 &&
2328 strcmp(args[1], "outcast") != 0 && 2347 strcmp(args[1], "outcast") != 0 &&
2329 strcmp(args[1], "none") != 0) { 2348 strcmp(args[1], "none") != 0) {
2330 *error = g_strdup_printf(_("Unknown affiliation: \"%s\""), args[1]); 2349 *error = g_strdup_printf(_("Unknown affiliation: \"%s\""), args[1]);
2450 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) { 2469 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) {
2451 2470
2452 JabberBuddy *jb; 2471 JabberBuddy *jb;
2453 JabberBuddyResource *jbr; 2472 JabberBuddyResource *jbr;
2454 PurpleConnection *gc = js->gc; 2473 PurpleConnection *gc = js->gc;
2455 PurpleAccount *account = purple_connection_get_account(gc); 2474 PurpleBuddy *buddy =
2456 PurpleConversation *conv = 2475 purple_find_buddy(purple_connection_get_account(gc), username);
2457 purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, username, 2476 const gchar *alias =
2458 account); 2477 buddy ? purple_buddy_get_contact_alias(buddy) : username;
2459 gchar *str; 2478
2460
2461 if(!username) 2479 if(!username)
2462 return FALSE; 2480 return FALSE;
2463 2481
2464 jb = jabber_buddy_find(js, username, FALSE); 2482 jb = jabber_buddy_find(js, username, FALSE);
2465 if(!jb) { 2483 if(!jb) {
2466 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); 2484 *error = g_strdup_printf(_("Unable to buzz, because there is nothing "
2485 "known about %s."), alias);
2467 return FALSE; 2486 return FALSE;
2468 } 2487 }
2469 2488
2470 jbr = jabber_buddy_find_resource(jb, NULL); 2489 jbr = jabber_buddy_find_resource(jb, NULL);
2471 if (!jbr) { 2490 if (!jbr) {
2472 *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), 2491 *error = g_strdup_printf(_("Unable to buzz, because %s might be offline."),
2473 username); 2492 alias);
2474 return FALSE; 2493 return FALSE;
2475 } 2494 }
2476 2495
2477 if (jabber_resource_has_capability(jbr, XEP_0224_NAMESPACE)) { 2496 if (jabber_resource_has_capability(jbr, XEP_0224_NAMESPACE)) {
2478 xmlnode *buzz, *msg = xmlnode_new("message"); 2497 xmlnode *buzz, *msg = xmlnode_new("message");
2479 gchar *to; 2498 gchar *to;
2480 2499
2481 to = g_strdup_printf("%s/%s", username, jbr->name); 2500 to = g_strdup_printf("%s/%s", username, jbr->name);
2489 xmlnode_set_namespace(buzz, XEP_0224_NAMESPACE); 2508 xmlnode_set_namespace(buzz, XEP_0224_NAMESPACE);
2490 2509
2491 jabber_send(js, msg); 2510 jabber_send(js, msg);
2492 xmlnode_free(msg); 2511 xmlnode_free(msg);
2493 2512
2494 str = g_strdup_printf(_("Buzzing %s..."), username);
2495 purple_conversation_write(conv, NULL, str,
2496 PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
2497 g_free(str);
2498
2499 return TRUE; 2513 return TRUE;
2500 } else { 2514 } else {
2501 *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), username); 2515 *error = g_strdup_printf(_("Unable to buzz, because %s does "
2516 "not support it or do not wish to receive buzzes now."), alias);
2502 return FALSE; 2517 return FALSE;
2503 } 2518 }
2504 } 2519 }
2505 2520
2506 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, 2521 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv,
2507 const char *cmd, char **args, char **error, void *data) 2522 const char *cmd, char **args, char **error, void *data)
2508 { 2523 {
2509 JabberStream *js = conv->account->gc->proto_data; 2524 JabberStream *js = conv->account->gc->proto_data;
2510 const gchar *who; 2525 const gchar *who;
2511 2526
2512 if (!args || !args[0]) { 2527 if (!args || !args[0]) {
2513 /* use the buddy from conversation, if it's a one-to-one conversation */ 2528 /* use the buddy from conversation, if it's a one-to-one conversation */
2514 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) { 2529 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
2515 who = purple_conversation_get_name(conv); 2530 who = purple_conversation_get_name(conv);
2516 } else { 2531 } else {
2517 return PURPLE_CMD_RET_FAILED; 2532 return PURPLE_CMD_RET_FAILED;
2518 } 2533 }
2519 } else { 2534 } else {
2520 who = args[0]; 2535 who = args[0];
2521 } 2536 }
2522 2537
2523 purple_conversation_attention(conv, who, 0, PURPLE_MESSAGE_SEND, time(NULL)); 2538 if (_jabber_send_buzz(js, who, error)) {
2524 return _jabber_send_buzz(js, who, error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED; 2539 const gchar *alias;
2540 gchar *str;
2541 PurpleBuddy *buddy =
2542 purple_find_buddy(purple_connection_get_account(conv->account->gc),
2543 who);
2544
2545 if (buddy != NULL)
2546 alias = purple_buddy_get_contact_alias(buddy);
2547 else
2548 alias = who;
2549
2550 str = g_strdup_printf(_("Buzzing %s..."), alias);
2551 purple_conversation_write(conv, NULL, str,
2552 PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
2553 g_free(str);
2554
2555 return PURPLE_CMD_RET_OK;
2556 } else {
2557 return PURPLE_CMD_RET_FAILED;
2558 }
2525 } 2559 }
2526 2560
2527 GList *jabber_attention_types(PurpleAccount *account) 2561 GList *jabber_attention_types(PurpleAccount *account)
2528 { 2562 {
2529 static GList *types = NULL; 2563 static GList *types = NULL;
2540 { 2574 {
2541 JabberStream *js = gc->proto_data; 2575 JabberStream *js = gc->proto_data;
2542 gchar *error = NULL; 2576 gchar *error = NULL;
2543 2577
2544 if (!_jabber_send_buzz(js, username, &error)) { 2578 if (!_jabber_send_buzz(js, username, &error)) {
2545 PurpleAccount *account = purple_connection_get_account(gc);
2546 PurpleConversation *conv =
2547 purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY,
2548 username, account);
2549 purple_debug_error("jabber", "jabber_send_attention: jabber_cmd_buzz failed with error: %s\n", error ? error : "(NULL)"); 2579 purple_debug_error("jabber", "jabber_send_attention: jabber_cmd_buzz failed with error: %s\n", error ? error : "(NULL)");
2550 purple_conversation_write(conv, username, error,
2551 PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
2552 g_free(error); 2580 g_free(error);
2553 return FALSE; 2581 return FALSE;
2554 } 2582 }
2555 2583
2556 return TRUE; 2584 return TRUE;
2639 PURPLE_CMD_FLAG_PRPL_ONLY, 2667 PURPLE_CMD_FLAG_PRPL_ONLY,
2640 "prpl-jabber", jabber_cmd_ping, 2668 "prpl-jabber", jabber_cmd_ping,
2641 _("ping &lt;jid&gt;: Ping a user/component/server."), 2669 _("ping &lt;jid&gt;: Ping a user/component/server."),
2642 NULL); 2670 NULL);
2643 purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL, 2671 purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL,
2644 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY | 2672 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY |
2645 PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, 2673 PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
2646 "prpl-jabber", jabber_cmd_buzz, 2674 "prpl-jabber", jabber_cmd_buzz,
2647 _("buzz: Buzz a user to get their attention"), NULL); 2675 _("buzz: Buzz a user to get their attention"), NULL);
2648 } 2676 }
2649 2677

mercurial