From 332fec9cba7a02b67be7681ad6a2581701980473 Mon Sep 17 00:00:00 2001 From: Jakub Adam Date: Tue, 29 Jul 2014 20:11:48 +0200 Subject: [PATCH] filetransfer: use 'end' callback in sipe_file_transfer Replaces sipe_core_tftp_incoming_stop() and sipe_core_tftp_outgoing_stop(). --- src/api/sipe-core.h | 3 +-- src/core/sipe-ft-tftp.c | 4 ++-- src/core/sipe-ft-tftp.h | 6 ++++++ src/core/sipe-ft.c | 2 ++ src/miranda/miranda-ft.c | 18 +++++------------- src/purple/purple-ft.c | 22 ++++++++-------------- 6 files changed, 24 insertions(+), 31 deletions(-) diff --git a/src/api/sipe-core.h b/src/api/sipe-core.h index a75a520d..ea73c85b 100644 --- a/src/api/sipe-core.h +++ b/src/api/sipe-core.h @@ -81,6 +81,7 @@ struct sipe_file_transfer { void (* init)(struct sipe_file_transfer *ft, const gchar *filename, gsize size, const gchar *who); void (* start)(struct sipe_file_transfer *ft, gsize total_size); + gboolean (* end)(struct sipe_file_transfer *ft); void (* request_denied)(struct sipe_file_transfer *ft); void (* deallocate)(struct sipe_file_transfer *ft); }; @@ -451,8 +452,6 @@ void sipe_core_media_test_call(struct sipe_core_public *sipe_public); /* file transfer */ struct sipe_file_transfer *sipe_core_ft_allocate(struct sipe_core_public *sipe_public); -gboolean sipe_core_tftp_incoming_stop(struct sipe_file_transfer *ft); -gboolean sipe_core_tftp_outgoing_stop(struct sipe_file_transfer *ft); gssize sipe_core_tftp_read(struct sipe_file_transfer *ft, guchar **buffer, gsize bytes_remaining, gsize bytes_available); gssize sipe_core_tftp_write(struct sipe_file_transfer *ft, const guchar *buffer, diff --git a/src/core/sipe-ft-tftp.c b/src/core/sipe-ft-tftp.c index b1a843a6..6e6b640c 100644 --- a/src/core/sipe-ft-tftp.c +++ b/src/core/sipe-ft-tftp.c @@ -220,7 +220,7 @@ sipe_ft_tftp_start_receiving(struct sipe_file_transfer *ft, gsize total_size) } gboolean -sipe_core_tftp_incoming_stop(struct sipe_file_transfer *ft) +sipe_ft_tftp_stop_receiving(struct sipe_file_transfer *ft) { static const guchar BYE[] = "BYE 16777989\r\n"; const gsize MAC_OFFSET = 4; @@ -335,7 +335,7 @@ sipe_ft_tftp_start_sending(struct sipe_file_transfer *ft, gsize total_size) } gboolean -sipe_core_tftp_outgoing_stop(struct sipe_file_transfer *ft) +sipe_ft_tftp_stop_sending(struct sipe_file_transfer *ft) { struct sipe_file_transfer_private *ft_private = SIPE_FILE_TRANSFER_PRIVATE; guchar buffer[BUFFER_SIZE]; diff --git a/src/core/sipe-ft-tftp.h b/src/core/sipe-ft-tftp.h index d6339b25..3c8c757a 100644 --- a/src/core/sipe-ft-tftp.h +++ b/src/core/sipe-ft-tftp.h @@ -23,5 +23,11 @@ void sipe_ft_tftp_start_receiving(struct sipe_file_transfer *ft, gsize total_size); +gboolean +sipe_ft_tftp_stop_receiving(struct sipe_file_transfer *ft); + void sipe_ft_tftp_start_sending(struct sipe_file_transfer *ft, gsize total_size); + +gboolean +sipe_ft_tftp_stop_sending(struct sipe_file_transfer *ft); diff --git a/src/core/sipe-ft.c b/src/core/sipe-ft.c index d559b4ac..9a1bb44f 100644 --- a/src/core/sipe-ft.c +++ b/src/core/sipe-ft.c @@ -87,6 +87,7 @@ struct sipe_file_transfer *sipe_core_ft_allocate(struct sipe_core_public *sipe_p ft_private->public.init = ft_outgoing_init; ft_private->public.start = sipe_ft_tftp_start_sending; + ft_private->public.end = sipe_ft_tftp_stop_sending; ft_private->public.deallocate = sipe_ft_free; ft_private->invitation_cookie = g_strdup_printf("%u", rand() % 1000000000); @@ -309,6 +310,7 @@ void sipe_ft_incoming_transfer(struct sipe_core_private *sipe_private, ft_private->public.init = ft_incoming_init; ft_private->public.start = sipe_ft_tftp_start_receiving; + ft_private->public.end = sipe_ft_tftp_stop_receiving; ft_private->public.request_denied = ft_request_denied; ft_private->public.deallocate = sipe_ft_free; diff --git a/src/miranda/miranda-ft.c b/src/miranda/miranda-ft.c index 41d2cb0f..90732b2d 100644 --- a/src/miranda/miranda-ft.c +++ b/src/miranda/miranda-ft.c @@ -538,19 +538,11 @@ do_transfer(struct sipe_backend_file_transfer *xfer) if (xfer->status == SIPE_MIRANDA_XFER_STATUS_DONE) { xfer->end_time = time(NULL); - if (xfer->incoming) - { - if (sipe_core_tftp_incoming_stop(xfer->ft)) { - /* We're done with this transfer */ - free_xfer_struct(xfer); - } else { - _unlink(xfer->local_filename); - } - } else { - if (sipe_core_tftp_outgoing_stop(xfer->ft)) { - /* We're done with this transfer */ - free_xfer_struct(xfer); - } + if (xfer->ft->end && xfer->ft->end(xfer->ft)) { + /* We're done with this transfer */ + free_xfer_struct(xfer); + } else if (xfer->incoming) { + _unlink(xfer->local_filename); } if (xfer->watcher != 0) { diff --git a/src/purple/purple-ft.c b/src/purple/purple-ft.c index 5bcc6e8b..c93a6895 100644 --- a/src/purple/purple-ft.c +++ b/src/purple/purple-ft.c @@ -205,12 +205,15 @@ ft_start(PurpleXfer *xfer) } static void -tftp_incoming_stop(PurpleXfer *xfer) +ft_end(PurpleXfer *xfer) { - if (sipe_core_tftp_incoming_stop(PURPLE_XFER_TO_SIPE_FILE_TRANSFER)) { + struct sipe_file_transfer *ft = PURPLE_XFER_TO_SIPE_FILE_TRANSFER; + + if (ft->end && ft->end(ft)) { /* We're done with this transfer */ ft_free_xfer_struct(xfer); - } else { + } else if (purple_xfer_get_xfer_type(xfer) == PURPLE_XFER_TYPE_RECEIVE) { + /* Remove incomplete file from failed transfer. */ unlink(purple_xfer_get_local_filename(xfer)); } } @@ -232,15 +235,6 @@ static gssize tftp_read(guchar **buffer, ); } -static void -tftp_outgoing_stop(PurpleXfer *xfer) -{ - if (sipe_core_tftp_outgoing_stop(PURPLE_XFER_TO_SIPE_FILE_TRANSFER)) { - /* We're done with this transfer */ - ft_free_xfer_struct(xfer); - } -} - static gssize tftp_write(const guchar *buffer, size_t size, PurpleXfer *xfer) { @@ -280,7 +274,7 @@ void sipe_backend_ft_incoming(struct sipe_core_public *sipe_public, purple_xfer_set_cancel_send_fnc(xfer, ft_free_xfer_struct); purple_xfer_set_cancel_recv_fnc(xfer, ft_free_xfer_struct); purple_xfer_set_start_fnc(xfer, ft_start); - purple_xfer_set_end_fnc(xfer, tftp_incoming_stop); + purple_xfer_set_end_fnc(xfer, ft_end); purple_xfer_set_read_fnc(xfer, tftp_read); purple_xfer_request(xfer); @@ -360,7 +354,7 @@ PurpleXfer *sipe_purple_ft_new_xfer(PurpleConnection *gc, const char *who) purple_xfer_set_cancel_send_fnc(xfer, ft_free_xfer_struct); purple_xfer_set_cancel_recv_fnc(xfer, ft_free_xfer_struct); purple_xfer_set_start_fnc(xfer, ft_start); - purple_xfer_set_end_fnc(xfer, tftp_outgoing_stop); + purple_xfer_set_end_fnc(xfer, ft_end); purple_xfer_set_write_fnc(xfer, tftp_write); } -- 2.11.4.GIT