comparison libpurple/protocols/jabber/jabber.c @ 27931:d8e6a2d592a4

propagate from branch 'im.pidgin.pidgin' (head 66190c21dfe7125476caca3c14725bac9db8b71b) to branch 'im.pidgin.pidgin.yaz' (head 30f1655106c7764e3f9cfc8a139784d9b0bd4459)
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Tue, 03 Mar 2009 06:57:02 +0000
parents 25319f536d93 5f9a24d1c25e
children f44832c6a65b
comparison
equal deleted inserted replaced
27930:25319f536d93 27931:d8e6a2d592a4
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."));
467 { 467 {
468 JabberStream *js = gc->proto_data; 468 JabberStream *js = gc->proto_data;
469 469
470 if (js->keepalive_timeout == -1) { 470 if (js->keepalive_timeout == -1) {
471 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_GET); 471 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_GET);
472 472
473 xmlnode *ping = xmlnode_new_child(iq->node, "ping"); 473 xmlnode *ping = xmlnode_new_child(iq->node, "ping");
474 xmlnode_set_namespace(ping, "urn:xmpp:ping"); 474 xmlnode_set_namespace(ping, "urn:xmpp:ping");
475 475
476 js->keepalive_timeout = purple_timeout_add_seconds(120, (GSourceFunc)(jabber_pong_timeout), gc); 476 js->keepalive_timeout = purple_timeout_add_seconds(120, (GSourceFunc)(jabber_pong_timeout), gc);
477 jabber_iq_set_callback(iq, jabber_pong_cb, NULL); 477 jabber_iq_set_callback(iq, jabber_pong_cb, NULL);
478 jabber_iq_send(iq); 478 jabber_iq_send(iq);
479 } 479 }
480 } 480 }
578 578
579 if(js->state == JABBER_STREAM_CONNECTING) 579 if(js->state == JABBER_STREAM_CONNECTING)
580 jabber_send_raw(js, "<?xml version='1.0' ?>", -1); 580 jabber_send_raw(js, "<?xml version='1.0' ?>", -1);
581 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); 581 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING);
582 purple_ssl_input_add(gsc, jabber_recv_cb_ssl, gc); 582 purple_ssl_input_add(gsc, jabber_recv_cb_ssl, gc);
583 583
584 /* Tell the app that we're doing encryption */ 584 /* Tell the app that we're doing encryption */
585 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION); 585 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION);
586 } 586 }
587 587
588 588
736 purple_connection_error_reason (gc, 736 purple_connection_error_reason (gc,
737 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, 737 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
738 _("Invalid XMPP ID")); 738 _("Invalid XMPP ID"));
739 return; 739 return;
740 } 740 }
741 741
742 if (!js->user->domain || *(js->user->domain) == '\0') { 742 if (!js->user->domain || *(js->user->domain) == '\0') {
743 purple_connection_error_reason (gc, 743 purple_connection_error_reason (gc,
744 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, 744 PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
745 _("Invalid XMPP ID. Domain must be set.")); 745 _("Invalid XMPP ID. Domain must be set."));
746 return; 746 return;
747 } 747 }
748 748
749 if((my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE))) 749 if((my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE)))
750 my_jb->subscription |= JABBER_SUB_BOTH; 750 my_jb->subscription |= JABBER_SUB_BOTH;
751 751
752 jabber_stream_set_state(js, JABBER_STREAM_CONNECTING); 752 jabber_stream_set_state(js, JABBER_STREAM_CONNECTING);
753 753
853 purple_notify_info(NULL, _("Unregistration Successful"), 853 purple_notify_info(NULL, _("Unregistration Successful"),
854 _("Unregistration Successful"), buf); 854 _("Unregistration Successful"), buf);
855 g_free(buf); 855 g_free(buf);
856 } else { 856 } else {
857 char *msg = jabber_parse_error(js, packet, NULL); 857 char *msg = jabber_parse_error(js, packet, NULL);
858 858
859 if(!msg) 859 if(!msg)
860 msg = g_strdup(_("Unknown Error")); 860 msg = g_strdup(_("Unknown Error"));
861 861
862 purple_notify_error(NULL, _("Unregistration Failed"), 862 purple_notify_error(NULL, _("Unregistration Failed"),
863 _("Unregistration Failed"), msg); 863 _("Unregistration Failed"), msg);
864 g_free(msg); 864 g_free(msg);
865 } 865 }
866 g_free(to); 866 g_free(to);
899 iq = jabber_iq_new_query(cbdata->js, JABBER_IQ_SET, "jabber:iq:register"); 899 iq = jabber_iq_new_query(cbdata->js, JABBER_IQ_SET, "jabber:iq:register");
900 query = xmlnode_get_child(iq->node, "query"); 900 query = xmlnode_get_child(iq->node, "query");
901 if (cbdata->who) 901 if (cbdata->who)
902 xmlnode_set_attrib(iq->node,"to",cbdata->who); 902 xmlnode_set_attrib(iq->node,"to",cbdata->who);
903 xmlnode_new_child(query, "remove"); 903 xmlnode_new_child(query, "remove");
904 904
905 jabber_iq_set_callback(iq, jabber_unregistration_result_cb, cbdata->who); 905 jabber_iq_set_callback(iq, jabber_unregistration_result_cb, cbdata->who);
906 906
907 jabber_iq_send(iq); 907 jabber_iq_send(iq);
908 g_free(cbdata); 908 g_free(cbdata);
909 return; 909 return;
910 } 910 }
911 } else { 911 } else {
1031 (account->registration_cb)(account, FALSE, account->registration_cb_user_data); 1031 (account->registration_cb)(account, FALSE, account->registration_cb_user_data);
1032 jabber_connection_schedule_close(js); 1032 jabber_connection_schedule_close(js);
1033 return; 1033 return;
1034 } 1034 }
1035 } 1035 }
1036 1036
1037 if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:data"))) { 1037 if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:data"))) {
1038 jabber_x_data_request(js, x, jabber_register_x_data_cb, g_strdup(from)); 1038 jabber_x_data_request(js, x, jabber_register_x_data_cb, g_strdup(from));
1039 return; 1039 return;
1040 1040
1041 } else if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:oob"))) { 1041 } else if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:oob"))) {
1182 jabber_iq_send(iq); 1182 jabber_iq_send(iq);
1183 } 1183 }
1184 1184
1185 void jabber_register_gateway(JabberStream *js, const char *gateway) { 1185 void jabber_register_gateway(JabberStream *js, const char *gateway) {
1186 JabberIq *iq; 1186 JabberIq *iq;
1187 1187
1188 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:register"); 1188 iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:register");
1189 xmlnode_set_attrib(iq->node, "to", gateway); 1189 xmlnode_set_attrib(iq->node, "to", gateway);
1190 jabber_iq_send(iq); 1190 jabber_iq_send(iq);
1191 } 1191 }
1192 1192
1257 static void jabber_unregister_account_iq_cb(JabberStream *js, xmlnode *packet, gpointer data) { 1257 static void jabber_unregister_account_iq_cb(JabberStream *js, xmlnode *packet, gpointer data) {
1258 PurpleAccount *account = purple_connection_get_account(js->gc); 1258 PurpleAccount *account = purple_connection_get_account(js->gc);
1259 const char *type = xmlnode_get_attrib(packet,"type"); 1259 const char *type = xmlnode_get_attrib(packet,"type");
1260 if(!strcmp(type,"error")) { 1260 if(!strcmp(type,"error")) {
1261 char *msg = jabber_parse_error(js, packet, NULL); 1261 char *msg = jabber_parse_error(js, packet, NULL);
1262 1262
1263 purple_notify_error(js->gc, _("Error unregistering account"), 1263 purple_notify_error(js->gc, _("Error unregistering account"),
1264 _("Error unregistering account"), msg); 1264 _("Error unregistering account"), msg);
1265 g_free(msg); 1265 g_free(msg);
1266 if(js->unregistration_cb) 1266 if(js->unregistration_cb)
1267 js->unregistration_cb(account, FALSE, js->unregistration_user_data); 1267 js->unregistration_cb(account, FALSE, js->unregistration_user_data);
1291 } 1291 }
1292 1292
1293 void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data) { 1293 void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data) {
1294 PurpleConnection *gc = purple_account_get_connection(account); 1294 PurpleConnection *gc = purple_account_get_connection(account);
1295 JabberStream *js; 1295 JabberStream *js;
1296 1296
1297 if(gc->state != PURPLE_CONNECTED) { 1297 if(gc->state != PURPLE_CONNECTED) {
1298 if(gc->state != PURPLE_CONNECTING) 1298 if(gc->state != PURPLE_CONNECTING)
1299 jabber_login(account); 1299 jabber_login(account);
1300 js = gc->proto_data; 1300 js = gc->proto_data;
1301 js->unregistration = TRUE; 1301 js->unregistration = TRUE;
1302 js->unregistration_cb = cb; 1302 js->unregistration_cb = cb;
1303 js->unregistration_user_data = user_data; 1303 js->unregistration_user_data = user_data;
1304 return; 1304 return;
1305 } 1305 }
1306 1306
1307 js = gc->proto_data; 1307 js = gc->proto_data;
1308 1308
1309 if (js->unregistration) { 1309 if (js->unregistration) {
1310 purple_debug_error("jabber", "Unregistration in process; ignoring duplicate request.\n"); 1310 purple_debug_error("jabber", "Unregistration in process; ignoring duplicate request.\n");
1311 return; 1311 return;
1602 1602
1603 feat = g_new0(JabberFeature,1); 1603 feat = g_new0(JabberFeature,1);
1604 feat->shortname = g_strdup(shortname); 1604 feat->shortname = g_strdup(shortname);
1605 feat->namespace = g_strdup(namespace); 1605 feat->namespace = g_strdup(namespace);
1606 feat->is_enabled = cb; 1606 feat->is_enabled = cb;
1607 1607
1608 /* try to remove just in case it already exists in the list */ 1608 /* try to remove just in case it already exists in the list */
1609 jabber_remove_feature(shortname); 1609 jabber_remove_feature(shortname);
1610 1610
1611 jabber_features = g_list_append(jabber_features, feat); 1611 jabber_features = g_list_append(jabber_features, feat);
1612 } 1612 }
1613 1613
1614 void jabber_remove_feature(const char *shortname) { 1614 void jabber_remove_feature(const char *shortname) {
1615 GList *feature; 1615 GList *feature;
1616 for(feature = jabber_features; feature; feature = feature->next) { 1616 for(feature = jabber_features; feature; feature = feature->next) {
1617 JabberFeature *feat = (JabberFeature*)feature->data; 1617 JabberFeature *feat = (JabberFeature*)feature->data;
1618 if(!strcmp(feat->shortname, shortname)) { 1618 if(!strcmp(feat->shortname, shortname)) {
1619 g_free(feat->shortname); 1619 g_free(feat->shortname);
1620 g_free(feat->namespace); 1620 g_free(feat->namespace);
1621 1621
1622 g_free(feature->data); 1622 g_free(feature->data);
1623 jabber_features = g_list_delete_link(jabber_features, feature); 1623 jabber_features = g_list_delete_link(jabber_features, feature);
1624 break; 1624 break;
1625 } 1625 }
1626 } 1626 }
1633 1633
1634 const char* jabber_list_emblem(PurpleBuddy *b) 1634 const char* jabber_list_emblem(PurpleBuddy *b)
1635 { 1635 {
1636 JabberStream *js; 1636 JabberStream *js;
1637 JabberBuddy *jb = NULL; 1637 JabberBuddy *jb = NULL;
1638 1638 PurpleConnection *gc = purple_account_get_connection(purple_buddy_get_account(b));
1639 if(!b->account->gc) 1639
1640 if(!gc)
1640 return NULL; 1641 return NULL;
1641 1642
1642 js = b->account->gc->proto_data; 1643 js = gc->proto_data;
1643 if(js) 1644 if(js)
1644 jb = jabber_buddy_find(js, b->name, FALSE); 1645 jb = jabber_buddy_find(js, purple_buddy_get_name(b), FALSE);
1645 1646
1646 if(!PURPLE_BUDDY_IS_ONLINE(b)) { 1647 if(!PURPLE_BUDDY_IS_ONLINE(b)) {
1647 if(jb && (jb->subscription & JABBER_SUB_PENDING || 1648 if(jb && (jb->subscription & JABBER_SUB_PENDING ||
1648 !(jb->subscription & JABBER_SUB_TO))) 1649 !(jb->subscription & JABBER_SUB_TO)))
1649 return "not-authorized"; 1650 return "not-authorized";
1653 1654
1654 char *jabber_status_text(PurpleBuddy *b) 1655 char *jabber_status_text(PurpleBuddy *b)
1655 { 1656 {
1656 char *ret = NULL; 1657 char *ret = NULL;
1657 JabberBuddy *jb = NULL; 1658 JabberBuddy *jb = NULL;
1658 1659 PurpleAccount *account = purple_buddy_get_account(b);
1659 if (b->account->gc && b->account->gc->proto_data) 1660 PurpleConnection *gc = purple_account_get_connection(account);
1660 jb = jabber_buddy_find(b->account->gc->proto_data, b->name, FALSE); 1661
1662 if (gc && gc->proto_data)
1663 jb = jabber_buddy_find(gc->proto_data, purple_buddy_get_name(b), FALSE);
1661 1664
1662 if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && (jb->subscription & JABBER_SUB_PENDING || !(jb->subscription & JABBER_SUB_TO))) { 1665 if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && (jb->subscription & JABBER_SUB_PENDING || !(jb->subscription & JABBER_SUB_TO))) {
1663 ret = g_strdup(_("Not Authorized")); 1666 ret = g_strdup(_("Not Authorized"));
1664 } else if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) { 1667 } else if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) {
1665 ret = g_strdup(jb->error_msg); 1668 ret = g_strdup(jb->error_msg);
1692 } 1695 }
1693 1696
1694 void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full) 1697 void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full)
1695 { 1698 {
1696 JabberBuddy *jb; 1699 JabberBuddy *jb;
1700 PurpleAccount *account;
1701 PurpleConnection *gc;
1697 1702
1698 g_return_if_fail(b != NULL); 1703 g_return_if_fail(b != NULL);
1699 g_return_if_fail(b->account != NULL); 1704
1700 g_return_if_fail(b->account->gc != NULL); 1705 account = purple_buddy_get_account(b);
1701 g_return_if_fail(b->account->gc->proto_data != NULL); 1706 g_return_if_fail(account != NULL);
1702 1707
1703 jb = jabber_buddy_find(b->account->gc->proto_data, b->name, 1708 gc = purple_account_get_connection(account);
1704 FALSE); 1709 g_return_if_fail(gc != NULL);
1710 g_return_if_fail(gc->proto_data != NULL);
1711
1712 jb = jabber_buddy_find(gc->proto_data, purple_buddy_get_name(b), FALSE);
1705 1713
1706 if(jb) { 1714 if(jb) {
1707 JabberBuddyResource *jbr = NULL; 1715 JabberBuddyResource *jbr = NULL;
1708 PurplePresence *presence = purple_buddy_get_presence(b); 1716 PurplePresence *presence = purple_buddy_get_presence(b);
1709 const char *sub; 1717 const char *sub;
1808 GList *jabber_status_types(PurpleAccount *account) 1816 GList *jabber_status_types(PurpleAccount *account)
1809 { 1817 {
1810 PurpleStatusType *type; 1818 PurpleStatusType *type;
1811 GList *types = NULL; 1819 GList *types = NULL;
1812 PurpleValue *priority_value; 1820 PurpleValue *priority_value;
1821 PurpleValue *buzz_enabled;
1813 1822
1814 priority_value = purple_value_new(PURPLE_TYPE_INT); 1823 priority_value = purple_value_new(PURPLE_TYPE_INT);
1815 purple_value_set_int(priority_value, 1); 1824 purple_value_set_int(priority_value, 1);
1825 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1826 purple_value_set_boolean(buzz_enabled, TRUE);
1816 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, 1827 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
1817 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_ONLINE), 1828 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_ONLINE),
1818 NULL, TRUE, TRUE, FALSE, 1829 NULL, TRUE, TRUE, FALSE,
1819 "priority", _("Priority"), priority_value, 1830 "priority", _("Priority"), priority_value,
1820 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1831 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1821 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1832 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1822 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1833 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1823 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1834 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1824 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), 1835 "buzz", _("Allow Buzz"), buzz_enabled,
1825 NULL); 1836 NULL);
1826 types = g_list_append(types, type); 1837 types = g_list_append(types, type);
1827 1838
1828 priority_value = purple_value_new(PURPLE_TYPE_INT); 1839 priority_value = purple_value_new(PURPLE_TYPE_INT);
1829 purple_value_set_int(priority_value, 1); 1840 purple_value_set_int(priority_value, 1);
1841 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1842 purple_value_set_boolean(buzz_enabled, TRUE);
1830 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE, 1843 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AVAILABLE,
1831 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT), 1844 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT),
1832 _("Chatty"), TRUE, TRUE, FALSE, 1845 _("Chatty"), TRUE, TRUE, FALSE,
1833 "priority", _("Priority"), priority_value, 1846 "priority", _("Priority"), priority_value,
1834 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1847 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1835 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1848 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1836 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1849 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1837 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1850 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1838 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), 1851 "buzz", _("Allow Buzz"), buzz_enabled,
1839 NULL); 1852 NULL);
1840 types = g_list_append(types, type); 1853 types = g_list_append(types, type);
1841 1854
1842 priority_value = purple_value_new(PURPLE_TYPE_INT); 1855 priority_value = purple_value_new(PURPLE_TYPE_INT);
1843 purple_value_set_int(priority_value, 0); 1856 purple_value_set_int(priority_value, 0);
1857 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1858 purple_value_set_boolean(buzz_enabled, TRUE);
1844 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY, 1859 type = purple_status_type_new_with_attrs(PURPLE_STATUS_AWAY,
1845 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY), 1860 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY),
1846 NULL, TRUE, TRUE, FALSE, 1861 NULL, TRUE, TRUE, FALSE,
1847 "priority", _("Priority"), priority_value, 1862 "priority", _("Priority"), priority_value,
1848 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1863 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1849 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1864 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1850 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1865 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1851 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1866 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1852 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), 1867 "buzz", _("Allow Buzz"), buzz_enabled,
1853 NULL); 1868 NULL);
1854 types = g_list_append(types, type); 1869 types = g_list_append(types, type);
1855 1870
1856 priority_value = purple_value_new(PURPLE_TYPE_INT); 1871 priority_value = purple_value_new(PURPLE_TYPE_INT);
1857 purple_value_set_int(priority_value, 0); 1872 purple_value_set_int(priority_value, 0);
1873 buzz_enabled = purple_value_new(PURPLE_TYPE_BOOLEAN);
1874 purple_value_set_boolean(buzz_enabled, TRUE);
1858 type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY, 1875 type = purple_status_type_new_with_attrs(PURPLE_STATUS_EXTENDED_AWAY,
1859 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA), 1876 jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA),
1860 NULL, TRUE, TRUE, FALSE, 1877 NULL, TRUE, TRUE, FALSE,
1861 "priority", _("Priority"), priority_value, 1878 "priority", _("Priority"), priority_value,
1862 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1879 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1863 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1880 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1864 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1881 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1865 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1882 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1866 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN), 1883 "buzz", _("Allow Buzz"), buzz_enabled,
1867 NULL); 1884 NULL);
1868 types = g_list_append(types, type); 1885 types = g_list_append(types, type);
1869 1886
1870 priority_value = purple_value_new(PURPLE_TYPE_INT); 1887 priority_value = purple_value_new(PURPLE_TYPE_INT);
1871 purple_value_set_int(priority_value, 0); 1888 purple_value_set_int(priority_value, 0);
1875 "priority", _("Priority"), priority_value, 1892 "priority", _("Priority"), priority_value,
1876 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), 1893 "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
1877 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING), 1894 "mood", _("Mood"), purple_value_new(PURPLE_TYPE_STRING),
1878 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING), 1895 "moodtext", _("Mood Text"), purple_value_new(PURPLE_TYPE_STRING),
1879 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING), 1896 "nick", _("Nickname"), purple_value_new(PURPLE_TYPE_STRING),
1880 "buzz", _("Allow Buzz"), purple_value_new(PURPLE_TYPE_BOOLEAN),
1881 NULL); 1897 NULL);
1882 types = g_list_append(types, type); 1898 types = g_list_append(types, type);
1883 1899
1884 /* 1900 /*
1885 if(js->protocol_version == JABBER_PROTO_0_9) 1901 if(js->protocol_version == JABBER_PROTO_0_9)
2021 2037
2022 purple_debug_info("jabber", "jabber_actions: have pep: %s\n", js->pep?"YES":"NO"); 2038 purple_debug_info("jabber", "jabber_actions: have pep: %s\n", js->pep?"YES":"NO");
2023 2039
2024 if(js->pep) 2040 if(js->pep)
2025 jabber_pep_init_actions(&m); 2041 jabber_pep_init_actions(&m);
2026 2042
2027 if(js->commands) 2043 if(js->commands)
2028 jabber_adhoc_init_server_commands(js, &m); 2044 jabber_adhoc_init_server_commands(js, &m);
2029 2045
2030 return m; 2046 return m;
2031 } 2047 }
2036 JabberID *jid; 2052 JabberID *jid;
2037 2053
2038 if(!(jid = jabber_id_new(name))) 2054 if(!(jid = jabber_id_new(name)))
2039 return NULL; 2055 return NULL;
2040 2056
2041 for(gnode = purple_get_blist()->root; gnode; gnode = gnode->next) { 2057 for(gnode = purple_blist_get_root(); gnode;
2042 for(cnode = gnode->child; cnode; cnode = cnode->next) { 2058 gnode = purple_blist_node_get_sibling_next(gnode)) {
2059 for(cnode = purple_blist_node_get_first_child(gnode);
2060 cnode;
2061 cnode = purple_blist_node_get_sibling_next(cnode)) {
2043 PurpleChat *chat = (PurpleChat*)cnode; 2062 PurpleChat *chat = (PurpleChat*)cnode;
2044 const char *room, *server; 2063 const char *room, *server;
2064 GHashTable *components;
2045 if(!PURPLE_BLIST_NODE_IS_CHAT(cnode)) 2065 if(!PURPLE_BLIST_NODE_IS_CHAT(cnode))
2046 continue; 2066 continue;
2047 2067
2048 if(chat->account != account) 2068 if (purple_chat_get_account(chat) != account)
2049 continue; 2069 continue;
2050 2070
2051 if(!(room = g_hash_table_lookup(chat->components, "room"))) 2071 components = purple_chat_get_components(chat);
2072 if(!(room = g_hash_table_lookup(components, "room")))
2052 continue; 2073 continue;
2053 if(!(server = g_hash_table_lookup(chat->components, "server"))) 2074 if(!(server = g_hash_table_lookup(components, "server")))
2054 continue; 2075 continue;
2055 2076
2056 if(jid->node && jid->domain && 2077 if(jid->node && jid->domain &&
2057 !g_utf8_collate(room, jid->node) && !g_utf8_collate(server, jid->domain)) { 2078 !g_utf8_collate(room, jid->node) && !g_utf8_collate(server, jid->domain)) {
2058 jabber_id_free(jid); 2079 jabber_id_free(jid);
2068 { 2089 {
2069 JabberStream *js = gc->proto_data; 2090 JabberStream *js = gc->proto_data;
2070 JabberID *jid; 2091 JabberID *jid;
2071 JabberBuddy *jb; 2092 JabberBuddy *jb;
2072 JabberBuddyResource *jbr; 2093 JabberBuddyResource *jbr;
2073 2094
2074 if(!(jid = jabber_id_new(who))) 2095 if(!(jid = jabber_id_new(who)))
2075 return; 2096 return;
2076 2097
2077 if((jb = jabber_buddy_find(js, who, TRUE)) && 2098 if((jb = jabber_buddy_find(js, who, TRUE)) &&
2078 (jbr = jabber_buddy_find_resource(jb, jid->resource))) { 2099 (jbr = jabber_buddy_find_resource(jb, jid->resource))) {
2329 JabberChat *chat = jabber_chat_find_by_conv(conv); 2350 JabberChat *chat = jabber_chat_find_by_conv(conv);
2330 2351
2331 if (!chat || !args || !args[0] || !args[1]) 2352 if (!chat || !args || !args[0] || !args[1])
2332 return PURPLE_CMD_RET_FAILED; 2353 return PURPLE_CMD_RET_FAILED;
2333 2354
2334 if (strcmp(args[1], "owner") != 0 && 2355 if (strcmp(args[1], "owner") != 0 &&
2335 strcmp(args[1], "admin") != 0 && 2356 strcmp(args[1], "admin") != 0 &&
2336 strcmp(args[1], "member") != 0 && 2357 strcmp(args[1], "member") != 0 &&
2337 strcmp(args[1], "outcast") != 0 && 2358 strcmp(args[1], "outcast") != 0 &&
2338 strcmp(args[1], "none") != 0) { 2359 strcmp(args[1], "none") != 0) {
2339 *error = g_strdup_printf(_("Unknown affiliation: \"%s\""), args[1]); 2360 *error = g_strdup_printf(_("Unknown affiliation: \"%s\""), args[1]);
2458 2479
2459 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) { 2480 static gboolean _jabber_send_buzz(JabberStream *js, const char *username, char **error) {
2460 2481
2461 JabberBuddy *jb; 2482 JabberBuddy *jb;
2462 JabberBuddyResource *jbr; 2483 JabberBuddyResource *jbr;
2463 GList *iter; 2484 PurpleConnection *gc = js->gc;
2485 PurpleBuddy *buddy =
2486 purple_find_buddy(purple_connection_get_account(gc), username);
2487 const gchar *alias =
2488 buddy ? purple_buddy_get_contact_alias(buddy) : username;
2464 2489
2465 if(!username) 2490 if(!username)
2466 return FALSE; 2491 return FALSE;
2467 2492
2468 jb = jabber_buddy_find(js, username, FALSE); 2493 jb = jabber_buddy_find(js, username, FALSE);
2469 if(!jb) { 2494 if(!jb) {
2470 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); 2495 *error = g_strdup_printf(_("Unable to buzz, because there is nothing "
2496 "known about %s."), alias);
2471 return FALSE; 2497 return FALSE;
2472 } 2498 }
2473 2499
2474 jbr = jabber_buddy_find_resource(jb, NULL); 2500 jbr = jabber_buddy_find_resource(jb, NULL);
2475 if(!jbr) { 2501 if (!jbr) {
2476 *error = g_strdup_printf(_("Unable to buzz, because user %s might be offline."), username); 2502 *error = g_strdup_printf(_("Unable to buzz, because %s might be offline."),
2503 alias);
2477 return FALSE; 2504 return FALSE;
2478 } 2505 }
2479 2506
2480 if(!jbr->caps) { 2507 if (jabber_resource_has_capability(jbr, XEP_0224_NAMESPACE)) {
2481 *error = g_strdup_printf(_("Unable to buzz, because there is nothing known about user %s."), username); 2508 xmlnode *buzz, *msg = xmlnode_new("message");
2509 gchar *to;
2510
2511 to = g_strdup_printf("%s/%s", username, jbr->name);
2512 xmlnode_set_attrib(msg, "to", to);
2513 g_free(to);
2514
2515 /* avoid offline storage */
2516 xmlnode_set_attrib(msg, "type", "headline");
2517
2518 buzz = xmlnode_new_child(msg, "attention");
2519 xmlnode_set_namespace(buzz, XEP_0224_NAMESPACE);
2520
2521 jabber_send(js, msg);
2522 xmlnode_free(msg);
2523
2524 return TRUE;
2525 } else {
2526 *error = g_strdup_printf(_("Unable to buzz, because %s does "
2527 "not support it or do not wish to receive buzzes now."), alias);
2482 return FALSE; 2528 return FALSE;
2483 } 2529 }
2484
2485 for(iter = jbr->caps->features; iter; iter = g_list_next(iter)) {
2486 if(!strcmp(iter->data, "http://www.xmpp.org/extensions/xep-0224.html#ns")) {
2487 xmlnode *buzz, *msg = xmlnode_new("message");
2488 gchar *to;
2489
2490 to = g_strdup_printf("%s/%s", username, jbr->name);
2491 xmlnode_set_attrib(msg, "to", to);
2492 g_free(to);
2493
2494 /* avoid offline storage */
2495 xmlnode_set_attrib(msg, "type", "headline");
2496
2497 buzz = xmlnode_new_child(msg, "attention");
2498 xmlnode_set_namespace(buzz, "http://www.xmpp.org/extensions/xep-0224.html#ns");
2499
2500 jabber_send(js, msg);
2501 xmlnode_free(msg);
2502
2503 return TRUE;
2504 }
2505 }
2506
2507 *error = g_strdup_printf(_("Unable to buzz, because the user %s does not support it."), username);
2508 return FALSE;
2509 } 2530 }
2510 2531
2511 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, 2532 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv,
2512 const char *cmd, char **args, char **error, void *data) 2533 const char *cmd, char **args, char **error, void *data)
2513 { 2534 {
2514 JabberStream *js = conv->account->gc->proto_data; 2535 JabberStream *js = conv->account->gc->proto_data;
2515 2536 const gchar *who;
2516 if(!args || !args[0]) 2537
2538 if (!args || !args[0]) {
2539 /* use the buddy from conversation, if it's a one-to-one conversation */
2540 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
2541 who = purple_conversation_get_name(conv);
2542 } else {
2543 return PURPLE_CMD_RET_FAILED;
2544 }
2545 } else {
2546 who = args[0];
2547 }
2548
2549 if (_jabber_send_buzz(js, who, error)) {
2550 const gchar *alias;
2551 gchar *str;
2552 PurpleBuddy *buddy =
2553 purple_find_buddy(purple_connection_get_account(conv->account->gc),
2554 who);
2555
2556 if (buddy != NULL)
2557 alias = purple_buddy_get_contact_alias(buddy);
2558 else
2559 alias = who;
2560
2561 str = g_strdup_printf(_("Buzzing %s..."), alias);
2562 purple_conversation_write(conv, NULL, str,
2563 PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
2564 g_free(str);
2565
2566 return PURPLE_CMD_RET_OK;
2567 } else {
2517 return PURPLE_CMD_RET_FAILED; 2568 return PURPLE_CMD_RET_FAILED;
2518 2569 }
2519 return _jabber_send_buzz(js, args[0], error) ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED;
2520 } 2570 }
2521 2571
2522 GList *jabber_attention_types(PurpleAccount *account) 2572 GList *jabber_attention_types(PurpleAccount *account)
2523 { 2573 {
2524 static GList *types = NULL; 2574 static GList *types = NULL;
2627 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM | 2677 PURPLE_CMD_FLAG_CHAT | PURPLE_CMD_FLAG_IM |
2628 PURPLE_CMD_FLAG_PRPL_ONLY, 2678 PURPLE_CMD_FLAG_PRPL_ONLY,
2629 "prpl-jabber", jabber_cmd_ping, 2679 "prpl-jabber", jabber_cmd_ping,
2630 _("ping &lt;jid&gt;: Ping a user/component/server."), 2680 _("ping &lt;jid&gt;: Ping a user/component/server."),
2631 NULL); 2681 NULL);
2632 purple_cmd_register("buzz", "s", PURPLE_CMD_P_PRPL, 2682 purple_cmd_register("buzz", "w", PURPLE_CMD_P_PRPL,
2633 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY, 2683 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY |
2684 PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS,
2634 "prpl-jabber", jabber_cmd_buzz, 2685 "prpl-jabber", jabber_cmd_buzz,
2635 _("buzz: Buzz a user to get their attention"), NULL); 2686 _("buzz: Buzz a user to get their attention"), NULL);
2636 } 2687 }
2637 2688
2638 void 2689 void