Mercurial > pidgin.yaz
comparison libpurple/protocols/jabber/data.c @ 30027: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 |
comparison
equal
deleted
inserted
replaced
30025:eb72ae3357dc | 30027:fce17268c9ec |
---|---|
163 xmlnode_set_attrib(img, "src", src); | 163 xmlnode_set_attrib(img, "src", src); |
164 | 164 |
165 return img; | 165 return img; |
166 } | 166 } |
167 | 167 |
168 xmlnode * | 168 static xmlnode * |
169 jabber_data_get_xml_request(const gchar *cid) | 169 jabber_data_get_xml_request(const gchar *cid) |
170 { | 170 { |
171 xmlnode *tag = xmlnode_new("data"); | 171 xmlnode *tag = xmlnode_new("data"); |
172 | 172 |
173 xmlnode_set_namespace(tag, NS_BOB); | 173 xmlnode_set_namespace(tag, NS_BOB); |
174 xmlnode_set_attrib(tag, "cid", cid); | 174 xmlnode_set_attrib(tag, "cid", cid); |
175 | 175 |
176 return tag; | 176 return tag; |
177 } | |
178 | |
179 | |
180 typedef struct { | |
181 gpointer userdata; | |
182 gchar *alt; | |
183 gboolean ephemeral; | |
184 JabberDataRequestCallback *cb; | |
185 } JabberDataRequestData; | |
186 | |
187 static void | |
188 jabber_data_request_cb(JabberStream *js, const char *from, | |
189 JabberIqType type, const char *id, xmlnode *packet, gpointer data) | |
190 { | |
191 JabberDataRequestData *request_data = (JabberDataRequestData *) data; | |
192 gpointer userdata = request_data->userdata; | |
193 gchar *alt = request_data->alt; | |
194 gboolean ephemeral = request_data->ephemeral; | |
195 JabberDataRequestCallback *cb = request_data->cb; | |
196 | |
197 xmlnode *data_element = xmlnode_get_child(packet, "data"); | |
198 xmlnode *item_not_found = xmlnode_get_child(packet, "item-not-found"); | |
199 | |
200 /* did we get a data element as result? */ | |
201 if (data_element && type == JABBER_IQ_RESULT) { | |
202 JabberData *data = jabber_data_create_from_xml(data_element); | |
203 | |
204 if (data) { | |
205 if (ephemeral) { | |
206 jabber_data_associate_remote(data); | |
207 } | |
208 /* TODO: validate hash */ | |
209 cb(data, alt, userdata); | |
210 } | |
211 } else if (item_not_found) { | |
212 purple_debug_info("jabber", | |
213 "Responder didn't recognize requested data\n"); | |
214 cb(NULL, alt, userdata); | |
215 } else { | |
216 purple_debug_error("jabber", "Unknown response to data request\n"); | |
217 cb(NULL, alt, userdata); | |
218 } | |
219 | |
220 g_free(request_data); | |
221 } | |
222 | |
223 void | |
224 jabber_data_request(JabberStream *js, const gchar *cid, const gchar *who, | |
225 gchar *alt, gboolean ephemeral, JabberDataRequestCallback cb, | |
226 gpointer userdata) | |
227 { | |
228 JabberIq *request = jabber_iq_new(js, JABBER_IQ_GET); | |
229 xmlnode *data_request = jabber_data_get_xml_request(cid); | |
230 JabberDataRequestData *data = g_new0(JabberDataRequestData, 1); | |
231 | |
232 data->userdata = userdata; | |
233 data->alt = alt; | |
234 data->ephemeral = ephemeral; | |
235 data->cb = cb; | |
236 | |
237 xmlnode_set_attrib(request->node, "to", who); | |
238 jabber_iq_set_callback(request, jabber_data_request_cb, data); | |
239 xmlnode_insert_child(request->node, data_request); | |
240 jabber_iq_send(request); | |
177 } | 241 } |
178 | 242 |
179 const JabberData * | 243 const JabberData * |
180 jabber_data_find_local_by_alt(const gchar *alt) | 244 jabber_data_find_local_by_alt(const gchar *alt) |
181 { | 245 { |