|
|
|
@ -1,10 +1,13 @@
|
|
|
|
|
# -*- mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*-
|
|
|
|
|
from copy import deepcopy
|
|
|
|
|
|
|
|
|
|
from messenger.messages import *
|
|
|
|
|
from file_transfers.file_transfers import SendAvatar, is_inline
|
|
|
|
|
from ui.contact_items import *
|
|
|
|
|
import utils.util as util
|
|
|
|
|
from common.tox_save import ToxSave
|
|
|
|
|
from wrapper_tests.support_testing import assert_main_thread
|
|
|
|
|
from copy import deepcopy
|
|
|
|
|
|
|
|
|
|
from middleware.callbacks import LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG, LOG_TRACE
|
|
|
|
|
|
|
|
|
|
# LOG=util.log
|
|
|
|
|
global LOG
|
|
|
|
@ -36,6 +39,7 @@ class FileTransfersHandler(ToxSave):
|
|
|
|
|
# File transfers support
|
|
|
|
|
|
|
|
|
|
def incoming_file_transfer(self, friend_number, file_number, size, file_name):
|
|
|
|
|
# main thread
|
|
|
|
|
"""
|
|
|
|
|
New transfer
|
|
|
|
|
:param friend_number: number of friend who sent file
|
|
|
|
@ -44,12 +48,15 @@ class FileTransfersHandler(ToxSave):
|
|
|
|
|
:param file_name: file name without path
|
|
|
|
|
"""
|
|
|
|
|
friend = self._get_friend_by_number(friend_number)
|
|
|
|
|
if friend is None: return None
|
|
|
|
|
if friend is None:
|
|
|
|
|
LOG.info(f'incoming_file_handler Friend NULL friend_number={friend_number}')
|
|
|
|
|
return None
|
|
|
|
|
auto = self._settings['allow_auto_accept'] and friend.tox_id in self._settings['auto_accept_from_friends']
|
|
|
|
|
inline = is_inline(file_name) and self._settings['allow_inline']
|
|
|
|
|
inline = False # ?is_inline(file_name) and self._settings['allow_inline']
|
|
|
|
|
file_id = self._tox.file_get_file_id(friend_number, file_number)
|
|
|
|
|
accepted = True
|
|
|
|
|
if file_id in self._paused_file_transfers:
|
|
|
|
|
LOG_INFO(f'incoming_file_handler paused friend_number={friend_number}')
|
|
|
|
|
(path, ft_friend_number, is_incoming, start_position) = self._paused_file_transfers[file_id]
|
|
|
|
|
pos = start_position if os.path.exists(path) else 0
|
|
|
|
|
if pos >= size:
|
|
|
|
@ -60,16 +67,22 @@ class FileTransfersHandler(ToxSave):
|
|
|
|
|
friend, accepted, size, file_name, file_number)
|
|
|
|
|
self.accept_transfer(path, friend_number, file_number, size, False, pos)
|
|
|
|
|
elif inline and size < 1024 * 1024:
|
|
|
|
|
LOG_INFO(f'incoming_file_handler small friend_number={friend_number}')
|
|
|
|
|
self._file_transfers_message_service.add_incoming_transfer_message(
|
|
|
|
|
friend, accepted, size, file_name, file_number)
|
|
|
|
|
self.accept_transfer('', friend_number, file_number, size, True)
|
|
|
|
|
elif auto:
|
|
|
|
|
# accepted is really started
|
|
|
|
|
LOG_INFO(f'incoming_file_handler auto friend_number={friend_number}')
|
|
|
|
|
path = self._settings['auto_accept_path'] or util.curr_directory()
|
|
|
|
|
self._file_transfers_message_service.add_incoming_transfer_message(
|
|
|
|
|
friend, accepted, size, file_name, file_number)
|
|
|
|
|
self.accept_transfer(path + '/' + file_name, friend_number, file_number, size)
|
|
|
|
|
else:
|
|
|
|
|
LOG_INFO(f'incoming_file_handler reject friend_number={friend_number}')
|
|
|
|
|
accepted = False
|
|
|
|
|
# FixME: need GUI ask
|
|
|
|
|
# accepted is really started
|
|
|
|
|
self._file_transfers_message_service.add_incoming_transfer_message(
|
|
|
|
|
friend, accepted, size, file_name, file_number)
|
|
|
|
|
|
|
|
|
@ -156,12 +169,15 @@ class FileTransfersHandler(ToxSave):
|
|
|
|
|
|
|
|
|
|
def send_inline(self, data, file_name, friend_number, is_resend=False):
|
|
|
|
|
friend = self._get_friend_by_number(friend_number)
|
|
|
|
|
if friend is None: return None
|
|
|
|
|
if friend is None:
|
|
|
|
|
LOG_WARN("fsend_inline Error friend is None file_name: {file_name}")
|
|
|
|
|
return
|
|
|
|
|
if friend.status is None and not is_resend:
|
|
|
|
|
self._file_transfers_message_service.add_unsent_file_message(friend, file_name, data)
|
|
|
|
|
return
|
|
|
|
|
elif friend.status is None and is_resend:
|
|
|
|
|
raise RuntimeError()
|
|
|
|
|
LOG_WARN("fsend_inline Error friend.status is None file_name: {file_name}")
|
|
|
|
|
return
|
|
|
|
|
st = SendFromBuffer(self._tox, friend.number, data, file_name)
|
|
|
|
|
self._send_file_add_set_handlers(st, friend, file_name, True)
|
|
|
|
|
|
|
|
|
@ -179,7 +195,7 @@ class FileTransfersHandler(ToxSave):
|
|
|
|
|
self._file_transfers_message_service.add_unsent_file_message(friend, path, None)
|
|
|
|
|
return
|
|
|
|
|
elif friend.status is None and is_resend:
|
|
|
|
|
LOG.error('Error in sending')
|
|
|
|
|
LOG_WARN('Error in sending')
|
|
|
|
|
return
|
|
|
|
|
st = SendTransfer(path, self._tox, friend_number, TOX_FILE_KIND['DATA'], file_id)
|
|
|
|
|
file_name = os.path.basename(path)
|
|
|
|
@ -236,7 +252,7 @@ class FileTransfersHandler(ToxSave):
|
|
|
|
|
self.send_file(path, friend_number, True, key)
|
|
|
|
|
del self._paused_file_transfers[key]
|
|
|
|
|
except Exception as ex:
|
|
|
|
|
LOG.error('Exception in file sending: ' + str(ex))
|
|
|
|
|
LOG_ERROR('send_files EXCEPTION in file sending: ' + str(ex))
|
|
|
|
|
|
|
|
|
|
def friend_exit(self, friend_number):
|
|
|
|
|
# RuntimeError: dictionary changed size during iteration
|
|
|
|
@ -248,9 +264,21 @@ class FileTransfersHandler(ToxSave):
|
|
|
|
|
continue
|
|
|
|
|
ft = self._file_transfers[(friend_num, file_num)]
|
|
|
|
|
if type(ft) is SendTransfer:
|
|
|
|
|
self._paused_file_transfers[ft.file_id] = [ft.path, friend_num, False, -1]
|
|
|
|
|
try:
|
|
|
|
|
file_id = ft.file_id
|
|
|
|
|
except Exception as e:
|
|
|
|
|
LOG_WARN("friend_exit SendTransfer Error getting file_id: {e}")
|
|
|
|
|
# drop through
|
|
|
|
|
else:
|
|
|
|
|
self._paused_file_transfers[file_id] = [ft.path, friend_num, False, -1]
|
|
|
|
|
elif type(ft) is ReceiveTransfer and ft.state != FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']:
|
|
|
|
|
self._paused_file_transfers[ft.file_id] = [ft.path, friend_num, True, ft.total_size()]
|
|
|
|
|
try:
|
|
|
|
|
file_id = ft.file_id
|
|
|
|
|
except Exception as e:
|
|
|
|
|
LOG_WARN("friend_exit ReceiveTransfer Error getting file_id: {e}")
|
|
|
|
|
# drop through
|
|
|
|
|
else:
|
|
|
|
|
self._paused_file_transfers[file_id] = [ft.path, friend_num, True, ft.total_size()]
|
|
|
|
|
self.cancel_transfer(friend_num, file_num, True)
|
|
|
|
|
|
|
|
|
|
# Avatars support
|
|
|
|
@ -260,15 +288,24 @@ class FileTransfersHandler(ToxSave):
|
|
|
|
|
:param friend_number: number of friend who should get new avatar
|
|
|
|
|
:param avatar_path: path to avatar or None if reset
|
|
|
|
|
"""
|
|
|
|
|
return
|
|
|
|
|
if (avatar_path, friend_number,) in self.lBlockAvatars:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if friend_number is None:
|
|
|
|
|
LOG_WARN(f"send_avatar friend_number NULL {friend_number}")
|
|
|
|
|
return
|
|
|
|
|
if avatar_path and type(avatar_path) != str:
|
|
|
|
|
LOG_WARN(f"send_avatar avatar_path type {type(avatar_path)}")
|
|
|
|
|
return
|
|
|
|
|
LOG_INFO(f"send_avatar avatar_path={avatar_path} friend_number={friend_number}")
|
|
|
|
|
try:
|
|
|
|
|
# self NOT missing - who's self?
|
|
|
|
|
sa = SendAvatar(avatar_path, self._tox, friend_number)
|
|
|
|
|
LOG_INFO(f"send_avatar avatar_path={avatar_path} sa={sa}")
|
|
|
|
|
self._file_transfers[(friend_number, sa.file_number)] = sa
|
|
|
|
|
except Exception as e:
|
|
|
|
|
# ArgumentError('This client is currently not connected to the friend.')
|
|
|
|
|
LOG.error(f"send_avatar {e}")
|
|
|
|
|
LOG_WARN(f"send_avatar EXCEPTION {e}")
|
|
|
|
|
self.lBlockAvatars.append( (avatar_path, friend_number,) )
|
|
|
|
|
|
|
|
|
|
def incoming_avatar(self, friend_number, file_number, size):
|
|
|
|
|