Mercurial > pidgin
diff libpurple/protocols/jabber/data.c @ 29626:fce17268c9ec
jabber: Refactor BoB request code to reside inside data.c
TODO: add hash validation.
author | Marcus Lundblad <ml@update.uu.se> |
---|---|
date | Sun, 21 Mar 2010 19:39:40 +0000 |
parents | 41e557b8d38c |
children | 2b52480439ee 885ceb384678 |
line wrap: on
line diff
--- a/libpurple/protocols/jabber/data.c Sat Mar 20 16:20:35 2010 +0000 +++ b/libpurple/protocols/jabber/data.c Sun Mar 21 19:39:40 2010 +0000 @@ -165,7 +165,7 @@ return img; } -xmlnode * +static xmlnode * jabber_data_get_xml_request(const gchar *cid) { xmlnode *tag = xmlnode_new("data"); @@ -176,6 +176,70 @@ return tag; } + +typedef struct { + gpointer userdata; + gchar *alt; + gboolean ephemeral; + JabberDataRequestCallback *cb; +} JabberDataRequestData; + +static void +jabber_data_request_cb(JabberStream *js, const char *from, + JabberIqType type, const char *id, xmlnode *packet, gpointer data) +{ + JabberDataRequestData *request_data = (JabberDataRequestData *) data; + gpointer userdata = request_data->userdata; + gchar *alt = request_data->alt; + gboolean ephemeral = request_data->ephemeral; + JabberDataRequestCallback *cb = request_data->cb; + + xmlnode *data_element = xmlnode_get_child(packet, "data"); + xmlnode *item_not_found = xmlnode_get_child(packet, "item-not-found"); + + /* did we get a data element as result? */ + if (data_element && type == JABBER_IQ_RESULT) { + JabberData *data = jabber_data_create_from_xml(data_element); + + if (data) { + if (ephemeral) { + jabber_data_associate_remote(data); + } + /* TODO: validate hash */ + cb(data, alt, userdata); + } + } else if (item_not_found) { + purple_debug_info("jabber", + "Responder didn't recognize requested data\n"); + cb(NULL, alt, userdata); + } else { + purple_debug_error("jabber", "Unknown response to data request\n"); + cb(NULL, alt, userdata); + } + + g_free(request_data); +} + +void +jabber_data_request(JabberStream *js, const gchar *cid, const gchar *who, + gchar *alt, gboolean ephemeral, JabberDataRequestCallback cb, + gpointer userdata) +{ + JabberIq *request = jabber_iq_new(js, JABBER_IQ_GET); + xmlnode *data_request = jabber_data_get_xml_request(cid); + JabberDataRequestData *data = g_new0(JabberDataRequestData, 1); + + data->userdata = userdata; + data->alt = alt; + data->ephemeral = ephemeral; + data->cb = cb; + + xmlnode_set_attrib(request->node, "to", who); + jabber_iq_set_callback(request, jabber_data_request_cb, data); + xmlnode_insert_child(request->node, data_request); + jabber_iq_send(request); +} + const JabberData * jabber_data_find_local_by_alt(const gchar *alt) {