# HG changeset patch # User Nicolas Cornu # Date 1281827388 -7200 # Node ID 58bd57666ef956b7db5de488990ff08fec464b1f # Parent 8969dc3e2f145cae4c8eb0f02b5d1dc09712174c Add a end function to transport diff -r 8969dc3e2f14 -r 58bd57666ef9 jingle-filetransfer/filetransfer.c --- a/jingle-filetransfer/filetransfer.c Sun Aug 15 00:51:24 2010 +0200 +++ b/jingle-filetransfer/filetransfer.c Sun Aug 15 01:09:48 2010 +0200 @@ -48,8 +48,8 @@ gboolean jingle_ft_handle(JingleAction action, gconstpointer data, LmMessageNode *node); void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node); gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len); -void jingle_ft_start(session_content *sc, gsize size); -void jingle_ft_send(session_content *sc, gsize size); +void jingle_ft_start(session_content *sc); +void jingle_ft_send(session_content *sc); void jingle_ft_stop(gconstpointer data); static gboolean is_md5_hash(const gchar *hash); @@ -358,10 +358,10 @@ lm_message_unref(r); } -void jingle_ft_send(session_content *sc, gsize size) +void jingle_ft_send(session_content *sc) { JingleFT *jft; - gchar *buf = g_new0(gchar, size); + gchar buf[JINGLE_FT_SIZE_READ]; gsize read; GIOStatus status; int count = 0; @@ -378,7 +378,7 @@ do { count++; - status = g_io_channel_read_chars(jft->outfile, (gchar*)buf, size, &read, NULL); + status = g_io_channel_read_chars(jft->outfile, (gchar*)buf, JINGLE_FT_SIZE_READ, &read, NULL); } while (status == G_IO_STATUS_AGAIN && count < 10); if (status == G_IO_STATUS_AGAIN) { @@ -400,6 +400,7 @@ } if (status == G_IO_STATUS_EOF) { + handle_app_data(sc->sid, sc->from, sc->name, NULL, 0); scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)", jft->name); jft->hash = g_strdup(g_checksum_get_string(jft->md5)); // Call a function to say state is ended @@ -415,7 +416,7 @@ } } -void jingle_ft_start(session_content *sc, gsize size) +void jingle_ft_start(session_content *sc) { JingleFT *jft; @@ -434,7 +435,7 @@ scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Transfer start (%s)", jft->name); - sc2->appfuncs->send(sc, size); + sc2->appfuncs->send(sc); } // When we got a session-terminate diff -r 8969dc3e2f14 -r 58bd57666ef9 jingle-filetransfer/filetransfer.h --- a/jingle-filetransfer/filetransfer.h Sun Aug 15 00:51:24 2010 +0200 +++ b/jingle-filetransfer/filetransfer.h Sun Aug 15 01:09:48 2010 +0200 @@ -4,6 +4,7 @@ #define NS_JINGLE_APP_FT "urn:xmpp:jingle:apps:file-transfer:1" #define NS_JINGLE_APP_FT_INFO "urn:xmpp:jingle:apps:file-transfer:info:1" #define NS_SI_FT "http://jabber.org/protocol/si/profile/file-transfer" +#define JINGLE_FT_SIZE_READ 2048 typedef enum { JINGLE_FT_OFFER, diff -r 8969dc3e2f14 -r 58bd57666ef9 jingle-ibb/ibb.c --- a/jingle-ibb/ibb.c Sun Aug 15 00:51:24 2010 +0200 +++ b/jingle-ibb/ibb.c Sun Aug 15 01:09:48 2010 +0200 @@ -46,6 +46,7 @@ const gchar* jingle_ibb_xmlns(void); gconstpointer jingle_ibb_new(void); void jingle_ibb_send(session_content *sc, gconstpointer data, gchar *buf, gsize size); +void jingle_ibb_end(session_content *sc, gconstpointer data); static void _send_internal(session_content *sc, const gchar *to, gchar *buf, gsize size, const gchar *sid, gint64 *seq); @@ -63,7 +64,8 @@ jingle_ibb_tomessage, jingle_ibb_cmp, jingle_ibb_new, - jingle_ibb_send + jingle_ibb_send, + jingle_ibb_end }; module_info_t info_jingle_inbandbytestream = { @@ -295,12 +297,26 @@ g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft); - _send_internal(sc, sess->to, buffer, jibb->blocksize, sess->sid, &jibb->seq); + _send_internal(sc, sess->to, buffer, jibb->blocksize, sess->sid, + &jibb->seq); g_free(buf); } } +void jingle_ibb_end(session_content *sc, gconstpointer data) +{ + JingleIBB *jibb = (JingleIBB*)data; + JingleSession *sess = session_find_by_sid(sc->sid, sc->from); + + if (jibb->dataleft > 0) { + _send_internal(sc, sess->to, jibb->buf, jibb->dataleft, sess->sid, + &jibb->seq); + } + + g_free(jibb->buf); +} + static void jingle_ibb_unregister_lm_handlers(void) { if (lconnection) { diff -r 8969dc3e2f14 -r 58bd57666ef9 jingle/action-handlers.c --- a/jingle/action-handlers.c Sun Aug 15 00:51:24 2010 +0200 +++ b/jingle/action-handlers.c Sun Aug 15 01:09:48 2010 +0200 @@ -241,11 +241,10 @@ // Go go go! We start jobs! for (el = sess->content; el; el = el->next) { sc = (SessionContent*)el->data; - // TODO size! sc2->sid = sess->sid; sc2->from = (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to; sc2->name = sc->name; - sc->appfuncs->start(sc2, 2048); + sc->appfuncs->start(sc2); } jingle_free_jinglenode(jn); } diff -r 8969dc3e2f14 -r 58bd57666ef9 jingle/jingle.c --- a/jingle/jingle.c Sun Aug 15 00:51:24 2010 +0200 +++ b/jingle/jingle.c Sun Aug 15 01:09:48 2010 +0200 @@ -401,7 +401,7 @@ SessionContent *sc = session_find_sessioncontent(sess, sc2->name); // TODO: size! - sc->appfuncs->send(sc2, 2048); + sc->appfuncs->send(sc2); g_free(sc2); } diff -r 8969dc3e2f14 -r 58bd57666ef9 jingle/register.h --- a/jingle/register.h Sun Aug 15 00:51:24 2010 +0200 +++ b/jingle/register.h Sun Aug 15 01:09:48 2010 +0200 @@ -38,8 +38,8 @@ typedef gboolean (*JingleAppHandle) (JingleAction action, gconstpointer data, LmMessageNode *node); typedef void (*JingleAppToMessage) (gconstpointer data, LmMessageNode *node); typedef gboolean (*JingleAppHandleData) (gconstpointer data, const gchar *data2, guint len); -typedef void (*JingleAppStart) (session_content *sc, gsize size); -typedef void (*JingleAppSend) (session_content *sc, gsize size); +typedef void (*JingleAppStart) (session_content *sc); +typedef void (*JingleAppSend) (session_content *sc); typedef void (*JingleAppStop) (gconstpointer data); typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err); @@ -48,6 +48,7 @@ typedef const gchar* (*JingleTransportxmlns) (void); typedef gconstpointer (*JingleTransportNew) (void); typedef void (*JingleTransportSend) (session_content *sc, gconstpointer data, gchar *buf, gsize size); +typedef void (*JingleTransportEnd) (session_content *sc, gconstpointer data); typedef struct { /* check if the description of a JingleContent is correct */ @@ -83,6 +84,8 @@ JingleTransportNew new; JingleTransportSend send; + + JingleTransportEnd end; } JingleTransportFuncs; diff -r 8969dc3e2f14 -r 58bd57666ef9 jingle/sessions.c --- a/jingle/sessions.c Sun Aug 15 00:51:24 2010 +0200 +++ b/jingle/sessions.c Sun Aug 15 01:09:48 2010 +0200 @@ -301,5 +301,8 @@ sc2->sid = sess->sid; sc2->from = (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to; sc2->name = sc->name; - sc->transfuncs->send(sc2, sc->transport, data, size); + if (size != 0) + sc->transfuncs->send(sc2, sc->transport, data, size); + else + sc->transfuncs->end(sc2, sc->transport); }