libpurple/protocols/jabber/jabber.c

changeset 32277
97f16af01a05
parent 32191
a4668d9dc8d1
child 32300
59a31f9f67fc
equal deleted inserted replaced
32276:abc0b7c0cb86 32277:97f16af01a05
614 purple_signal_emit(purple_connection_get_prpl(js->gc), "jabber-sending-xmlnode", js->gc, &packet); 614 purple_signal_emit(purple_connection_get_prpl(js->gc), "jabber-sending-xmlnode", js->gc, &packet);
615 } 615 }
616 616
617 static gboolean jabber_keepalive_timeout(PurpleConnection *gc) 617 static gboolean jabber_keepalive_timeout(PurpleConnection *gc)
618 { 618 {
619 JabberStream *js = gc->proto_data; 619 JabberStream *js = purple_connection_get_protocol_data(gc);
620 purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 620 purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
621 _("Ping timed out")); 621 _("Ping timed out"));
622 js->keepalive_timeout = 0; 622 js->keepalive_timeout = 0;
623 return FALSE; 623 return FALSE;
624 } 624 }
640 static void 640 static void
641 jabber_recv_cb_ssl(gpointer data, PurpleSslConnection *gsc, 641 jabber_recv_cb_ssl(gpointer data, PurpleSslConnection *gsc,
642 PurpleInputCondition cond) 642 PurpleInputCondition cond)
643 { 643 {
644 PurpleConnection *gc = data; 644 PurpleConnection *gc = data;
645 JabberStream *js = gc->proto_data; 645 JabberStream *js = purple_connection_get_protocol_data(gc);
646 int len; 646 int len;
647 static char buf[4096]; 647 static char buf[4096];
648 648
649 /* TODO: It should be possible to make this check unnecessary */ 649 /* TODO: It should be possible to make this check unnecessary */
650 if(!PURPLE_CONNECTION_IS_VALID(gc)) { 650 if(!PURPLE_CONNECTION_IS_VALID(gc)) {
745 if(!PURPLE_CONNECTION_IS_VALID(gc)) { 745 if(!PURPLE_CONNECTION_IS_VALID(gc)) {
746 purple_ssl_close(gsc); 746 purple_ssl_close(gsc);
747 g_return_if_reached(); 747 g_return_if_reached();
748 } 748 }
749 749
750 js = gc->proto_data; 750 js = purple_connection_get_protocol_data(gc);
751 751
752 if(js->state == JABBER_STREAM_CONNECTING) 752 if(js->state == JABBER_STREAM_CONNECTING)
753 jabber_send_raw(js, "<?xml version='1.0' ?>", -1); 753 jabber_send_raw(js, "<?xml version='1.0' ?>", -1);
754 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); 754 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING);
755 purple_ssl_input_add(gsc, jabber_recv_cb_ssl, gc); 755 purple_ssl_input_add(gsc, jabber_recv_cb_ssl, gc);
840 JabberStream *js; 840 JabberStream *js;
841 841
842 /* If the connection is already disconnected, we don't need to do anything else */ 842 /* If the connection is already disconnected, we don't need to do anything else */
843 g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc)); 843 g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc));
844 844
845 js = gc->proto_data; 845 js = purple_connection_get_protocol_data(gc);
846 js->gsc = NULL; 846 js->gsc = NULL;
847 847
848 purple_connection_ssl_error (gc, error); 848 purple_connection_ssl_error (gc, error);
849 } 849 }
850 850
926 JabberStream *js; 926 JabberStream *js;
927 PurplePresence *presence; 927 PurplePresence *presence;
928 gchar *user; 928 gchar *user;
929 gchar *slash; 929 gchar *slash;
930 930
931 js = gc->proto_data = g_new0(JabberStream, 1); 931 js = g_new0(JabberStream, 1);
932 purple_connection_set_protocol_data(gc, js);
932 js->gc = gc; 933 js->gc = gc;
933 js->fd = -1; 934 js->fd = -1;
934 935
935 user = g_strdup(purple_account_get_username(account)); 936 user = g_strdup(purple_account_get_username(account));
936 /* jabber_id_new doesn't accept "user@domain/" as valid */ 937 /* jabber_id_new doesn't accept "user@domain/" as valid */
1557 JabberStream *js; 1558 JabberStream *js;
1558 1559
1559 if(gc->state != PURPLE_CONNECTED) { 1560 if(gc->state != PURPLE_CONNECTED) {
1560 if(gc->state != PURPLE_CONNECTING) 1561 if(gc->state != PURPLE_CONNECTING)
1561 jabber_login(account); 1562 jabber_login(account);
1562 js = gc->proto_data; 1563 js = purple_connection_get_protocol_data(gc);
1563 js->unregistration = TRUE; 1564 js->unregistration = TRUE;
1564 js->unregistration_cb = cb; 1565 js->unregistration_cb = cb;
1565 js->unregistration_user_data = user_data; 1566 js->unregistration_user_data = user_data;
1566 return; 1567 return;
1567 } 1568 }
1568 1569
1569 js = gc->proto_data; 1570 js = purple_connection_get_protocol_data(gc);
1570 1571
1571 if (js->unregistration) { 1572 if (js->unregistration) {
1572 purple_debug_error("jabber", "Unregistration in process; ignoring duplicate request.\n"); 1573 purple_debug_error("jabber", "Unregistration in process; ignoring duplicate request.\n");
1573 return; 1574 return;
1574 } 1575 }
1724 } 1725 }
1725 } 1726 }
1726 1727
1727 g_free(js); 1728 g_free(js);
1728 1729
1729 gc->proto_data = NULL; 1730 purple_connection_set_protocol_data(gc, NULL);
1730 } 1731 }
1731 1732
1732 void jabber_stream_set_state(JabberStream *js, JabberStreamState state) 1733 void jabber_stream_set_state(JabberStream *js, JabberStreamState state)
1733 { 1734 {
1734 #define JABBER_CONNECT_STEPS ((js->gsc || js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION) ? 9 : 5) 1735 #define JABBER_CONNECT_STEPS ((js->gsc || js->state == JABBER_STREAM_INITIALIZING_ENCRYPTION) ? 9 : 5)
1778 } 1779 }
1779 1780
1780 1781
1781 void jabber_idle_set(PurpleConnection *gc, int idle) 1782 void jabber_idle_set(PurpleConnection *gc, int idle)
1782 { 1783 {
1783 JabberStream *js = gc->proto_data; 1784 JabberStream *js = purple_connection_get_protocol_data(gc);
1784 1785
1785 js->idle = idle ? time(NULL) - idle : idle; 1786 js->idle = idle ? time(NULL) - idle : idle;
1786 1787
1787 /* send out an updated prescence */ 1788 /* send out an updated prescence */
1788 purple_debug_info("jabber", "sending updated presence for idle\n"); 1789 purple_debug_info("jabber", "sending updated presence for idle\n");
2131 PurpleConnection *gc = purple_account_get_connection(purple_buddy_get_account(b)); 2132 PurpleConnection *gc = purple_account_get_connection(purple_buddy_get_account(b));
2132 2133
2133 if(!gc) 2134 if(!gc)
2134 return NULL; 2135 return NULL;
2135 2136
2136 js = gc->proto_data; 2137 js = purple_connection_get_protocol_data(gc);
2137 if(js) 2138 if(js)
2138 jb = jabber_buddy_find(js, purple_buddy_get_name(b), FALSE); 2139 jb = jabber_buddy_find(js, purple_buddy_get_name(b), FALSE);
2139 2140
2140 if(!PURPLE_BUDDY_IS_ONLINE(b)) { 2141 if(!PURPLE_BUDDY_IS_ONLINE(b)) {
2141 if(jb && (jb->subscription & JABBER_SUB_PENDING || 2142 if(jb && (jb->subscription & JABBER_SUB_PENDING ||
2172 char *ret = NULL; 2173 char *ret = NULL;
2173 JabberBuddy *jb = NULL; 2174 JabberBuddy *jb = NULL;
2174 PurpleAccount *account = purple_buddy_get_account(b); 2175 PurpleAccount *account = purple_buddy_get_account(b);
2175 PurpleConnection *gc = purple_account_get_connection(account); 2176 PurpleConnection *gc = purple_account_get_connection(account);
2176 2177
2177 if (gc && gc->proto_data) 2178 if (gc && purple_connection_get_protocol_data(gc))
2178 jb = jabber_buddy_find(gc->proto_data, purple_buddy_get_name(b), FALSE); 2179 jb = jabber_buddy_find(purple_connection_get_protocol_data(gc), purple_buddy_get_name(b), FALSE);
2179 2180
2180 if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && (jb->subscription & JABBER_SUB_PENDING || !(jb->subscription & JABBER_SUB_TO))) { 2181 if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && (jb->subscription & JABBER_SUB_PENDING || !(jb->subscription & JABBER_SUB_TO))) {
2181 ret = g_strdup(_("Not Authorized")); 2182 ret = g_strdup(_("Not Authorized"));
2182 } else if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) { 2183 } else if(jb && !PURPLE_BUDDY_IS_ONLINE(b) && jb->error_msg) {
2183 ret = g_strdup(jb->error_msg); 2184 ret = g_strdup(jb->error_msg);
2248 void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full) 2249 void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full)
2249 { 2250 {
2250 JabberBuddy *jb; 2251 JabberBuddy *jb;
2251 PurpleAccount *account; 2252 PurpleAccount *account;
2252 PurpleConnection *gc; 2253 PurpleConnection *gc;
2254 JabberStream *js;
2253 2255
2254 g_return_if_fail(b != NULL); 2256 g_return_if_fail(b != NULL);
2255 2257
2256 account = purple_buddy_get_account(b); 2258 account = purple_buddy_get_account(b);
2257 g_return_if_fail(account != NULL); 2259 g_return_if_fail(account != NULL);
2258 2260
2259 gc = purple_account_get_connection(account); 2261 gc = purple_account_get_connection(account);
2260 g_return_if_fail(gc != NULL); 2262 g_return_if_fail(gc != NULL);
2261 g_return_if_fail(gc->proto_data != NULL); 2263
2262 2264 js = purple_connection_get_protocol_data(gc);
2263 jb = jabber_buddy_find(gc->proto_data, purple_buddy_get_name(b), FALSE); 2265 g_return_if_fail(js != NULL);
2266
2267 jb = jabber_buddy_find(js, purple_buddy_get_name(b), FALSE);
2264 2268
2265 if(jb) { 2269 if(jb) {
2266 JabberBuddyResource *jbr = NULL; 2270 JabberBuddyResource *jbr = NULL;
2267 PurplePresence *presence = purple_buddy_get_presence(b); 2271 PurplePresence *presence = purple_buddy_get_presence(b);
2268 const char *sub; 2272 const char *sub;
2529 2533
2530 static void jabber_password_change(PurplePluginAction *action) 2534 static void jabber_password_change(PurplePluginAction *action)
2531 { 2535 {
2532 2536
2533 PurpleConnection *gc = (PurpleConnection *) action->context; 2537 PurpleConnection *gc = (PurpleConnection *) action->context;
2534 JabberStream *js = gc->proto_data; 2538 JabberStream *js = purple_connection_get_protocol_data(gc);
2535 PurpleRequestFields *fields; 2539 PurpleRequestFields *fields;
2536 PurpleRequestFieldGroup *group; 2540 PurpleRequestFieldGroup *group;
2537 PurpleRequestField *field; 2541 PurpleRequestField *field;
2538 2542
2539 fields = purple_request_fields_new(); 2543 fields = purple_request_fields_new();
2561 } 2565 }
2562 2566
2563 GList *jabber_actions(PurplePlugin *plugin, gpointer context) 2567 GList *jabber_actions(PurplePlugin *plugin, gpointer context)
2564 { 2568 {
2565 PurpleConnection *gc = (PurpleConnection *) context; 2569 PurpleConnection *gc = (PurpleConnection *) context;
2566 JabberStream *js = gc->proto_data; 2570 JabberStream *js = purple_connection_get_protocol_data(gc);
2567 GList *m = NULL; 2571 GList *m = NULL;
2568 PurplePluginAction *act; 2572 PurplePluginAction *act;
2569 2573
2570 act = purple_plugin_action_new(_("Set User Info..."), 2574 act = purple_plugin_action_new(_("Set User Info..."),
2571 jabber_setup_set_info); 2575 jabber_setup_set_info);
2632 return NULL; 2636 return NULL;
2633 } 2637 }
2634 2638
2635 void jabber_convo_closed(PurpleConnection *gc, const char *who) 2639 void jabber_convo_closed(PurpleConnection *gc, const char *who)
2636 { 2640 {
2637 JabberStream *js = gc->proto_data; 2641 JabberStream *js = purple_connection_get_protocol_data(gc);
2638 JabberID *jid; 2642 JabberID *jid;
2639 JabberBuddy *jb; 2643 JabberBuddy *jb;
2640 JabberBuddyResource *jbr; 2644 JabberBuddyResource *jbr;
2641 2645
2642 if(!(jid = jabber_id_new(who))) 2646 if(!(jid = jabber_id_new(who)))
3157 } 3161 }
3158 3162
3159 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv, 3163 static PurpleCmdRet jabber_cmd_buzz(PurpleConversation *conv,
3160 const char *cmd, char **args, char **error, void *data) 3164 const char *cmd, char **args, char **error, void *data)
3161 { 3165 {
3162 JabberStream *js = conv->account->gc->proto_data; 3166 JabberStream *js = purple_connection_get_protocol_data(conv->account->gc);
3163 const gchar *who; 3167 const gchar *who;
3164 gchar *description; 3168 gchar *description;
3165 PurpleBuddy *buddy; 3169 PurpleBuddy *buddy;
3166 const char *alias; 3170 const char *alias;
3167 PurpleAttentionType *attn = 3171 PurpleAttentionType *attn =
3204 return types; 3208 return types;
3205 } 3209 }
3206 3210
3207 gboolean jabber_send_attention(PurpleConnection *gc, const char *username, guint code) 3211 gboolean jabber_send_attention(PurpleConnection *gc, const char *username, guint code)
3208 { 3212 {
3209 JabberStream *js = gc->proto_data; 3213 JabberStream *js = purple_connection_get_protocol_data(gc);
3210 gchar *error = NULL; 3214 gchar *error = NULL;
3211 3215
3212 if (!_jabber_send_buzz(js, username, &error)) { 3216 if (!_jabber_send_buzz(js, username, &error)) {
3213 PurpleAccount *account = purple_connection_get_account(gc); 3217 PurpleAccount *account = purple_connection_get_account(gc);
3214 PurpleConversation *conv = 3218 PurpleConversation *conv =
3287 gboolean 3291 gboolean
3288 jabber_initiate_media(PurpleAccount *account, const char *who, 3292 jabber_initiate_media(PurpleAccount *account, const char *who,
3289 PurpleMediaSessionType type) 3293 PurpleMediaSessionType type)
3290 { 3294 {
3291 #ifdef USE_VV 3295 #ifdef USE_VV
3292 JabberStream *js = (JabberStream *) 3296 PurpleConnection *gc = purple_account_get_connection(account);
3293 purple_account_get_connection(account)->proto_data; 3297 JabberStream *js = purple_connection_get_protocol_data(gc);
3294 JabberBuddy *jb; 3298 JabberBuddy *jb;
3295 JabberBuddyResource *jbr = NULL; 3299 JabberBuddyResource *jbr = NULL;
3296 char *resource; 3300 char *resource;
3297 3301
3298 if (!js) { 3302 if (!js) {
3299 purple_debug_error("jabber", 3303 purple_debug_error("jabber",
3300 "jabber_initiate_media: NULL stream\n"); 3304 "jabber_initiate_media: NULL stream\n");
3301 return FALSE; 3305 return FALSE;
3302 } 3306 }
3303
3304 3307
3305 if((resource = jabber_get_resource(who)) != NULL) { 3308 if((resource = jabber_get_resource(who)) != NULL) {
3306 /* they've specified a resource, no need to ask or 3309 /* they've specified a resource, no need to ask or
3307 * default or anything, just do it */ 3310 * default or anything, just do it */
3308 3311
3430 } 3433 }
3431 3434
3432 PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who) 3435 PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who)
3433 { 3436 {
3434 #ifdef USE_VV 3437 #ifdef USE_VV
3435 JabberStream *js = (JabberStream *) 3438 PurpleConnection *gc = purple_account_get_connection(account);
3436 purple_account_get_connection(account)->proto_data; 3439 JabberStream *js = purple_connection_get_protocol_data(gc);
3437 JabberBuddy *jb; 3440 JabberBuddy *jb;
3438 JabberBuddyResource *jbr; 3441 JabberBuddyResource *jbr;
3439 PurpleMediaCaps total = PURPLE_MEDIA_CAPS_NONE; 3442 PurpleMediaCaps total = PURPLE_MEDIA_CAPS_NONE;
3440 gchar *resource; 3443 gchar *resource;
3441 GList *specific = NULL, *l; 3444 GList *specific = NULL, *l;
3519 #endif 3522 #endif
3520 } 3523 }
3521 3524
3522 gboolean jabber_can_receive_file(PurpleConnection *gc, const char *who) 3525 gboolean jabber_can_receive_file(PurpleConnection *gc, const char *who)
3523 { 3526 {
3524 JabberStream *js = gc->proto_data; 3527 JabberStream *js = purple_connection_get_protocol_data(gc);
3525 3528
3526 if (js) { 3529 if (js) {
3527 JabberBuddy *jb = jabber_buddy_find(js, who, FALSE); 3530 JabberBuddy *jb = jabber_buddy_find(js, who, FALSE);
3528 GList *iter; 3531 GList *iter;
3529 gboolean has_resources_without_caps = FALSE; 3532 gboolean has_resources_without_caps = FALSE;
3569 3572
3570 static PurpleCmdRet 3573 static PurpleCmdRet
3571 jabber_cmd_mood(PurpleConversation *conv, 3574 jabber_cmd_mood(PurpleConversation *conv,
3572 const char *cmd, char **args, char **error, void *data) 3575 const char *cmd, char **args, char **error, void *data)
3573 { 3576 {
3574 JabberStream *js = conv->account->gc->proto_data; 3577 JabberStream *js = purple_connection_get_protocol_data(conv->account->gc);
3575 3578
3576 if (js->pep) { 3579 if (js->pep) {
3577 /* if no argument was given, unset mood */ 3580 /* if no argument was given, unset mood */
3578 if (!args || !args[0]) { 3581 if (!args || !args[0]) {
3579 jabber_mood_set(js, NULL, NULL); 3582 jabber_mood_set(js, NULL, NULL);
3753 JabberBuddyResource *jbr; 3756 JabberBuddyResource *jbr;
3754 gchar *resource; 3757 gchar *resource;
3755 3758
3756 if (!purple_account_is_connected(account)) 3759 if (!purple_account_is_connected(account))
3757 return FALSE; 3760 return FALSE;
3758 js = gc->proto_data; 3761 js = purple_connection_get_protocol_data(gc);
3759 3762
3760 if (!(resource = jabber_get_resource(jid)) || 3763 if (!(resource = jabber_get_resource(jid)) ||
3761 !(jb = jabber_buddy_find(js, jid, FALSE)) || 3764 !(jb = jabber_buddy_find(js, jid, FALSE)) ||
3762 !(jbr = jabber_buddy_find_resource(jb, resource))) { 3765 !(jbr = jabber_buddy_find_resource(jb, resource))) {
3763 g_free(resource); 3766 g_free(resource);

mercurial