# HG changeset patch # User Paul Aurich # Date 1234080031 0 # Node ID 45c33d60c547b8dd223a52c5e616a80284d77b55 # Parent a4cba207068fefe7337e91ce1bdbce421134612c Retrieve and display buddy's local time in Get Info dialog diff -r a4cba207068f -r 45c33d60c547 libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Sun Feb 08 07:07:25 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.c Sun Feb 08 08:00:31 2009 +0000 @@ -155,6 +155,7 @@ jbr->jb = jb; jbr->name = g_strdup(resource); jbr->capabilities = JABBER_CAP_XHTML; + jbr->tz_off = PURPLE_NO_TZ_OFF; jb->resources = g_list_append(jb->resources, jbr); } jbr->priority = priority; @@ -800,7 +801,16 @@ if(jbr->client.os) { purple_notify_user_info_prepend_pair(user_info, _("Operating System"), jbr->client.os); } - } + } + if (jbr && jbr->tz_off != PURPLE_NO_TZ_OFF) { + time_t now_t; + struct tm *now; + time(&now_t); + now_t += jbr->tz_off; + now = gmtime(&now_t); + + purple_notify_user_info_add_pair(user_info, _("Local Time"), purple_time_format(now)); + } if(jbir) { if(jbir->idle_seconds > 0) { char *idle = purple_str_seconds_to_string(jbir->idle_seconds); @@ -971,6 +981,16 @@ } } + if (jbr->tz_off != PURPLE_NO_TZ_OFF) { + time_t now_t; + struct tm *now; + time(&now_t); + now_t += jbr->tz_off; + now = gmtime(&now_t); + + purple_notify_user_info_add_pair(user_info, _("Local Time"), purple_time_format(now)); + } + if(jbr->name && (jbir = g_hash_table_lookup(jbi->resources, jbr->name))) { if(jbir->idle_seconds > 0) { char *idle = purple_str_seconds_to_string(jbir->idle_seconds); @@ -1640,6 +1660,44 @@ jabber_buddy_info_show_if_ready(jbi); } +static void jabber_time_parse(JabberStream *js, xmlnode *packet, gpointer data) +{ + JabberBuddyInfo *jbi = data; + JabberBuddyResource *jbr; + char *resource_name; + const char *type, *id, *from; + + g_return_if_fail(jbi != NULL); + + id = xmlnode_get_attrib(packet, "id"); + type = xmlnode_get_attrib(packet, "type"); + from = xmlnode_get_attrib(packet, "from"); + + jabber_buddy_info_remove_id(jbi, id); + + if (!from) + return; + + resource_name = jabber_get_resource(from); + jbr = resource_name ? jabber_buddy_find_resource(jbi->jb, resource_name) : NULL; + if (resource_name && jbr) { + if (type && !strcmp(type, "result")) { + xmlnode *time = xmlnode_get_child(packet, "time"); + xmlnode *tzo = time ? xmlnode_get_child(packet, "tzo") : NULL; + xmlnode *utc = time ? xmlnode_get_child(packet, "utc") : NULL; + if (tzo && utc) { + char *timestamp = g_strdup_printf("%s %s", + xmlnode_get_data(utc), xmlnode_get_data(tzo)); + purple_str_to_time(timestamp, FALSE, NULL, &(jbr->tz_off), NULL); + g_free(timestamp); + } + } + g_free(resource_name); + } + + jabber_buddy_info_show_if_ready(jbi); +} + void jabber_buddy_remove_all_pending_buddy_info_requests(JabberStream *js) { if (js->pending_buddy_info_requests) @@ -1771,6 +1829,18 @@ jabber_iq_send(iq); } + if (jbr->tz_off == PURPLE_NO_TZ_OFF && + jabber_resource_has_capability(jbr, "urn:xmpp:time")) { + xmlnode *child; + iq = jabber_iq_new(js, JABBER_IQ_GET); + xmlnode_set_attrib(iq->node, "to", full_jid); + child = xmlnode_new_child(iq->node, "time"); + xmlnode_set_namespace(child, "urn:xmpp:time"); + jabber_iq_set_callback(iq, jabber_time_parse, jbi); + jbi->ids = g_slist_prepend(jbi->ids, g_strdup(iq->id)); + jabber_iq_send(iq); + } + g_free(full_jid); } diff -r a4cba207068f -r 45c33d60c547 libpurple/protocols/jabber/buddy.h --- a/libpurple/protocols/jabber/buddy.h Sun Feb 08 07:07:25 2009 +0000 +++ b/libpurple/protocols/jabber/buddy.h Sun Feb 08 08:00:31 2009 +0000 @@ -81,6 +81,8 @@ char *name; char *os; } client; + /* tz_off == PURPLE_NO_TZ_OFF when unset */ + long tz_off; JabberCapsClientInfo *caps; GList *commands; } JabberBuddyResource;