comparison src/protocols/jabber/jabber.c @ 13806:25e63008d3bb

[gaim-migrate @ 16229] Use libxml2 for XML parsing, if available. The biggest benefit from this is actual support for XML namespaces. This fixes a handful of Google Talk integration problems, including typing notifications and buddy icons. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Thu, 08 Jun 2006 01:03:51 +0000
parents 18808a4c99b0
children b9404076ef67
comparison
equal deleted inserted replaced
13805:853fefb07c79 13806:25e63008d3bb
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");