Mercurial > pidgin
comparison libpurple/protocols/jabber/iq.c @ 18684:5c1ed6296b56
propagate from branch 'im.pidgin.pidgin' (head b195e262642015df66e36d33e9dd16ecae5df9d5)
to branch 'im.pidgin.soc.2007.xmpp' (head 06f9dbd73b69e26dc9f56873a9ce106146bb1b18)
author | Andreas Monitzer <pidgin@monitzer.com> |
---|---|
date | Wed, 11 Jul 2007 22:27:44 +0000 |
parents | feac55968392 c58b83d2b188 |
children | 413103ddeaac |
comparison
equal
deleted
inserted
replaced
17907:8d2ea5072f6f | 18684:5c1ed6296b56 |
---|---|
17 * along with this program; if not, write to the Free Software | 17 * along with this program; if not, write to the Free Software |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 * | 19 * |
20 */ | 20 */ |
21 #include "internal.h" | 21 #include "internal.h" |
22 #include "core.h" | |
22 #include "debug.h" | 23 #include "debug.h" |
23 #include "prefs.h" | 24 #include "prefs.h" |
24 #include "util.h" | 25 #include "util.h" |
25 | 26 |
26 #include "buddy.h" | 27 #include "buddy.h" |
169 } | 170 } |
170 } | 171 } |
171 | 172 |
172 static void jabber_iq_time_parse(JabberStream *js, xmlnode *packet) | 173 static void jabber_iq_time_parse(JabberStream *js, xmlnode *packet) |
173 { | 174 { |
174 const char *type, *from, *id; | 175 const char *type, *from, *id, *xmlns; |
175 JabberIq *iq; | 176 JabberIq *iq; |
176 xmlnode *query; | 177 xmlnode *query; |
177 time_t now_t; | 178 time_t now_t; |
178 struct tm *now; | 179 struct tm *now; |
179 | 180 |
182 | 183 |
183 type = xmlnode_get_attrib(packet, "type"); | 184 type = xmlnode_get_attrib(packet, "type"); |
184 from = xmlnode_get_attrib(packet, "from"); | 185 from = xmlnode_get_attrib(packet, "from"); |
185 id = xmlnode_get_attrib(packet, "id"); | 186 id = xmlnode_get_attrib(packet, "id"); |
186 | 187 |
188 /* we're gonna throw this away in a moment, but we need it | |
189 * to get the xmlns, so we can figure out if this is | |
190 * jabber:iq:time or urn:xmpp:time */ | |
191 query = xmlnode_get_child(packet, "query"); | |
192 xmlns = xmlnode_get_namespace(query); | |
193 | |
187 if(type && !strcmp(type, "get")) { | 194 if(type && !strcmp(type, "get")) { |
195 xmlnode *utc; | |
188 const char *date; | 196 const char *date; |
189 | 197 |
190 iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, "jabber:iq:time"); | 198 iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, xmlns); |
191 jabber_iq_set_id(iq, id); | 199 jabber_iq_set_id(iq, id); |
192 xmlnode_set_attrib(iq->node, "to", from); | 200 xmlnode_set_attrib(iq->node, "to", from); |
193 | 201 |
194 query = xmlnode_get_child(iq->node, "query"); | 202 query = xmlnode_get_child(iq->node, "query"); |
195 | 203 |
196 date = purple_utf8_strftime("%Y%m%dT%T", now); | 204 date = purple_utf8_strftime("%Y%m%dT%T", now); |
197 xmlnode_insert_data(xmlnode_new_child(query, "utc"), date, -1); | 205 utc = xmlnode_new_child(query, "utc"); |
198 | 206 xmlnode_insert_data(utc, date, -1); |
199 date = purple_utf8_strftime("%Z", now); | 207 |
200 xmlnode_insert_data(xmlnode_new_child(query, "tz"), date, -1); | 208 if(!strcmp("urn:xmpp:time", xmlns)) { |
201 | 209 xmlnode_insert_data(utc, "Z", 1); /* of COURSE the thing that is the same is different */ |
202 date = purple_utf8_strftime("%d %b %Y %T", now); | 210 |
203 xmlnode_insert_data(xmlnode_new_child(query, "display"), date, -1); | 211 date = purple_get_tzoff_str(now, TRUE); |
212 xmlnode_insert_data(xmlnode_new_child(query, "tzo"), date, -1); | |
213 } else { /* jabber:iq:time */ | |
214 date = purple_utf8_strftime("%Z", now); | |
215 xmlnode_insert_data(xmlnode_new_child(query, "tz"), date, -1); | |
216 | |
217 date = purple_utf8_strftime("%d %b %Y %T", now); | |
218 xmlnode_insert_data(xmlnode_new_child(query, "display"), date, -1); | |
219 } | |
204 | 220 |
205 jabber_iq_send(iq); | 221 jabber_iq_send(iq); |
222 } | |
223 } | |
224 | |
225 static void urn_xmpp_ping_parse(JabberStream *js, xmlnode *packet) | |
226 { | |
227 const char *type, *id, *from; | |
228 JabberIq *iq; | |
229 | |
230 type = xmlnode_get_attrib(packet, "type"); | |
231 from = xmlnode_get_attrib(packet, "from"); | |
232 id = xmlnode_get_attrib(packet, "id"); | |
233 | |
234 if(type && !strcmp(type, "get")) { | |
235 iq = jabber_iq_new_query(js, JABBER_IQ_RESULT, "urn:xmpp:ping"); | |
236 | |
237 jabber_iq_set_id(iq, id); | |
238 xmlnode_set_attrib(iq->node, "to", from); | |
239 | |
240 jabber_iq_send(iq); | |
241 } else { | |
242 /* XXX: error */ | |
206 } | 243 } |
207 } | 244 } |
208 | 245 |
209 static void jabber_iq_version_parse(JabberStream *js, xmlnode *packet) | 246 static void jabber_iq_version_parse(JabberStream *js, xmlnode *packet) |
210 { | 247 { |
214 char *os = NULL; | 251 char *os = NULL; |
215 | 252 |
216 type = xmlnode_get_attrib(packet, "type"); | 253 type = xmlnode_get_attrib(packet, "type"); |
217 | 254 |
218 if(type && !strcmp(type, "get")) { | 255 if(type && !strcmp(type, "get")) { |
256 GHashTable *ui_info; | |
257 const char *ui_name = NULL, *ui_version = NULL; | |
219 | 258 |
220 if(!purple_prefs_get_bool("/plugins/prpl/jabber/hide_os")) { | 259 if(!purple_prefs_get_bool("/plugins/prpl/jabber/hide_os")) { |
221 struct utsname osinfo; | 260 struct utsname osinfo; |
222 | 261 |
223 uname(&osinfo); | 262 uname(&osinfo); |
232 xmlnode_set_attrib(iq->node, "to", from); | 271 xmlnode_set_attrib(iq->node, "to", from); |
233 jabber_iq_set_id(iq, id); | 272 jabber_iq_set_id(iq, id); |
234 | 273 |
235 query = xmlnode_get_child(iq->node, "query"); | 274 query = xmlnode_get_child(iq->node, "query"); |
236 | 275 |
237 xmlnode_insert_data(xmlnode_new_child(query, "name"), PACKAGE, -1); | 276 ui_info = purple_core_get_ui_info(); |
238 xmlnode_insert_data(xmlnode_new_child(query, "version"), VERSION, -1); | 277 |
278 if(NULL != ui_info) { | |
279 ui_name = g_hash_table_lookup(ui_info, "name"); | |
280 ui_version = g_hash_table_lookup(ui_info, "version"); | |
281 } | |
282 | |
283 if(NULL != ui_name && NULL != ui_version) { | |
284 char *version_complete = g_strdup_printf("%s (libpurple " VERSION ")", ui_version); | |
285 xmlnode_insert_data(xmlnode_new_child(query, "name"), ui_name, -1); | |
286 xmlnode_insert_data(xmlnode_new_child(query, "version"), version_complete, -1); | |
287 g_free(version_complete); | |
288 } else { | |
289 xmlnode_insert_data(xmlnode_new_child(query, "name"), "libpurple", -1); | |
290 xmlnode_insert_data(xmlnode_new_child(query, "version"), VERSION, -1); | |
291 } | |
292 | |
239 if(os) { | 293 if(os) { |
240 xmlnode_insert_data(xmlnode_new_child(query, "os"), os, -1); | 294 xmlnode_insert_data(xmlnode_new_child(query, "os"), os, -1); |
241 g_free(os); | 295 g_free(os); |
242 } | 296 } |
243 | 297 |
330 jabber_iq_register_handler("jabber:iq:roster", jabber_roster_parse); | 384 jabber_iq_register_handler("jabber:iq:roster", jabber_roster_parse); |
331 jabber_iq_register_handler("jabber:iq:oob", jabber_oob_parse); | 385 jabber_iq_register_handler("jabber:iq:oob", jabber_oob_parse); |
332 jabber_iq_register_handler("http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse); | 386 jabber_iq_register_handler("http://jabber.org/protocol/bytestreams", jabber_bytestreams_parse); |
333 jabber_iq_register_handler("jabber:iq:last", jabber_iq_last_parse); | 387 jabber_iq_register_handler("jabber:iq:last", jabber_iq_last_parse); |
334 jabber_iq_register_handler("jabber:iq:time", jabber_iq_time_parse); | 388 jabber_iq_register_handler("jabber:iq:time", jabber_iq_time_parse); |
389 jabber_iq_register_handler("urn:xmpp:time", jabber_iq_time_parse); | |
335 jabber_iq_register_handler("jabber:iq:version", jabber_iq_version_parse); | 390 jabber_iq_register_handler("jabber:iq:version", jabber_iq_version_parse); |
336 jabber_iq_register_handler("http://jabber.org/protocol/disco#info", jabber_disco_info_parse); | 391 jabber_iq_register_handler("http://jabber.org/protocol/disco#info", jabber_disco_info_parse); |
337 jabber_iq_register_handler("http://jabber.org/protocol/disco#items", jabber_disco_items_parse); | 392 jabber_iq_register_handler("http://jabber.org/protocol/disco#items", jabber_disco_items_parse); |
338 jabber_iq_register_handler("jabber:iq:register", jabber_register_parse); | 393 jabber_iq_register_handler("jabber:iq:register", jabber_register_parse); |
394 jabber_iq_register_handler("urn:xmpp:ping", urn_xmpp_ping_parse); | |
339 } | 395 } |
340 | 396 |
341 void jabber_iq_uninit(void) | 397 void jabber_iq_uninit(void) |
342 { | 398 { |
343 g_hash_table_destroy(iq_handlers); | 399 g_hash_table_destroy(iq_handlers); |