From 867c8f92e4ed603f12d079861a4ee66a553bdaf6 Mon Sep 17 00:00:00 2001 From: Jakub Adam Date: Tue, 29 Jul 2014 15:16:50 +0200 Subject: [PATCH] filetransfer: use 'init' callback in sipe_file_transfer Replaces sipe_core_ft_incoming_init() and sipe_core_ft_outgoing_init(). The specific callback is now set by Sipe core depending on whether sending or receiving files is being handled. This will allow for some code to be shared between legacy OCS file transfer and the new Lync approach. --- src/api/sipe-core.h | 7 +++---- src/core/sipe-ft.c | 24 +++++++++++++++++++----- src/miranda/miranda-ft.c | 6 +++--- src/purple/purple-ft.c | 23 ++++++++++------------- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/api/sipe-core.h b/src/api/sipe-core.h index 934a8ba0..2403a4a0 100644 --- a/src/api/sipe-core.h +++ b/src/api/sipe-core.h @@ -77,6 +77,9 @@ struct sipe_chat_session; */ struct sipe_file_transfer { struct sipe_backend_file_transfer *backend_private; + + void (* init)(struct sipe_file_transfer *ft, const gchar *filename, + gsize size, const gchar *who); }; /** @@ -446,10 +449,6 @@ void sipe_core_media_test_call(struct sipe_core_public *sipe_public); struct sipe_file_transfer *sipe_core_ft_allocate(struct sipe_core_public *sipe_public); void sipe_core_ft_deallocate(struct sipe_file_transfer *ft); void sipe_core_ft_cancel(struct sipe_file_transfer *ft); -void sipe_core_ft_incoming_init(struct sipe_file_transfer *ft); -void sipe_core_ft_outgoing_init(struct sipe_file_transfer *ft, - const gchar *filename, gsize size, - const gchar *who); void sipe_core_tftp_incoming_start(struct sipe_file_transfer *ft, gsize total_size); diff --git a/src/core/sipe-ft.c b/src/core/sipe-ft.c index 6d7eeb97..284af92c 100644 --- a/src/core/sipe-ft.c +++ b/src/core/sipe-ft.c @@ -3,7 +3,7 @@ * * pidgin-sipe * - * Copyright (C) 2010-12 SIPE Project + * Copyright (C) 2010-2015 SIPE Project * Copyright (C) 2010 Jakub Adam * Copyright (C) 2010 Tomáš Hrabčík * @@ -34,6 +34,7 @@ #include "sipmsg.h" #include "sip-transport.h" #include "sipe-backend.h" +#include "sipe-common.h" #include "sipe-core.h" #include "sipe-core-private.h" #include "sipe-crypt.h" @@ -58,6 +59,10 @@ #define SIPE_FT_TCP_PORT_MIN 6891 #define SIPE_FT_TCP_PORT_MAX 6901 +static void +ft_outgoing_init(struct sipe_file_transfer *ft, const gchar *filename, + gsize size, const gchar *who); + void sipe_ft_raise_error_and_cancel(struct sipe_file_transfer_private *ft_private, const gchar *errmsg) { @@ -78,6 +83,9 @@ struct sipe_file_transfer *sipe_core_ft_allocate(struct sipe_core_public *sipe_p g_new0(struct sipe_file_transfer_private, 1); ft_private->sipe_private = sipe_private; + + ft_private->public.init = ft_outgoing_init; + ft_private->invitation_cookie = g_strdup_printf("%u", rand() % 1000000000); return(SIPE_FILE_TRANSFER_PUBLIC); @@ -228,7 +236,11 @@ client_connected_cb(struct sipe_backend_fd *fd, gpointer data) sipe_backend_fd_free(fd); } -void sipe_core_ft_incoming_init(struct sipe_file_transfer *ft) +static void +ft_incoming_init(struct sipe_file_transfer *ft, + SIPE_UNUSED_PARAMETER const gchar *filename, + SIPE_UNUSED_PARAMETER gsize size, + SIPE_UNUSED_PARAMETER const gchar *who) { struct sipe_file_transfer_private *ft_private = SIPE_FILE_TRANSFER_PRIVATE; @@ -244,9 +256,9 @@ void sipe_core_ft_incoming_init(struct sipe_file_transfer *ft) } } -void sipe_core_ft_outgoing_init(struct sipe_file_transfer *ft, - const gchar *filename, gsize size, - const gchar *who) +static void +ft_outgoing_init(struct sipe_file_transfer *ft, const gchar *filename, + gsize size, const gchar *who) { struct sipe_file_transfer_private *ft_private = SIPE_FILE_TRANSFER_PRIVATE; struct sipe_core_private *sipe_private = ft_private->sipe_private; @@ -296,6 +308,8 @@ void sipe_ft_incoming_transfer(struct sipe_core_private *sipe_private, ft_private = g_new0(struct sipe_file_transfer_private, 1); ft_private->sipe_private = sipe_private; + ft_private->public.init = ft_incoming_init; + generate_key(ft_private->encryption_key, SIPE_FT_KEY_LENGTH); generate_key(ft_private->hash_key, SIPE_FT_KEY_LENGTH); diff --git a/src/miranda/miranda-ft.c b/src/miranda/miranda-ft.c index 2d444a20..2a6e9e1c 100644 --- a/src/miranda/miranda-ft.c +++ b/src/miranda/miranda-ft.c @@ -3,7 +3,7 @@ * * pidgin-sipe * - * Copyright (C) 2010-11 SIPE Project + * Copyright (C) 2010-2015 SIPE Project * Copyright (C) 2010 Jakub Adam * Copyright (C) 2010 Tomáš Hrabčík * @@ -700,7 +700,7 @@ sipe_miranda_SendFile( SIPPROTO *pr, HANDLE hContact, const PROTOCHAR* szDescrip ft->backend_private->local_filename = g_strdup(TCHAR2CHAR(ppszFiles[0])); ft->backend_private->filename = g_path_get_basename(ft->backend_private->local_filename); FT_SIPE_DEBUG_INFO("set filename to <%s>", ft->backend_private->filename); - sipe_core_ft_outgoing_init(ft, ft->backend_private->filename, ft->backend_private->file_size, dbv.pszVal); + ft->init(ft, ft->backend_private->filename, ft->backend_private->file_size, dbv.pszVal); sipe_miranda_SendBroadcast(pr, hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, (HANDLE)ft->backend_private, 0); UNLOCK; @@ -724,7 +724,7 @@ sipe_miranda_FileAllow( SIPPROTO *pr, HANDLE hContact, HANDLE hTransfer, const P FT_SIPE_DEBUG_INFO("Incoming ft <%08x> allowed", ft); ft->backend_private->local_filename = g_strdup_printf("%s%s", TCHAR2CHAR(szPath), ft->backend_private->filename); sipe_miranda_SendBroadcast(pr, hContact, ACKTYPE_FILE, ACKRESULT_CONNECTING, (HANDLE)ft->backend_private, 0); - sipe_core_ft_incoming_init(ft); + ft->init(ft, ft->backend_private->filename, ft->backend_private->file_size, NULL); return ft->backend_private; } diff --git a/src/purple/purple-ft.c b/src/purple/purple-ft.c index f682c125..3b619abe 100644 --- a/src/purple/purple-ft.c +++ b/src/purple/purple-ft.c @@ -168,9 +168,15 @@ ft_request_denied(PurpleXfer *xfer) } static void -ft_incoming_init(PurpleXfer *xfer) +ft_init(PurpleXfer *xfer) { - sipe_core_ft_incoming_init(PURPLE_XFER_TO_SIPE_FILE_TRANSFER); + struct sipe_file_transfer *ft = PURPLE_XFER_TO_SIPE_FILE_TRANSFER; + g_return_if_fail(ft->init); + + ft->init(ft, + purple_xfer_get_filename(xfer), + purple_xfer_get_size(xfer), + purple_xfer_get_remote_user(xfer)); } static void @@ -209,15 +215,6 @@ static gssize tftp_read(guchar **buffer, } static void -ft_outgoing_init(PurpleXfer *xfer) -{ - sipe_core_ft_outgoing_init(PURPLE_XFER_TO_SIPE_FILE_TRANSFER, - purple_xfer_get_filename(xfer), - purple_xfer_get_size(xfer), - purple_xfer_get_remote_user(xfer)); -} - -static void tftp_outgoing_start(PurpleXfer *xfer) { /* Set socket to non-blocking mode */ @@ -274,7 +271,7 @@ void sipe_backend_ft_incoming(struct sipe_core_public *sipe_public, purple_xfer_set_filename(xfer, file_name); purple_xfer_set_size(xfer, file_size); - purple_xfer_set_init_fnc(xfer, ft_incoming_init); + purple_xfer_set_init_fnc(xfer, ft_init); purple_xfer_set_request_denied_fnc(xfer, ft_request_denied); purple_xfer_set_cancel_send_fnc(xfer, ft_free_xfer_struct); purple_xfer_set_cancel_recv_fnc(xfer, ft_free_xfer_struct); @@ -354,7 +351,7 @@ PurpleXfer *sipe_purple_ft_new_xfer(PurpleConnection *gc, const char *who) ft->backend_private = (struct sipe_backend_file_transfer *)xfer; purple_xfer_set_protocol_data(xfer, ft); - purple_xfer_set_init_fnc(xfer, ft_outgoing_init); + purple_xfer_set_init_fnc(xfer, ft_init); purple_xfer_set_request_denied_fnc(xfer, ft_request_denied); purple_xfer_set_cancel_send_fnc(xfer, ft_free_xfer_struct); purple_xfer_set_cancel_recv_fnc(xfer, ft_free_xfer_struct); -- 2.11.4.GIT