| 61 open_stream = g_strdup_printf("<stream:stream to='%s' " |
61 open_stream = g_strdup_printf("<stream:stream to='%s' " |
| 62 "xmlns='jabber:client' " |
62 "xmlns='jabber:client' " |
| 63 "xmlns:stream='http://etherx.jabber.org/streams' " |
63 "xmlns:stream='http://etherx.jabber.org/streams' " |
| 64 "version='1.0'>", |
64 "version='1.0'>", |
| 65 js->user->domain); |
65 js->user->domain); |
| 66 |
66 /* setup the parser fresh for each stream */ |
| |
67 jabber_parser_setup(js); |
| 67 jabber_send_raw(js, open_stream, -1); |
68 jabber_send_raw(js, open_stream, -1); |
| 68 |
|
| 69 g_free(open_stream); |
69 g_free(open_stream); |
| 70 } |
70 } |
| 71 |
71 |
| 72 static void |
72 static void |
| 73 jabber_session_initialized_cb(JabberStream *js, xmlnode *packet, gpointer data) |
73 jabber_session_initialized_cb(JabberStream *js, xmlnode *packet, gpointer data) |
| 86 xmlnode *session; |
86 xmlnode *session; |
| 87 |
87 |
| 88 jabber_iq_set_callback(iq, jabber_session_initialized_cb, NULL); |
88 jabber_iq_set_callback(iq, jabber_session_initialized_cb, NULL); |
| 89 |
89 |
| 90 session = xmlnode_new_child(iq->node, "session"); |
90 session = xmlnode_new_child(iq->node, "session"); |
| 91 xmlnode_set_attrib(session, "xmlns", "urn:ietf:params:xml:ns:xmpp-session"); |
91 xmlnode_set_namespace(session, "urn:ietf:params:xml:ns:xmpp-session"); |
| 92 |
92 |
| 93 jabber_iq_send(iq); |
93 jabber_iq_send(iq); |
| 94 } |
94 } |
| 95 |
95 |
| 96 static void jabber_bind_result_cb(JabberStream *js, xmlnode *packet, |
96 static void jabber_bind_result_cb(JabberStream *js, xmlnode *packet, |
| 135 jabber_auth_start(js, packet); |
135 jabber_auth_start(js, packet); |
| 136 } else if(xmlnode_get_child(packet, "bind")) { |
136 } else if(xmlnode_get_child(packet, "bind")) { |
| 137 xmlnode *bind, *resource; |
137 xmlnode *bind, *resource; |
| 138 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_SET); |
138 JabberIq *iq = jabber_iq_new(js, JABBER_IQ_SET); |
| 139 bind = xmlnode_new_child(iq->node, "bind"); |
139 bind = xmlnode_new_child(iq->node, "bind"); |
| 140 xmlnode_set_attrib(bind, "xmlns", "urn:ietf:params:xml:ns:xmpp-bind"); |
140 xmlnode_set_namespace(bind, "urn:ietf:params:xml:ns:xmpp-bind"); |
| 141 resource = xmlnode_new_child(bind, "resource"); |
141 resource = xmlnode_new_child(bind, "resource"); |
| 142 xmlnode_insert_data(resource, js->user->resource, -1); |
142 xmlnode_insert_data(resource, js->user->resource, -1); |
| 143 |
143 |
| 144 jabber_iq_set_callback(iq, jabber_bind_result_cb, NULL); |
144 jabber_iq_set_callback(iq, jabber_bind_result_cb, NULL); |
| 145 |
145 |
| 172 jabber_presence_parse(js, packet); |
172 jabber_presence_parse(js, packet); |
| 173 } else if(!strcmp(packet->name, "message")) { |
173 } else if(!strcmp(packet->name, "message")) { |
| 174 jabber_message_parse(js, packet); |
174 jabber_message_parse(js, packet); |
| 175 } else if(!strcmp(packet->name, "stream:features")) { |
175 } else if(!strcmp(packet->name, "stream:features")) { |
| 176 jabber_stream_features_parse(js, packet); |
176 jabber_stream_features_parse(js, packet); |
| |
177 } else if (!strcmp(packet->name, "features") && |
| |
178 !strcmp(xmlnode_get_namespace(packet), "http://etherx.jabber.org/streams")) { |
| |
179 jabber_stream_features_parse(js, packet); |
| 177 } else if(!strcmp(packet->name, "stream:error")) { |
180 } else if(!strcmp(packet->name, "stream:error")) { |
| |
181 jabber_stream_handle_error(js, packet); |
| |
182 } else if (!strcmp(packet->name, "error") && |
| |
183 !strcmp(xmlnode_get_namespace(packet), "http://etherx.jabber.org/streams")) { |
| 178 jabber_stream_handle_error(js, packet); |
184 jabber_stream_handle_error(js, packet); |
| 179 } else if(!strcmp(packet->name, "challenge")) { |
185 } else if(!strcmp(packet->name, "challenge")) { |
| 180 if(js->state == JABBER_STREAM_AUTHENTICATING) |
186 if(js->state == JABBER_STREAM_AUTHENTICATING) |
| 181 jabber_auth_handle_challenge(js, packet); |
187 jabber_auth_handle_challenge(js, packet); |
| 182 } else if(!strcmp(packet->name, "success")) { |
188 } else if(!strcmp(packet->name, "success")) { |
| 403 |
409 |
| 404 js->gsc = gsc; |
410 js->gsc = gsc; |
| 405 |
411 |
| 406 if(js->state == JABBER_STREAM_CONNECTING) |
412 if(js->state == JABBER_STREAM_CONNECTING) |
| 407 jabber_send_raw(js, "<?xml version='1.0' ?>", -1); |
413 jabber_send_raw(js, "<?xml version='1.0' ?>", -1); |
| 408 |
|
| 409 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); |
414 jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING); |
| 410 gaim_ssl_input_add(gsc, jabber_recv_cb_ssl, gc); |
415 gaim_ssl_input_add(gsc, jabber_recv_cb_ssl, gc); |
| 411 } |
416 } |
| 412 |
417 |
| 413 |
418 |
| 921 } else if (js->fd > 0) { |
926 } else if (js->fd > 0) { |
| 922 if(js->gc->inpa) |
927 if(js->gc->inpa) |
| 923 gaim_input_remove(js->gc->inpa); |
928 gaim_input_remove(js->gc->inpa); |
| 924 close(js->fd); |
929 close(js->fd); |
| 925 } |
930 } |
| 926 |
931 #ifndef HAVE_LIBXML |
| 927 if(js->context) |
932 if(js->context) |
| 928 g_markup_parse_context_free(js->context); |
933 g_markup_parse_context_free(js->context); |
| |
934 #endif |
| 929 if(js->iq_callbacks) |
935 if(js->iq_callbacks) |
| 930 g_hash_table_destroy(js->iq_callbacks); |
936 g_hash_table_destroy(js->iq_callbacks); |
| 931 if(js->disco_callbacks) |
937 if(js->disco_callbacks) |
| 932 g_hash_table_destroy(js->disco_callbacks); |
938 g_hash_table_destroy(js->disco_callbacks); |
| 933 if(js->buddies) |
939 if(js->buddies) |
| 979 break; |
985 break; |
| 980 case JABBER_STREAM_INITIALIZING: |
986 case JABBER_STREAM_INITIALIZING: |
| 981 gaim_connection_update_progress(js->gc, _("Initializing Stream"), |
987 gaim_connection_update_progress(js->gc, _("Initializing Stream"), |
| 982 js->gsc ? 5 : 2, JABBER_CONNECT_STEPS); |
988 js->gsc ? 5 : 2, JABBER_CONNECT_STEPS); |
| 983 jabber_stream_init(js); |
989 jabber_stream_init(js); |
| 984 jabber_parser_setup(js); |
|
| 985 break; |
990 break; |
| 986 case JABBER_STREAM_AUTHENTICATING: |
991 case JABBER_STREAM_AUTHENTICATING: |
| 987 gaim_connection_update_progress(js->gc, _("Authenticating"), |
992 gaim_connection_update_progress(js->gc, _("Authenticating"), |
| 988 js->gsc ? 6 : 3, JABBER_CONNECT_STEPS); |
993 js->gsc ? 6 : 3, JABBER_CONNECT_STEPS); |
| 989 if(js->protocol_version == JABBER_PROTO_0_9 && js->registration) { |
994 if(js->protocol_version == JABBER_PROTO_0_9 && js->registration) { |
| 1398 |
1403 |
| 1399 char *jabber_parse_error(JabberStream *js, xmlnode *packet) |
1404 char *jabber_parse_error(JabberStream *js, xmlnode *packet) |
| 1400 { |
1405 { |
| 1401 xmlnode *error; |
1406 xmlnode *error; |
| 1402 const char *code = NULL, *text = NULL; |
1407 const char *code = NULL, *text = NULL; |
| 1403 const char *xmlns = xmlnode_get_attrib(packet, "xmlns"); |
1408 const char *xmlns = xmlnode_get_namespace(packet); |
| 1404 char *cdata = NULL; |
1409 char *cdata = NULL; |
| 1405 |
1410 |
| 1406 if((error = xmlnode_get_child(packet, "error"))) { |
1411 if((error = xmlnode_get_child(packet, "error"))) { |
| 1407 cdata = xmlnode_get_data(error); |
1412 cdata = xmlnode_get_data(error); |
| 1408 code = xmlnode_get_attrib(error, "code"); |
1413 code = xmlnode_get_attrib(error, "code"); |