--- a/jingle-filetransfer/filetransfer.c Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c Fri Aug 13 18:06:17 2010 +0200
@@ -39,6 +39,7 @@
#include <jingle/check.h>
#include <jingle/register.h>
#include <jingle/sessions.h>
+#include <jingle/send.h>
#include "filetransfer.h"
@@ -46,8 +47,8 @@
gconstpointer jingle_ft_check(JingleContent *cn, GError **err);
void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node);
gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len);
-void jingle_ft_start(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
-void jingle_ft_send(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
+void jingle_ft_start(session_content *sc, gsize size);
+void jingle_ft_send(session_content *sc, gsize size);
static gboolean is_md5_hash(const gchar *hash);
static void jingle_ft_init(void);
static void jingle_ft_uninit(void);
@@ -169,24 +170,25 @@
gboolean jingle_ft_handle_data(gconstpointer jingleft, const gchar *data, guint len)
{
- JingleFT *ft = (JingleFT *) jingleft;
+ JingleFT *jft = (JingleFT *) jingleft;
GError *err = NULL;
GIOStatus status;
gsize bytes_written = 0;
// TODO: check if the file already exist or if it was created
// during the call to jingle_ft_check and handle_data
- if (ft->outfile == NULL) {
- ft->outfile = g_io_channel_new_file(ft->name, "w", &err);
- if (ft->outfile == NULL || err != NULL) {
+ if (jft->outfile == NULL) {
+ jft->outfile = g_io_channel_new_file(jft->name, "w", &err);
+ if (jft->outfile == NULL || err != NULL) {
// propagate the GError ?
return FALSE;
}
+ g_io_channel_set_encoding(jft->outfile, NULL, NULL);
}
- status = g_io_channel_write_chars(ft->outfile, data, (gssize) len,
+ status = g_io_channel_write_chars(jft->outfile, data, (gssize) len,
&bytes_written, &err);
- g_io_channel_flush (ft->outfile, NULL);
+ g_io_channel_flush(jft->outfile, NULL);
if (status != G_IO_STATUS_NORMAL || err != NULL) {
return FALSE;
}
@@ -325,9 +327,9 @@
lm_message_unref(r);
}
-void jingle_ft_send(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size)
+void jingle_ft_send(session_content *sc, gsize size)
{
- JingleFT *jft = (JingleFT*)(data);
+ JingleFT *jft;
gchar *buf = g_new0(gchar, size);
gsize read;
GIOStatus status;
@@ -335,11 +337,11 @@
JingleSession *sess = session_find_by_sid(sid, from);
if (sess == NULL) {
scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: error before transfer");
- // TODO: send session-terminate / delete session
+ // TODO: send error
return;
}
- SessionContent *sc = session_find_sessioncontent(sess, name);
+ SessionContent *sc2 = session_find_sessioncontent(sess, name);
do {
count++;
@@ -357,42 +359,46 @@
return;
}
- g_checksum_update(jft->md5, (guchar*)buf, read);
-
- // Call a handle in jingle who will call the trans
- handle_app_data(sid, from, name, buf, read);
-
- g_free(buf);
+ if (status == G_IO_STATUS_NORMAL) {
+ g_checksum_update(jft->md5, (guchar*)buf, read);
+ // Call a handle in jingle who will call the trans
+ handle_app_data(sid, from, name, buf, read);
+ g_free(buf);
+ }
if (status == G_IO_STATUS_EOF) {
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
- session_changestate_sessioncontent(sess, sc->name, JINGLE_SESSION_STATE_ENDED);
+ session_changestate_sessioncontent(sess, sc2->name, JINGLE_SESSION_STATE_ENDED);
// Send the hash
jingle_ft_send_hash(sess->sid, sess->to, jft->hash);
g_checksum_free(jft->md5);
- // Send a session-terminate (success)
-
+ if (!session_remove_sessioncontent(sess, sc2->name)) {
+ jingle_send_session_terminate(sess, "success");
+ session_delete(sess);
+ }
}
}
-void jingle_ft_start(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size)
+void jingle_ft_start(session_content *sc, gsize size)
{
- JingleFT *jft = (JingleFT*)data;
+ JingleFT *jft;
- JingleSession *sess = session_find_by_sid(sid, from);
+ JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
if (sess == NULL) {
scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: error before transfer");
return;
}
- SessionContent *sc = session_find_sessioncontent(sess, name);
+ SessionContent *sc2 = session_find_sessioncontent(sess, sc->name);
+ jft = (JingleFT*)sc2->description;
+
jft->md5 = g_checksum_new(G_CHECKSUM_MD5);
- sc->appfuncs->send(sid, from, name, data, size);
+ sc->appfuncs->send(sc, data, size);
}
static void jingle_ft_init(void)
--- a/jingle-ibb/ibb.c Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle-ibb/ibb.c Fri Aug 13 18:06:17 2010 +0200
@@ -43,7 +43,7 @@
void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node);
const gchar* jingle_ibb_xmlns(void);
gconstpointer jingle_ibb_new(void);
-void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size);
+void jingle_ibb_send(session_content *sc, const gchar *to, gconstpointer data, gchar *buf, gsize size);
static void jingle_ibb_init(void);
static void jingle_ibb_uninit(void);
@@ -206,13 +206,13 @@
g_free(bsize);
}
-static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer *data)
+static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer data)
{
-
-
+ // TODO: check the sub type (error ??)
+ handle_trans_next((session_content*)data);
}
-void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size)
+void jingle_ibb_send(session_content *sc, const gchar *to, gconstpointer data, gchar *buf, gsize size)
{
JingleIBB *jibb = (JingleIBB*)data;
JingleAckHandle *ackhandle;
@@ -223,13 +223,16 @@
LmMessageNode *node = lm_message_get_node(r);
lm_message_node_add_child(node, "data", NULL);
node = lm_message_node_get_child(node, "data");
- lm_message_node_set_attributes(node, "xmlns", NS_TRANSPORT_IBB, "sid", jibb->sid, "seq", seq, NULL);
+ lm_message_node_set_attributes(node, "xmlns", NS_TRANSPORT_IBB,
+ "sid", jibb->sid,
+ "seq", seq,
+ NULL);
lm_message_node_set_value(node, base64);
ackhandle = g_new0(JingleAckHandle, 1);
ackhandle->callback = jingle_ibb_handle_ack_iq_send;
- ackhandle->user_data = NULL;
- scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(r->node));
+ ackhandle->user_data = (gpointer)sc;
+
lm_connection_send_with_reply(lconnection, r,
jingle_new_ack_handler(ackhandle), NULL);
lm_message_unref(r);
--- a/jingle/action-handlers.c Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/action-handlers.c Fri Aug 13 18:06:17 2010 +0200
@@ -211,7 +211,7 @@
// If there is nothing more to do, close the session
if (g_slist_length(sess->content) == 0) {
- jingle_send_session_terminate(jn, "success");
+ jingle_send_session_terminate(sess, "success");
session_delete(sess);
return;
}
@@ -268,7 +268,7 @@
// Make sure the request come from an user in our roster
disp = jidtodisp(lm_message_get_from(jn->message));
if (!roster_find(disp, jidsearch, 0)) {
- jingle_send_session_terminate(jn, "decline");
+ // jingle_send_session_terminate(jn, "decline");
jingle_free_jinglenode(jn);
g_free(disp);
return;
@@ -341,6 +341,7 @@
JingleSession *sess;
JingleContent *jc;
SessionContent *sc;
+ session_content *sc2;
GSList *el;
const gchar *from = lm_message_get_from(jn->message);
@@ -373,7 +374,7 @@
for (el = sess->content; el; el = el->next) {
sc = (SessionContent*)el->data;
// TODO size!
- sc->appfuncs->start(sess->sid, (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to, sc->name, sc->description, 2048);
+ sc2sc->appfuncs->start(sess->sid, (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to, sc->name, sc->description, 2048);
}
}
--- a/jingle/jingle.c Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/jingle.c Fri Aug 13 18:06:17 2010 +0200
@@ -209,7 +209,7 @@
} else {
scr_LogPrint(LPRINT_LOGNORM, "Jingle event from %s cancelled.",
jn->initiator);
- jingle_send_session_terminate(jn, "decline");
+ // TODO: jingle_send_session_terminate(jn, "decline");
jingle_free_jinglenode(jn);
}
@@ -466,6 +466,20 @@
sc->appfuncs->handle_data(sc->description, data2, len);
}
+void handle_trans_next(session_content *sc2) {
+ JingleSession *sess = session_find_by_sid(sc2->sid, sc2->from);
+ if (sess == NULL) {
+ // TODO: err
+ return;
+ }
+
+ SessionContent *sc = session_find_sessioncontent(sess, sc2->name);
+
+ // TODO: size!
+ sc->appfuncs->send(sc2, 2048);
+ g_free(sc2);
+}
+
gchar *jingle_generate_sid(void)
{
gchar *sid;
--- a/jingle/jingle.h Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/jingle.h Fri Aug 13 18:06:17 2010 +0200
@@ -115,6 +115,11 @@
gpointer *user_data;
} JingleAckHandle;
+typedef struct {
+ const gchar *sid;
+ const gchar *from;
+ const gchar *name;
+} session_content;
LmHandlerResult jingle_handle_ack_iq(LmMessageHandler *handler,
LmConnection *connection,
--- a/jingle/register.h Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/register.h Fri Aug 13 18:06:17 2010 +0200
@@ -37,15 +37,15 @@
typedef gconstpointer (*JingleAppCheck) (JingleContent *cn, GError **err);
typedef void (*JingleAppToMessage) (gconstpointer data, LmMessageNode *node);
typedef gboolean (*JingleAppHandleData) (gconstpointer data, const gchar *data2, guint len);
-typedef void (*JingleAppStart) (const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
-typedef void (*JingleAppSend) (const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
+typedef void (*JingleAppStart) (session_content *sc, gsize size);
+typedef void (*JingleAppSend) (session_content *sc, gsize size);
typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err);
typedef void (*JingleTransportToMessage) (gconstpointer data, LmMessageNode *node);
typedef gboolean (*JingleTransportCmp) (gconstpointer data1, gconstpointer data2);
typedef const gchar* (*JingleTransportxmlns) (void);
typedef gconstpointer (*JingleTransportNew) (void);
-typedef void (*JingleTransportSend) (const gchar *to, gconstpointer data, gchar *buf, gsize size);
+typedef void (*JingleTransportSend) (session_content *sc, const gchar *to, gconstpointer data, gchar *buf, gsize size);
typedef struct {
/* check if the description of a JingleContent is correct */
--- a/jingle/send.c Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/send.c Fri Aug 13 18:06:17 2010 +0200
@@ -32,24 +32,27 @@
#include <jingle/send.h>
-void jingle_send_session_terminate(JingleNode *jn, const gchar *reason)
+void jingle_send_session_terminate(JingleSession *js, const gchar *reason)
{
- LmMessage *r;
- LmMessageNode *err,*err2;
- JingleNode *reply = g_new0(JingleNode, 1);
JingleAckHandle *ackhandle;
- reply->action = JINGLE_SESSION_TERMINATE;
- reply->sid = jn->sid;
-
- r = lm_message_from_jinglenode(reply, lm_message_get_from(jn->message));
+ LmMessage *r = lm_message_new_with_sub_type(js->to, LM_MESSAGE_TYPE_IQ,
+ LM_MESSAGE_SUB_TYPE_SET);
+ LmMessageNode *node = lm_message_get_node(r);
+ lm_message_node_add_child(node, "jingle", NULL);
+ node = lm_message_node_get_child(node, "jingle");
+ lm_message_node_set_attributes(node, "xmlns", NS_JINGLE,
+ "action", "session-terminate",
+ "sid", js->sid,
+ NULL);
+ lm_message_node_add_child(node, "reason", NULL);
+ node = lm_message_node_get_child(node, "reason");
+
if (r == NULL) return;
if (reason != NULL) {
- err2 = lm_message_node_get_child(r->node, "jingle");
- // TODO check reason
- err = lm_message_node_add_child(err2, "reason", NULL);
- lm_message_node_add_child(err, reason, NULL);
+ node = lm_message_node_get_child(node, "reason");
+ lm_message_node_add_child(node, reason, NULL);
}
ackhandle = g_new0(JingleAckHandle, 1);
@@ -122,13 +125,13 @@
}
if(g_slist_length(sess->content) == 0) {
- jingle_send_session_terminate(jn, "unsupported-applications");
+ jingle_send_session_terminate(sess, "unsupported-applications");
session_delete(sess);
return;
}
mess = lm_message_from_jinglesession(sess, JINGLE_SESSION_ACCEPT);
- scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(mess->node));
+
if (mess) {
ackhandle = g_new0(JingleAckHandle, 1);
ackhandle->callback = jingle_handle_ack_iq_sa;
@@ -167,7 +170,6 @@
LmMessage *mess = lm_message_from_jinglesession(js, JINGLE_SESSION_INITIATE);
lm_message_node_set_attribute(lm_message_node_get_child(mess->node, "jingle"),
"initiator", js->from);
-scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(mess->node));
if (mess) {
ackhandle = g_new0(JingleAckHandle, 1);
--- a/jingle/send.h Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/send.h Fri Aug 13 18:06:17 2010 +0200
@@ -7,7 +7,7 @@
#include <jingle/jingle.h>
#include <jingle/sessions.h>
-void jingle_send_session_terminate(JingleNode *jn, const gchar *reason);
+void jingle_send_session_terminate(JingleSession *js, const gchar *reason);
void jingle_send_session_initiate(JingleSession *js);
void jingle_send_session_accept(JingleNode *jn);
--- a/jingle/sessions.c Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/sessions.c Fri Aug 13 18:06:17 2010 +0200
@@ -162,15 +162,17 @@
return NULL;
}
-void session_remove_sessioncontent(JingleSession *sess, const gchar *name)
+int session_remove_sessioncontent(JingleSession *sess, const gchar *name)
{
SessionContent *sc;
sc = session_find_sessioncontent(sess, name);
if(sc == NULL) return;
- if (sc->state == JINGLE_SESSION_STATE_ACTIVE); // We should stop the transfert
+ if (sc->state == JINGLE_SESSION_STATE_ACTIVE); // We should stop the transfer
sess->content = g_slist_remove(sess->content, sc);
+
+ return g_slist_length(sess->content);
}
void session_changestate_sessioncontent(JingleSession *sess, const gchar *name,
@@ -276,10 +278,14 @@
{
// TODO: check that the module is always loaded
JingleSession *sess = session_find_by_sid(sid, from);
+ session_content *sc2 = g_new0(session_content, 1);
if (sess == NULL) {
scr_LogPrint(LPRINT_LOGNORM, "Session not found (%s)", name);
return;
}
SessionContent *sc = session_find_sessioncontent(sess, name);
- sc->transfuncs->send(sess->to, sc->transport, data, size);
+ sc2->sid = sess->sid;
+ sc2->from = (sess->origin == JINGLE_SESSION_INCOMING) ? sess->from : sess->to;
+ sc2->name = sc->name;
+ sc->transfuncs->send(sc2, sess->to, sc->transport, data, size);
}
--- a/jingle/sessions.h Fri Aug 13 15:17:52 2010 +0200
+++ b/jingle/sessions.h Fri Aug 13 18:06:17 2010 +0200
@@ -85,7 +85,7 @@
SessionState state);
SessionContent *session_find_sessioncontent(JingleSession *sess, const gchar *name);
SessionContent *session_find_transport(const gchar *xmlns_trans, gconstpointer data);
-void session_remove_sessioncontent(JingleSession *sess, const gchar *name);
+int session_remove_sessioncontent(JingleSession *sess, const gchar *name);
void session_changestate_sessioncontent(JingleSession *sess, const gchar *name,
SessionState state);
void session_delete(JingleSession *sess);