| 41 static void jingle_rawudp_class_init (JingleRawUdpClass *klass); |
41 static void jingle_rawudp_class_init (JingleRawUdpClass *klass); |
| 42 static void jingle_rawudp_init (JingleRawUdp *rawudp); |
42 static void jingle_rawudp_init (JingleRawUdp *rawudp); |
| 43 static void jingle_rawudp_finalize (GObject *object); |
43 static void jingle_rawudp_finalize (GObject *object); |
| 44 static void jingle_rawudp_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
44 static void jingle_rawudp_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
| 45 static void jingle_rawudp_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); |
45 static void jingle_rawudp_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); |
| 46 static JingleTransport *jingle_rawudp_parse_internal(xmlnode *rawudp); |
46 static JingleTransport *jingle_rawudp_parse_internal(PurpleXmlNode *rawudp); |
| 47 static xmlnode *jingle_rawudp_to_xml_internal(JingleTransport *transport, xmlnode *content, JingleActionType action); |
47 static PurpleXmlNode *jingle_rawudp_to_xml_internal(JingleTransport *transport, PurpleXmlNode *content, JingleActionType action); |
| 48 static void jingle_rawudp_add_local_candidate(JingleTransport *transport, const gchar *id, guint generation, PurpleMediaCandidate *candidate); |
48 static void jingle_rawudp_add_local_candidate(JingleTransport *transport, const gchar *id, guint generation, PurpleMediaCandidate *candidate); |
| 49 static GList *jingle_rawudp_get_remote_candidates(JingleTransport *transport); |
49 static GList *jingle_rawudp_get_remote_candidates(JingleTransport *transport); |
| 50 |
50 |
| 51 static JingleTransportClass *parent_class = NULL; |
51 static JingleTransportClass *parent_class = NULL; |
| 52 |
52 |
| 302 } |
302 } |
| 303 priv->remote_candidates = g_list_append(priv->remote_candidates, candidate); |
303 priv->remote_candidates = g_list_append(priv->remote_candidates, candidate); |
| 304 } |
304 } |
| 305 |
305 |
| 306 static JingleTransport * |
306 static JingleTransport * |
| 307 jingle_rawudp_parse_internal(xmlnode *rawudp) |
307 jingle_rawudp_parse_internal(PurpleXmlNode *rawudp) |
| 308 { |
308 { |
| 309 JingleTransport *transport = parent_class->parse(rawudp); |
309 JingleTransport *transport = parent_class->parse(rawudp); |
| 310 JingleRawUdpPrivate *priv = JINGLE_RAWUDP_GET_PRIVATE(transport); |
310 JingleRawUdpPrivate *priv = JINGLE_RAWUDP_GET_PRIVATE(transport); |
| 311 xmlnode *candidate = xmlnode_get_child(rawudp, "candidate"); |
311 PurpleXmlNode *candidate = purple_xmlnode_get_child(rawudp, "candidate"); |
| 312 JingleRawUdpCandidate *rawudp_candidate = NULL; |
312 JingleRawUdpCandidate *rawudp_candidate = NULL; |
| 313 |
313 |
| 314 for (; candidate; candidate = xmlnode_get_next_twin(candidate)) { |
314 for (; candidate; candidate = purple_xmlnode_get_next_twin(candidate)) { |
| 315 const gchar *id = xmlnode_get_attrib(candidate, "id"); |
315 const gchar *id = purple_xmlnode_get_attrib(candidate, "id"); |
| 316 const gchar *generation = xmlnode_get_attrib(candidate, "generation"); |
316 const gchar *generation = purple_xmlnode_get_attrib(candidate, "generation"); |
| 317 const gchar *component = xmlnode_get_attrib(candidate, "component"); |
317 const gchar *component = purple_xmlnode_get_attrib(candidate, "component"); |
| 318 const gchar *ip = xmlnode_get_attrib(candidate, "ip"); |
318 const gchar *ip = purple_xmlnode_get_attrib(candidate, "ip"); |
| 319 const gchar *port = xmlnode_get_attrib(candidate, "port"); |
319 const gchar *port = purple_xmlnode_get_attrib(candidate, "port"); |
| 320 |
320 |
| 321 if (!id || !generation || !component || !ip || !port) |
321 if (!id || !generation || !component || !ip || !port) |
| 322 continue; |
322 continue; |
| 323 |
323 |
| 324 rawudp_candidate = jingle_rawudp_candidate_new( |
324 rawudp_candidate = jingle_rawudp_candidate_new( |
| 342 } |
342 } |
| 343 |
343 |
| 344 return transport; |
344 return transport; |
| 345 } |
345 } |
| 346 |
346 |
| 347 static xmlnode * |
347 static PurpleXmlNode * |
| 348 jingle_rawudp_to_xml_internal(JingleTransport *transport, xmlnode *content, JingleActionType action) |
348 jingle_rawudp_to_xml_internal(JingleTransport *transport, PurpleXmlNode *content, JingleActionType action) |
| 349 { |
349 { |
| 350 xmlnode *node = parent_class->to_xml(transport, content, action); |
350 PurpleXmlNode *node = parent_class->to_xml(transport, content, action); |
| 351 |
351 |
| 352 if (action == JINGLE_SESSION_INITIATE || |
352 if (action == JINGLE_SESSION_INITIATE || |
| 353 action == JINGLE_TRANSPORT_INFO || |
353 action == JINGLE_TRANSPORT_INFO || |
| 354 action == JINGLE_SESSION_ACCEPT) { |
354 action == JINGLE_SESSION_ACCEPT) { |
| 355 JingleRawUdpPrivate *priv = JINGLE_RAWUDP_GET_PRIVATE(transport); |
355 JingleRawUdpPrivate *priv = JINGLE_RAWUDP_GET_PRIVATE(transport); |
| 356 GList *iter = priv->local_candidates; |
356 GList *iter = priv->local_candidates; |
| 357 |
357 |
| 358 for (; iter; iter = g_list_next(iter)) { |
358 for (; iter; iter = g_list_next(iter)) { |
| 359 JingleRawUdpCandidate *candidate = iter->data; |
359 JingleRawUdpCandidate *candidate = iter->data; |
| 360 xmlnode *xmltransport; |
360 PurpleXmlNode *xmltransport; |
| 361 gchar *generation, *component, *port; |
361 gchar *generation, *component, *port; |
| 362 |
362 |
| 363 if (candidate->rem_known == TRUE) |
363 if (candidate->rem_known == TRUE) |
| 364 continue; |
364 continue; |
| 365 candidate->rem_known = TRUE; |
365 candidate->rem_known = TRUE; |
| 366 |
366 |
| 367 xmltransport = xmlnode_new_child(node, "candidate"); |
367 xmltransport = purple_xmlnode_new_child(node, "candidate"); |
| 368 generation = g_strdup_printf("%d", candidate->generation); |
368 generation = g_strdup_printf("%d", candidate->generation); |
| 369 component = g_strdup_printf("%d", candidate->component); |
369 component = g_strdup_printf("%d", candidate->component); |
| 370 port = g_strdup_printf("%d", candidate->port); |
370 port = g_strdup_printf("%d", candidate->port); |
| 371 |
371 |
| 372 xmlnode_set_attrib(xmltransport, "generation", generation); |
372 purple_xmlnode_set_attrib(xmltransport, "generation", generation); |
| 373 xmlnode_set_attrib(xmltransport, "component", component); |
373 purple_xmlnode_set_attrib(xmltransport, "component", component); |
| 374 xmlnode_set_attrib(xmltransport, "id", candidate->id); |
374 purple_xmlnode_set_attrib(xmltransport, "id", candidate->id); |
| 375 xmlnode_set_attrib(xmltransport, "ip", candidate->ip); |
375 purple_xmlnode_set_attrib(xmltransport, "ip", candidate->ip); |
| 376 xmlnode_set_attrib(xmltransport, "port", port); |
376 purple_xmlnode_set_attrib(xmltransport, "port", port); |
| 377 |
377 |
| 378 g_free(port); |
378 g_free(port); |
| 379 g_free(generation); |
379 g_free(generation); |
| 380 } |
380 } |
| 381 } |
381 } |