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