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);