38 |
38 |
39 #include "ibb.h" |
39 #include "ibb.h" |
40 |
40 |
41 static LmMessageHandler* jingle_ibb_handler = NULL; |
41 static LmMessageHandler* jingle_ibb_handler = NULL; |
42 |
42 |
43 gconstpointer jingle_ibb_check(JingleContent *cn, GError **err); |
43 static gconstpointer check(JingleContent *cn, GError **err); |
44 gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2); |
44 static gboolean cmp(gconstpointer data1, gconstpointer data2); |
45 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node); |
45 static void tomessage(gconstpointer data, LmMessageNode *node); |
46 const gchar* jingle_ibb_xmlns(void); |
46 static const gchar* xmlns(void); |
47 gconstpointer jingle_ibb_new(void); |
47 static gconstpointer new(void); |
48 void jingle_ibb_send(session_content *sc, gconstpointer data, gchar *buf, gsize size); |
48 static void send(session_content *sc, gconstpointer data, gchar *buf, gsize size); |
49 void jingle_ibb_end(session_content *sc, gconstpointer data); |
49 static void end(session_content *sc, gconstpointer data); |
50 static void _send_internal(session_content *sc, const gchar *to, gchar *buf, |
50 static void _send_internal(session_content *sc, const gchar *to, gchar *buf, |
51 gsize size, const gchar *sid, gint64 *seq); |
51 gsize size, const gchar *sid, gint64 *seq); |
52 |
52 |
53 static void jingle_ibb_init(void); |
53 static void jingle_ibb_init(void); |
54 static void jingle_ibb_uninit(void); |
54 static void jingle_ibb_uninit(void); |
57 static guint disconn_hid = 0; |
57 static guint disconn_hid = 0; |
58 |
58 |
59 const gchar *deps[] = { "jingle", NULL }; |
59 const gchar *deps[] = { "jingle", NULL }; |
60 |
60 |
61 static JingleTransportFuncs funcs = { |
61 static JingleTransportFuncs funcs = { |
62 jingle_ibb_xmlns, |
62 .xmlns = xmlns, |
63 jingle_ibb_check, |
63 .check = check, |
64 jingle_ibb_tomessage, |
64 .tomessage = tomessage, |
65 jingle_ibb_cmp, |
65 .cmp = cmp, |
66 jingle_ibb_new, |
66 .new = new, |
67 jingle_ibb_send, |
67 .send = send, |
68 jingle_ibb_end |
68 .end = end |
69 }; |
69 }; |
70 |
70 |
71 module_info_t info_jingle_inbandbytestream = { |
71 module_info_t info_jingle_inbandbytestream = { |
72 .branch = MCABBER_BRANCH, |
72 .branch = MCABBER_BRANCH, |
73 .api = MCABBER_API_VERSION, |
73 .api = MCABBER_API_VERSION, |
78 .uninit = jingle_ibb_uninit, |
78 .uninit = jingle_ibb_uninit, |
79 .next = NULL, |
79 .next = NULL, |
80 }; |
80 }; |
81 |
81 |
82 |
82 |
83 const gchar* jingle_ibb_xmlns(void) |
83 static const gchar* xmlns(void) |
84 { |
84 { |
85 return NS_JINGLE_TRANSPORT_IBB; |
85 return NS_JINGLE_TRANSPORT_IBB; |
86 } |
86 } |
87 |
87 |
88 gconstpointer jingle_ibb_check(JingleContent *cn, GError **err) |
88 static gconstpointer check(JingleContent *cn, GError **err) |
89 { |
89 { |
90 JingleIBB *ibb = NULL; |
90 JingleIBB *ibb = NULL; |
91 LmMessageNode *node = cn->transport; |
91 LmMessageNode *node = cn->transport; |
92 const gchar *blocksize; |
92 const gchar *blocksize; |
93 |
93 |
153 |
153 |
154 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
154 return LM_HANDLER_RESULT_REMOVE_MESSAGE; |
155 } |
155 } |
156 |
156 |
157 |
157 |
158 gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2) |
158 static gboolean cmp(gconstpointer data1, gconstpointer data2) |
159 { |
159 { |
160 const JingleIBB *ibb1 = data1, *ibb2 = data2; |
160 const JingleIBB *ibb1 = data1, *ibb2 = data2; |
161 if(g_strcmp0(ibb1->sid, ibb2->sid)) |
161 if(g_strcmp0(ibb1->sid, ibb2->sid)) |
162 return FALSE; |
162 return FALSE; |
163 return TRUE; |
163 return TRUE; |
193 if(!g_strcmp0(ibb1->sid, ibb2->sid) && ibb1->seq == ibb2->seq + 1) |
193 if(!g_strcmp0(ibb1->sid, ibb2->sid) && ibb1->seq == ibb2->seq + 1) |
194 return 0; |
194 return 0; |
195 return 1; |
195 return 1; |
196 } |
196 } |
197 |
197 |
198 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node) |
198 static void tomessage(gconstpointer data, LmMessageNode *node) |
199 { |
199 { |
200 JingleIBB *jibb = (JingleIBB*) data; |
200 JingleIBB *jibb = (JingleIBB*) data; |
201 gchar *bsize = g_strdup_printf("%i", jibb->blocksize); |
201 gchar *bsize = g_strdup_printf("%i", jibb->blocksize); |
202 |
202 |
203 if (lm_message_node_get_child(node, "transport") != NULL) |
203 if (lm_message_node_get_child(node, "transport") != NULL) |
214 |
214 |
215 static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer data) |
215 static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer data) |
216 { |
216 { |
217 // TODO: check the sub type (error ??) |
217 // TODO: check the sub type (error ??) |
218 session_content *sc = (session_content *)data; |
218 session_content *sc = (session_content *)data; |
|
219 |
219 JingleSession *sess = session_find_by_sid(sc->sid, sc->from); |
220 JingleSession *sess = session_find_by_sid(sc->sid, sc->from); |
|
221 |
|
222 // If there is no more session, maybe it's finish |
|
223 if (sess == NULL) |
|
224 return; |
|
225 |
220 SessionContent *sc2 = session_find_sessioncontent(sess, sc->name); |
226 SessionContent *sc2 = session_find_sessioncontent(sess, sc->name); |
221 |
227 |
222 JingleIBB *jibb = (JingleIBB *)sc2->transport; |
228 JingleIBB *jibb = (JingleIBB *)sc2->transport; |
223 |
229 |
224 // We look if there is enough data staying |
230 // We look if there is enough data staying |
225 if (jibb->dataleft > jibb->blocksize) { |
231 if (jibb->dataleft > jibb->blocksize) { |
226 gchar *buf = g_memdup(jibb->buf, jibb->blocksize); |
232 gchar *buf = g_memdup(jibb->buf, jibb->blocksize); |
227 jibb->dataleft-=jibb->blocksize; |
233 jibb->dataleft-=jibb->blocksize; |
228 g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft); |
234 g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft); |
229 _send_internal(sc, sess->to, buf, jibb->blocksize, sess->sid, &jibb->seq); |
235 _send_internal(sc, sess->to, buf, jibb->blocksize, jibb->sid, &jibb->seq); |
230 g_free(buf); |
236 g_free(buf); |
231 } else { // ask for more data |
237 } else { // ask for more data |
232 handle_trans_next(sc); |
238 handle_trans_next(sc); |
233 } |
239 } |
234 } |
240 } |
295 |
301 |
296 jibb->dataleft-=jibb->blocksize; |
302 jibb->dataleft-=jibb->blocksize; |
297 |
303 |
298 g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft); |
304 g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft); |
299 |
305 |
300 _send_internal(sc, sess->to, buffer, jibb->blocksize, sess->sid, |
306 _send_internal(sc, sess->to, buffer, jibb->blocksize, jibb->sid, |
301 &jibb->seq); |
307 &jibb->seq); |
302 |
308 |
303 g_free(buf); |
309 g_free(buffer); |
304 } |
310 } |
305 } |
311 } |
306 |
312 |
307 void jingle_ibb_end(session_content *sc, gconstpointer data) |
313 static void end(session_content *sc, gconstpointer data) |
308 { |
314 { |
309 JingleIBB *jibb = (JingleIBB*)data; |
315 JingleIBB *jibb = (JingleIBB*)data; |
310 JingleSession *sess = session_find_by_sid(sc->sid, sc->from); |
316 JingleSession *sess = session_find_by_sid(sc->sid, sc->from); |
311 |
317 |
312 if (jibb->dataleft > 0) { |
318 if (jibb->dataleft > 0) { |
313 _send_internal(sc, sess->to, jibb->buf, jibb->dataleft, sess->sid, |
319 _send_internal(sc, sess->to, jibb->buf, jibb->dataleft, jibb->sid, |
314 &jibb->seq); |
320 &jibb->seq); |
315 } |
321 } |
316 |
322 |
317 g_free(jibb->buf); |
323 g_free(jibb->buf); |
318 } |
324 } |