Mercurial > pidgin.yaz
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"); |