58 lm_connection_send_with_reply(lconnection, r, |
58 lm_connection_send_with_reply(lconnection, r, |
59 jingle_new_ack_handler(ackhandle), NULL); |
59 jingle_new_ack_handler(ackhandle), NULL); |
60 lm_message_unref(r); |
60 lm_message_unref(r); |
61 } |
61 } |
62 |
62 |
63 static void jingle_handle_ack_iq_sa(LmMessage *mess, gpointer data) |
63 static void jingle_handle_ack_iq_sa(JingleAckType acktype, LmMessage *mess, |
|
64 gpointer data) |
64 { |
65 { |
65 LmMessageNode *node; |
66 LmMessageNode *node; |
66 const gchar *type, *cause; |
67 const gchar *type, *cause; |
67 GSList *child = NULL; |
68 GSList *child = NULL; |
68 JingleSession *sess = (JingleSession*)data; |
69 JingleSession *sess = (JingleSession*)data; |
69 SessionContent *sc; |
70 SessionContent *sc; |
70 |
71 |
|
72 if (acktype == JINGLE_ACK_TIMEOUT) { |
|
73 // TODO: handle ack timeout... |
|
74 scr_LogPrint(LPRINT_LOGNORM, "Jingle: session-accept %s: %s", type, cause); |
|
75 session_delete(sess); |
|
76 return; |
|
77 } |
|
78 |
71 if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT) { |
79 if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT) { |
72 return; |
80 return; |
73 } |
81 } |
74 |
82 |
75 if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_ERROR) { |
83 if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_ERROR) { |
76 node = lm_message_get_node(mess); |
84 node = lm_message_get_node(mess); |
77 node = lm_message_node_get_child(node,"error"); |
85 node = lm_message_node_get_child(node,"error"); |
78 type = lm_message_node_get_attribute(node, "type"); |
86 type = lm_message_node_get_attribute(node, "type"); |
79 if(node->children != NULL) |
87 if(node->children != NULL) |
95 |
103 |
96 if (mess) { |
104 if (mess) { |
97 ackhandle = g_new0(JingleAckHandle, 1); |
105 ackhandle = g_new0(JingleAckHandle, 1); |
98 ackhandle->callback = jingle_handle_ack_iq_sa; |
106 ackhandle->callback = jingle_handle_ack_iq_sa; |
99 ackhandle->user_data = (gpointer)js; |
107 ackhandle->user_data = (gpointer)js; |
100 scr_log_print(LPRINT_DEBUG, |
108 ackhandle->timeout = 60; |
101 "%s", lm_message_node_to_string(mess->node));lm_connection_send_with_reply(lconnection, mess, |
109 lm_connection_send_with_reply(lconnection, mess, |
102 jingle_new_ack_handler(ackhandle), NULL); |
110 jingle_new_ack_handler(ackhandle), NULL); |
103 lm_message_unref(mess); |
111 lm_message_unref(mess); |
104 } |
112 } |
105 } |
113 } |
106 |
114 |
107 static void jingle_handle_ack_iq_si(LmMessage *mess, gpointer data) |
115 static void jingle_handle_ack_iq_si(JingleAckType acktype, LmMessage *mess, |
|
116 gpointer data) |
108 { |
117 { |
109 LmMessageNode *node; |
118 LmMessageNode *node; |
110 const gchar *type, *cause; |
119 const gchar *type, *cause; |
111 JingleSession *sess = (JingleSession*)data; |
120 JingleSession *sess = (JingleSession*)data; |
112 |
121 |
113 if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT) |
122 if (acktype == JINGLE_ACK_TIMEOUT) { |
|
123 // TODO: handle ack timeout... |
|
124 scr_LogPrint(LPRINT_LOGNORM, "Jingle: did not receive the ack in time, aborting"); |
|
125 session_delete(sess); |
114 return; |
126 return; |
115 if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_ERROR) { |
127 } |
|
128 |
|
129 if (lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT) |
|
130 return; |
|
131 if (lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_ERROR) { |
116 node = lm_message_get_node(mess); |
132 node = lm_message_get_node(mess); |
117 node = lm_message_node_get_child(node,"error"); |
133 node = lm_message_node_get_child(node,"error"); |
118 type = lm_message_node_get_attribute(node, "type"); |
134 type = lm_message_node_get_attribute(node, "type"); |
119 if(node->children != NULL) |
135 if(node->children != NULL) |
120 cause = node->children->name; |
136 cause = node->children->name; |
126 |
142 |
127 void jingle_send_session_initiate(JingleSession *js) |
143 void jingle_send_session_initiate(JingleSession *js) |
128 { |
144 { |
129 JingleAckHandle *ackhandle; |
145 JingleAckHandle *ackhandle; |
130 GSList *listentry; |
146 GSList *listentry; |
131 GError *err; |
147 GError *err = NULL; |
132 gboolean status; |
148 gboolean status; |
133 |
149 |
134 LmMessage *mess = lm_message_from_jinglesession(js, JINGLE_SESSION_INITIATE); |
150 LmMessage *mess = lm_message_from_jinglesession(js, JINGLE_SESSION_INITIATE); |
135 lm_message_node_set_attribute(lm_message_node_get_child(mess->node, "jingle"), |
151 lm_message_node_set_attribute(lm_message_node_get_child(mess->node, "jingle"), |
136 "initiator", js->from); |
152 "initiator", js->from); |
137 |
153 |
138 if (mess) { |
154 if (mess) { |
139 ackhandle = g_new0(JingleAckHandle, 1); |
155 ackhandle = g_new0(JingleAckHandle, 1); |
140 ackhandle->callback = jingle_handle_ack_iq_si; |
156 ackhandle->callback = jingle_handle_ack_iq_si; |
141 ackhandle->user_data = (gpointer)js; |
157 ackhandle->user_data = (gpointer)js; |
142 scr_log_print(LPRINT_DEBUG, |
158 ackhandle->timeout = 60; |
143 "%s", lm_message_node_to_string(mess->node)); |
|
144 status = lm_connection_send_with_reply(lconnection, mess, |
159 status = lm_connection_send_with_reply(lconnection, mess, |
145 jingle_new_ack_handler(ackhandle), &err); |
160 jingle_new_ack_handler(ackhandle), &err); |
146 // TODO: delete the ack_handler |
161 // TODO: delete the ack_handler |
147 if (status == FALSE || err != NULL) { |
162 if (status == FALSE || err != NULL) { |
148 scr_LogPrint(LPRINT_LOGNORM, "Jingle: %s: try again", err->message); |
163 scr_LogPrint(LPRINT_LOGNORM, "Jingle: %s: try again", err->message); |