--- 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
--- 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,
--- 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) {
--- 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);
}
--- 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);
}
--- 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;
--- 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);
}