jingle-filetransfer/filetransfer.c
changeset 125 3b640eb09fbd
parent 124 7773e8147c29
child 126 059a6737f6a4
equal deleted inserted replaced
124:7773e8147c29 125:3b640eb09fbd
    42 #include <jingle/send.h>
    42 #include <jingle/send.h>
    43 
    43 
    44 #include "filetransfer.h"
    44 #include "filetransfer.h"
    45 
    45 
    46 
    46 
    47 gconstpointer jingle_ft_check(JingleContent *cn, GError **err);
    47 static gconstpointer check(JingleContent *cn, GError **err);
    48 gboolean jingle_ft_handle(JingleAction action, gconstpointer data, LmMessageNode *node);
    48 static gboolean handle(JingleAction action, gconstpointer data, LmMessageNode *node);
    49 void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node);
    49 static void tomessage(gconstpointer data, LmMessageNode *node);
    50 gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len);
    50 static gboolean handle_data(gconstpointer data, const gchar *data2, guint len);
    51 void jingle_ft_start(session_content *sc);
    51 static void start(session_content *sc);
    52 void jingle_ft_send(session_content *sc);
    52 static void send(session_content *sc);
    53 void jingle_ft_stop(gconstpointer data);
    53 static void stop(gconstpointer data);
    54 
    54 
    55 static gboolean is_md5_hash(const gchar *hash);
    55 static gboolean is_md5_hash(const gchar *hash);
    56 
    56 
    57 static void jingle_ft_init(void);
    57 static void jingle_ft_init(void);
    58 static void jingle_ft_uninit(void);
    58 static void jingle_ft_uninit(void);
    59 
    59 
    60 const gchar *deps[] = { "jingle", NULL };
    60 const gchar *deps[] = { "jingle", NULL };
    61 
    61 
    62 static JingleAppFuncs funcs = {
    62 static JingleAppFuncs funcs = {
    63   .check        = jingle_ft_check,
    63   .check        = check,
    64   .handle       = jingle_ft_handle,
    64   .handle       = handle,
    65   .tomessage    = jingle_ft_tomessage,
    65   .tomessage    = tomessage,
    66   .handle_data  = jingle_ft_handle_data,
    66   .handle_data  = handle_data,
    67   .start        = jingle_ft_start,
    67   .start        = start,
    68   .send         = jingle_ft_send,
    68   .send         = send,
    69   .stop         = jingle_ft_stop
    69   .stop         = stop
    70 };
    70 };
    71 
    71 
    72 module_info_t info_jingle_filetransfer = {
    72 module_info_t info_jingle_filetransfer = {
    73   .branch          = MCABBER_BRANCH,
    73   .branch          = MCABBER_BRANCH,
    74   .api             = MCABBER_API_VERSION,
    74   .api             = MCABBER_API_VERSION,
    79   .uninit          = jingle_ft_uninit,
    79   .uninit          = jingle_ft_uninit,
    80   .next            = NULL,
    80   .next            = NULL,
    81 };
    81 };
    82 
    82 
    83 
    83 
    84 gconstpointer jingle_ft_check(JingleContent *cn, GError **err)
    84 static gconstpointer check(JingleContent *cn, GError **err)
    85 {
    85 {
    86   JingleFT *ft = NULL;
    86   JingleFT *ft = NULL;
    87   LmMessageNode *node;
    87   LmMessageNode *node;
    88   gint64 tmpsize;
    88   gint64 tmpsize;
    89   const gchar *datestr, *sizestr;
    89   const gchar *datestr, *sizestr;
   160   ft->hash = g_strndup(ft->hash, 32);
   160   ft->hash = g_strndup(ft->hash, 32);
   161 
   161 
   162   return (gconstpointer) ft;
   162   return (gconstpointer) ft;
   163 }
   163 }
   164 
   164 
   165 gboolean jingle_ft_handle(JingleAction action, gconstpointer data,
   165 static gboolean handle(JingleAction action, gconstpointer data,
   166                           LmMessageNode *node)
   166                           LmMessageNode *node)
   167 {
   167 {
   168   if (action == JINGLE_SESSION_INFO) {
   168   if (action == JINGLE_SESSION_INFO) {
   169     if (!g_strcmp0(lm_message_node_get_attribute(node, "xmlns"),
   169     if (!g_strcmp0(lm_message_node_get_attribute(node, "xmlns"),
   170                    NS_JINGLE_APP_FT_INFO)
   170                    NS_JINGLE_APP_FT_INFO)
   187     return TRUE;
   187     return TRUE;
   188   else
   188   else
   189     return FALSE;
   189     return FALSE;
   190 }
   190 }
   191 
   191 
   192 gboolean jingle_ft_handle_data(gconstpointer jingleft, const gchar *data, guint len)
   192 static gboolean handle_data(gconstpointer jingleft, const gchar *data, guint len)
   193 {
   193 {
   194   JingleFT *jft = (JingleFT *) jingleft;
   194   JingleFT *jft = (JingleFT *) jingleft;
   195   GError *err = NULL;
   195   GError *err = NULL;
   196   GIOStatus status;
   196   GIOStatus status;
   197   gsize bytes_written = 0;
   197   gsize bytes_written = 0;
   297   }
   297   }
   298 
   298 
   299   free_arg_lst(args);
   299   free_arg_lst(args);
   300 }
   300 }
   301 
   301 
   302 void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node)
   302 static void tomessage(gconstpointer data, LmMessageNode *node)
   303 {
   303 {
   304   JingleFT *jft = (JingleFT*) data;
   304   JingleFT *jft = (JingleFT*) data;
   305   gchar *size = NULL;
   305   gchar *size = NULL;
   306   gchar date[19];
   306   gchar date[19];
   307   
   307   
   334     lm_message_node_add_child(node2, "desc", jft->desc);
   334     lm_message_node_add_child(node2, "desc", jft->desc);
   335 
   335 
   336   //if (jft->data != 0)
   336   //if (jft->data != 0)
   337 }
   337 }
   338 
   338 
   339 void jingle_ft_send_hash(gchar *sid, gchar *to, gchar *hash)
   339 static void send_hash(gchar *sid, gchar *to, gchar *hash)
   340 {
   340 {
   341   JingleAckHandle *ackhandle;
   341   JingleAckHandle *ackhandle;
   342   
   342   
   343   LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
   343   LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
   344   LmMessageNode *node = lm_message_get_node(r);
   344   LmMessageNode *node = lm_message_get_node(r);
   356   lm_connection_send_with_reply(lconnection, r,
   356   lm_connection_send_with_reply(lconnection, r,
   357                                 jingle_new_ack_handler(ackhandle), NULL);
   357                                 jingle_new_ack_handler(ackhandle), NULL);
   358   lm_message_unref(r);
   358   lm_message_unref(r);
   359 }
   359 }
   360 
   360 
   361 void jingle_ft_send(session_content *sc)
   361 static void send(session_content *sc)
   362 {
   362 {
   363   JingleFT *jft;
   363   JingleFT *jft;
   364   gchar buf[JINGLE_FT_SIZE_READ];
   364   gchar buf[JINGLE_FT_SIZE_READ];
   365   gsize read;
   365   gsize read;
   366   GIOStatus status;
   366   GIOStatus status;
   403     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)", jft->name);
   403     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)", jft->name);
   404     jft->hash = g_strdup(g_checksum_get_string(jft->md5));
   404     jft->hash = g_strdup(g_checksum_get_string(jft->md5));
   405     // Call a function to say state is ended
   405     // Call a function to say state is ended
   406     session_changestate_sessioncontent(sess, sc2->name, JINGLE_SESSION_STATE_ENDED);
   406     session_changestate_sessioncontent(sess, sc2->name, JINGLE_SESSION_STATE_ENDED);
   407     // Send the hash
   407     // Send the hash
   408     jingle_ft_send_hash(sess->sid, sess->to, jft->hash);
   408     send_hash(sess->sid, sess->to, jft->hash);
   409     g_checksum_free(jft->md5);
   409     g_checksum_free(jft->md5);
   410     
   410     
   411     if (!session_remove_sessioncontent(sess, sc2->name)) {
   411     if (!session_remove_sessioncontent(sess, sc2->name)) {
   412       jingle_send_session_terminate(sess, "success");
   412       jingle_send_session_terminate(sess, "success");
   413       session_delete(sess);
   413       session_delete(sess);
   414     }
   414     }
   415   }
   415   }
   416 }
   416 }
   417 
   417 
   418 void jingle_ft_start(session_content *sc)
   418 static void start(session_content *sc)
   419 {
   419 {
   420   JingleFT *jft;
   420   JingleFT *jft;
   421   
   421   
   422   JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
   422   JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
   423   if (sess == NULL) {
   423   if (sess == NULL) {
   436 
   436 
   437   sc2->appfuncs->send(sc);
   437   sc2->appfuncs->send(sc);
   438 }
   438 }
   439 
   439 
   440 // When we got a session-terminate
   440 // When we got a session-terminate
   441 void jingle_ft_stop(gconstpointer data)
   441 static void stop(gconstpointer data)
   442 {
   442 {
   443   JingleFT *jft = (JingleFT*)data;
   443   JingleFT *jft = (JingleFT*)data;
   444 
   444 
   445   if (jft->hash != NULL && jft->md5 != NULL) {
   445   if (jft->hash != NULL && jft->md5 != NULL) {
   446     if (g_strcmp0(jft->hash, g_checksum_get_string(jft->md5))) {
   446     if (g_strcmp0(jft->hash, g_checksum_get_string(jft->md5))) {