24 #include <glib.h> |
24 #include <glib.h> |
25 |
25 |
26 #include <mcabber/modules.h> |
26 #include <mcabber/modules.h> |
27 #include <mcabber/utils.h> |
27 #include <mcabber/utils.h> |
28 #include <mcabber/xmpp_helper.h> |
28 #include <mcabber/xmpp_helper.h> |
|
29 #include <mcabber/logprint.h> |
29 |
30 |
30 #include <jingle/jingle.h> |
31 #include <jingle/jingle.h> |
31 #include <jingle/check.h> |
32 #include <jingle/check.h> |
32 #include <jingle/register.h> |
33 #include <jingle/register.h> |
33 |
34 |
38 gconstpointer jingle_ibb_check(JingleContent *cn, GError **err); |
39 gconstpointer jingle_ibb_check(JingleContent *cn, GError **err); |
39 gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2); |
40 gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2); |
40 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node); |
41 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node); |
41 const gchar* jingle_ibb_xmlns(void); |
42 const gchar* jingle_ibb_xmlns(void); |
42 gconstpointer jingle_ibb_new(void); |
43 gconstpointer jingle_ibb_new(void); |
|
44 void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size); |
43 |
45 |
44 static void jingle_ibb_init(void); |
46 static void jingle_ibb_init(void); |
45 static void jingle_ibb_uninit(void); |
47 static void jingle_ibb_uninit(void); |
46 |
48 |
47 |
49 |
106 LmHandlerResult jingle_ibb_handle_iq(LmMessageHandler *handler, |
109 LmHandlerResult jingle_ibb_handle_iq(LmMessageHandler *handler, |
107 LmConnection *connection, LmMessage *message, |
110 LmConnection *connection, LmMessage *message, |
108 gpointer user_data) |
111 gpointer user_data) |
109 { |
112 { |
110 const gchar *data64; |
113 const gchar *data64; |
111 JingleIBB *ibb = g_new0(JingleIBB, 1); |
114 JingleIBB *jibb = g_new0(JingleIBB, 1); |
112 gsize len; |
115 gsize len; |
113 guchar *data; |
116 guchar *data; |
114 |
117 |
115 LmMessageSubType iqtype = lm_message_get_sub_type(message); |
118 LmMessageSubType iqtype = lm_message_get_sub_type(message); |
116 if (iqtype != LM_MESSAGE_SUB_TYPE_SET) |
119 if (iqtype != LM_MESSAGE_SUB_TYPE_SET) |
126 NS_TRANSPORT_IBB)) |
129 NS_TRANSPORT_IBB)) |
127 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
130 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
128 |
131 |
129 jingle_ack_iq(message); |
132 jingle_ack_iq(message); |
130 |
133 |
131 ibb->sid = lm_message_node_get_attribute(dnode, "sid"); |
134 jibb->sid = lm_message_node_get_attribute(dnode, "sid"); |
132 ibb->seq = g_ascii_strtoll(lm_message_node_get_attribute(dnode, "seq"), NULL, 10); |
135 jibb->seq = g_ascii_strtoll(lm_message_node_get_attribute(dnode, "seq"), NULL, 10); |
133 |
136 |
134 data64 = lm_message_node_get_value(dnode); |
137 data64 = lm_message_node_get_value(dnode); |
135 |
138 |
136 data = g_base64_decode(data64, &len); |
139 data = g_base64_decode(data64, &len); |
137 |
140 |
138 handle_trans_data(NS_JINGLE_TRANSPORT_IBB, ibb, (const gchar *)data, (guint)len); |
141 handle_trans_data(NS_JINGLE_TRANSPORT_IBB, jibb, (const gchar *)data, (guint)len); |
139 |
142 |
140 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
143 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
141 } |
144 } |
142 |
145 |
143 |
146 |
207 |
210 |
208 void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size) |
211 void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size) |
209 { |
212 { |
210 JingleIBB *jibb = (JingleIBB*)data; |
213 JingleIBB *jibb = (JingleIBB*)data; |
211 JingleAckHandle *ackhandle; |
214 JingleAckHandle *ackhandle; |
212 gchar* base64 = g_base64_encode((const guchar *)data, size); |
215 gchar *base64 = g_base64_encode((const guchar *)data, size); |
|
216 gchar *seq = g_strdup_printf("%" G_GINT64_FORMAT, jibb->seq); |
213 |
217 |
214 LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); |
218 LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); |
215 LmMessageNode *node = lm_message_get_node(r); |
219 LmMessageNode *node = lm_message_get_node(r); |
216 lm_message_node_add_child(node, "data", NULL); |
220 lm_message_node_add_child(node, "data", NULL); |
217 node = lm_message_node_get_child(node, "data"); |
221 node = lm_message_node_get_child(node, "data"); |
218 lm_message_node_set_attributes(node, "xmlns", NS_TRANSPORT_IBB, "sid", jibb->sid, "seq", jibb->seq, NULL); |
222 lm_message_node_set_attributes(node, "xmlns", NS_TRANSPORT_IBB, "sid", jibb->sid, "seq", seq, NULL); |
219 lm_message_node_set_value(node, base64); |
223 lm_message_node_set_value(node, base64); |
220 |
224 |
221 ackhandle = g_new0(JingleAckHandle, 1); |
225 ackhandle = g_new0(JingleAckHandle, 1); |
222 ackhandle->callback = jingle_ibb_handle_ack_iq_send; |
226 ackhandle->callback = jingle_ibb_handle_ack_iq_send; |
223 ackhandle->user_data = NULL; |
227 ackhandle->user_data = NULL; |
224 |
228 scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(r->node)); |
225 lm_connection_send_with_reply(lconnection, r, |
229 lm_connection_send_with_reply(lconnection, r, |
226 jingle_new_ack_handler(ackhandle), NULL); |
230 jingle_new_ack_handler(ackhandle), NULL); |
227 lm_message_unref(r); |
231 lm_message_unref(r); |
228 |
232 |
229 // The next packet will be seq++ |
233 // The next packet will be seq++ |