JabberIq * jingle_session_redirect_packet(JingleSession *session, const gchar *sid) { JabberIq *iq = jingle_session_terminate_packet(session, "alternative-session"); PurpleXmlNode *alt_session; if (sid == NULL) return iq; alt_session = purple_xmlnode_get_child(iq->node, "jingle/reason/alternative-session"); if (alt_session != NULL) { PurpleXmlNode *sid_node = purple_xmlnode_new_child(alt_session, "sid"); purple_xmlnode_insert_data(sid_node, sid, -1); } return iq; }
static void jingle_handle_session_initiate(JingleSession *session, xmlnode *jingle) { xmlnode *content = xmlnode_get_child(jingle, "content"); for (; content; content = xmlnode_get_next_twin(content)) { JingleContent *parsed_content = jingle_content_parse(content); if (parsed_content == NULL) { purple_debug_error("jingle", "Error parsing content\n"); jabber_iq_send(jingle_session_terminate_packet(session, "unsupported-applications")); } else { jingle_session_add_content(session, parsed_content); jingle_content_handle_action(parsed_content, content, JINGLE_SESSION_INITIATE); } } jabber_iq_send(jingle_session_create_ack(session, jingle)); }
static void jingle_handle_content_add(JingleSession *session, xmlnode *jingle) { xmlnode *content = xmlnode_get_child(jingle, "content"); jabber_iq_send(jingle_session_create_ack(session, jingle)); for (; content; content = xmlnode_get_next_twin(content)) { JingleContent *pending_content = jingle_content_parse(content); if (pending_content == NULL) { purple_debug_error("jingle", "Error parsing \"content-add\" content.\n"); jabber_iq_send(jingle_session_terminate_packet(session, "unsupported-applications")); } else { jingle_session_add_pending_content(session, pending_content); } } /* XXX: signal here */ }
static void jingle_handle_transport_info(JingleSession *session, xmlnode *jingle) { xmlnode *content = xmlnode_get_child(jingle, "content"); jabber_iq_send(jingle_session_create_ack(session, jingle)); for (; content; content = xmlnode_get_next_twin(content)) { const gchar *name = xmlnode_get_attrib(content, "name"); const gchar *creator = xmlnode_get_attrib(content, "creator"); JingleContent *parsed_content = jingle_session_find_content(session, name, creator); if (parsed_content == NULL) { purple_debug_error("jingle", "Error parsing content\n"); jabber_iq_send(jingle_session_terminate_packet(session, "unsupported-applications")); } else { jingle_content_handle_action(parsed_content, content, JINGLE_TRANSPORT_INFO); } } }
static void jingle_handle_content_modify(JingleSession *session, xmlnode *jingle) { xmlnode *content = xmlnode_get_child(jingle, "content"); jabber_iq_send(jingle_session_create_ack(session, jingle)); for (; content; content = xmlnode_get_next_twin(content)) { const gchar *name = xmlnode_get_attrib(content, "name"); const gchar *creator = xmlnode_get_attrib(content, "creator"); JingleContent *local_content = jingle_session_find_content(session, name, creator); if (local_content != NULL) { const gchar *senders = xmlnode_get_attrib(content, "senders"); gchar *local_senders = jingle_content_get_senders(local_content); if (!purple_strequal(senders, local_senders)) jingle_content_modify(local_content, senders); g_free(local_senders); } else { purple_debug_error("jingle", "content_modify: unknown content\n"); jabber_iq_send(jingle_session_terminate_packet(session, "unknown-applications")); } } }