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 {