30 #include <jingle/jingle.h> |
30 #include <jingle/jingle.h> |
31 #include <jingle/sessions.h> |
31 #include <jingle/sessions.h> |
32 #include <jingle/send.h> |
32 #include <jingle/send.h> |
33 |
33 |
34 |
34 |
35 void jingle_send_session_terminate(JingleNode *jn, const gchar *reason) |
35 void jingle_send_session_terminate(JingleSession *js, const gchar *reason) |
36 { |
36 { |
37 LmMessage *r; |
|
38 LmMessageNode *err,*err2; |
|
39 JingleNode *reply = g_new0(JingleNode, 1); |
|
40 JingleAckHandle *ackhandle; |
37 JingleAckHandle *ackhandle; |
41 |
38 |
42 reply->action = JINGLE_SESSION_TERMINATE; |
39 LmMessage *r = lm_message_new_with_sub_type(js->to, LM_MESSAGE_TYPE_IQ, |
43 reply->sid = jn->sid; |
40 LM_MESSAGE_SUB_TYPE_SET); |
44 |
41 LmMessageNode *node = lm_message_get_node(r); |
45 r = lm_message_from_jinglenode(reply, lm_message_get_from(jn->message)); |
42 lm_message_node_add_child(node, "jingle", NULL); |
|
43 node = lm_message_node_get_child(node, "jingle"); |
|
44 lm_message_node_set_attributes(node, "xmlns", NS_JINGLE, |
|
45 "action", "session-terminate", |
|
46 "sid", js->sid, |
|
47 NULL); |
|
48 lm_message_node_add_child(node, "reason", NULL); |
|
49 node = lm_message_node_get_child(node, "reason"); |
|
50 |
46 if (r == NULL) return; |
51 if (r == NULL) return; |
47 |
52 |
48 if (reason != NULL) { |
53 if (reason != NULL) { |
49 err2 = lm_message_node_get_child(r->node, "jingle"); |
54 node = lm_message_node_get_child(node, "reason"); |
50 // TODO check reason |
55 lm_message_node_add_child(node, reason, NULL); |
51 err = lm_message_node_add_child(err2, "reason", NULL); |
|
52 lm_message_node_add_child(err, reason, NULL); |
|
53 } |
56 } |
54 |
57 |
55 ackhandle = g_new0(JingleAckHandle, 1); |
58 ackhandle = g_new0(JingleAckHandle, 1); |
56 ackhandle->callback = NULL; |
59 ackhandle->callback = NULL; |
57 ackhandle->user_data = NULL; |
60 ackhandle->user_data = NULL; |
120 |
123 |
121 session_add_content_from_jinglecontent(sess, cn, JINGLE_SESSION_STATE_ACTIVE); |
124 session_add_content_from_jinglecontent(sess, cn, JINGLE_SESSION_STATE_ACTIVE); |
122 } |
125 } |
123 |
126 |
124 if(g_slist_length(sess->content) == 0) { |
127 if(g_slist_length(sess->content) == 0) { |
125 jingle_send_session_terminate(jn, "unsupported-applications"); |
128 jingle_send_session_terminate(sess, "unsupported-applications"); |
126 session_delete(sess); |
129 session_delete(sess); |
127 return; |
130 return; |
128 } |
131 } |
129 |
132 |
130 mess = lm_message_from_jinglesession(sess, JINGLE_SESSION_ACCEPT); |
133 mess = lm_message_from_jinglesession(sess, JINGLE_SESSION_ACCEPT); |
131 scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(mess->node)); |
134 |
132 if (mess) { |
135 if (mess) { |
133 ackhandle = g_new0(JingleAckHandle, 1); |
136 ackhandle = g_new0(JingleAckHandle, 1); |
134 ackhandle->callback = jingle_handle_ack_iq_sa; |
137 ackhandle->callback = jingle_handle_ack_iq_sa; |
135 ackhandle->user_data = (gpointer*)sess; |
138 ackhandle->user_data = (gpointer*)sess; |
136 lm_connection_send_with_reply(lconnection, mess, |
139 lm_connection_send_with_reply(lconnection, mess, |
165 GSList *listentry; |
168 GSList *listentry; |
166 |
169 |
167 LmMessage *mess = lm_message_from_jinglesession(js, JINGLE_SESSION_INITIATE); |
170 LmMessage *mess = lm_message_from_jinglesession(js, JINGLE_SESSION_INITIATE); |
168 lm_message_node_set_attribute(lm_message_node_get_child(mess->node, "jingle"), |
171 lm_message_node_set_attribute(lm_message_node_get_child(mess->node, "jingle"), |
169 "initiator", js->from); |
172 "initiator", js->from); |
170 scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(mess->node)); |
|
171 |
173 |
172 if (mess) { |
174 if (mess) { |
173 ackhandle = g_new0(JingleAckHandle, 1); |
175 ackhandle = g_new0(JingleAckHandle, 1); |
174 ackhandle->callback = jingle_handle_ack_iq_si; |
176 ackhandle->callback = jingle_handle_ack_iq_si; |
175 ackhandle->user_data = (gpointer*)js; |
177 ackhandle->user_data = (gpointer*)js; |