Mercurial > pidgin.yaz
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 <jid>: Ping a user/component/server."), | 2680 _("ping <jid>: 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 |