Fixed crash on reconnection, file transfers fixes
This commit is contained in:
parent
ae4eae92ae
commit
cf4cfa979c
7 changed files with 37 additions and 32 deletions
|
@ -116,7 +116,7 @@ class ContactsManager(ToxSave):
|
||||||
if message.type == MESSAGE_TYPE['FILE_TRANSFER']:
|
if message.type == MESSAGE_TYPE['FILE_TRANSFER']:
|
||||||
self._messages_items_factory.create_file_transfer_item(message)
|
self._messages_items_factory.create_file_transfer_item(message)
|
||||||
elif message.type == MESSAGE_TYPE['INLINE']:
|
elif message.type == MESSAGE_TYPE['INLINE']:
|
||||||
self._messages_items_factory.create_inline_item(message.data)
|
self._messages_items_factory.create_inline_item(message)
|
||||||
else:
|
else:
|
||||||
self._messages_items_factory.create_message_item(message)
|
self._messages_items_factory.create_message_item(message)
|
||||||
self._messages.scrollToBottom()
|
self._messages.scrollToBottom()
|
||||||
|
|
|
@ -2,6 +2,7 @@ from contacts import basecontact
|
||||||
import random
|
import random
|
||||||
import threading
|
import threading
|
||||||
import common.tox_save as tox_save
|
import common.tox_save as tox_save
|
||||||
|
from middleware.threads import invoke_in_main_thread
|
||||||
|
|
||||||
|
|
||||||
class Profile(basecontact.BaseContact, tox_save.ToxSave):
|
class Profile(basecontact.BaseContact, tox_save.ToxSave):
|
||||||
|
@ -73,12 +74,13 @@ class Profile(basecontact.BaseContact, tox_save.ToxSave):
|
||||||
Recreate tox instance
|
Recreate tox instance
|
||||||
"""
|
"""
|
||||||
self.status = None
|
self.status = None
|
||||||
self._reset_action()
|
invoke_in_main_thread(self._reset_action)
|
||||||
|
|
||||||
def _reconnect(self):
|
def _reconnect(self):
|
||||||
self._waiting_for_reconnection = False
|
self._waiting_for_reconnection = False
|
||||||
contacts = self._contacts_provider.get_all_friends()
|
contacts = self._contacts_provider.get_all_friends()
|
||||||
if self.status is None or (all(list(map(lambda x: x.status is None, contacts))) and len(contacts)):
|
all_friends_offline = all(list(map(lambda x: x.status is None, contacts)))
|
||||||
|
if self.status is None or (all_friends_offline and len(contacts)):
|
||||||
self._waiting_for_reconnection = True
|
self._waiting_for_reconnection = True
|
||||||
self.restart()
|
self.restart()
|
||||||
self._timer = threading.Timer(50, self._reconnect)
|
self._timer = threading.Timer(50, self._reconnect)
|
||||||
|
|
|
@ -52,10 +52,10 @@ class FileTransfer:
|
||||||
self._file_id = self._file = None
|
self._file_id = self._file = None
|
||||||
|
|
||||||
def set_state_changed_handler(self, handler):
|
def set_state_changed_handler(self, handler):
|
||||||
self._state_changed_event += handler
|
self._state_changed_event += lambda *args: invoke_in_main_thread(handler, *args)
|
||||||
|
|
||||||
def set_transfer_finished_handler(self, handler):
|
def set_transfer_finished_handler(self, handler):
|
||||||
self._finished_event += handler
|
self._finished_event += lambda *args: invoke_in_main_thread(handler, *args)
|
||||||
|
|
||||||
def get_file_number(self):
|
def get_file_number(self):
|
||||||
return self._file_number
|
return self._file_number
|
||||||
|
@ -100,17 +100,17 @@ class FileTransfer:
|
||||||
def cancelled(self):
|
def cancelled(self):
|
||||||
if self._file is not None:
|
if self._file is not None:
|
||||||
self._file.close()
|
self._file.close()
|
||||||
self.state = FILE_TRANSFER_STATE['CANCELLED']
|
self.set_state(FILE_TRANSFER_STATE['CANCELLED'])
|
||||||
|
|
||||||
def pause(self, by_friend):
|
def pause(self, by_friend):
|
||||||
if not by_friend:
|
if not by_friend:
|
||||||
self.send_control(TOX_FILE_CONTROL['PAUSE'])
|
self.send_control(TOX_FILE_CONTROL['PAUSE'])
|
||||||
else:
|
else:
|
||||||
self.state = FILE_TRANSFER_STATE['PAUSED_BY_FRIEND']
|
self.set_state(FILE_TRANSFER_STATE['PAUSED_BY_FRIEND'])
|
||||||
|
|
||||||
def send_control(self, control):
|
def send_control(self, control):
|
||||||
if self._tox.file_control(self._friend_number, self._file_number, control):
|
if self._tox.file_control(self._friend_number, self._file_number, control):
|
||||||
self.state = control
|
self.set_state(control)
|
||||||
|
|
||||||
def get_file_id(self):
|
def get_file_id(self):
|
||||||
return self._tox.file_get_file_id(self._friend_number, self._file_number)
|
return self._tox.file_get_file_id(self._friend_number, self._file_number)
|
||||||
|
@ -121,10 +121,10 @@ class FileTransfer:
|
||||||
t = -1
|
t = -1
|
||||||
else:
|
else:
|
||||||
t = ((time() - self._creation_time) / percentage) * (1 - percentage)
|
t = ((time() - self._creation_time) / percentage) * (1 - percentage)
|
||||||
invoke_in_main_thread(self._state_changed_event, self.state, percentage, int(t))
|
self._state_changed_event(self.state, percentage, int(t))
|
||||||
|
|
||||||
def _finished(self):
|
def _finished(self):
|
||||||
invoke_in_main_thread(self._finished_event, self._friend_number, self._file_number)
|
self._finished_event(self._friend_number, self._file_number)
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# Send file
|
# Send file
|
||||||
|
|
|
@ -167,7 +167,7 @@ class FileTransfersHandler(ToxSave):
|
||||||
return
|
return
|
||||||
elif friend.status is None and is_resend:
|
elif friend.status is None and is_resend:
|
||||||
print('Error in sending')
|
print('Error in sending')
|
||||||
raise RuntimeError()
|
return
|
||||||
st = SendTransfer(path, self._tox, friend_number, TOX_FILE_KIND['DATA'], file_id)
|
st = SendTransfer(path, self._tox, friend_number, TOX_FILE_KIND['DATA'], file_id)
|
||||||
file_name = os.path.basename(path)
|
file_name = os.path.basename(path)
|
||||||
self._send_file_add_set_handlers(st, friend, file_name)
|
self._send_file_add_set_handlers(st, friend, file_name)
|
||||||
|
@ -210,7 +210,7 @@ class FileTransfersHandler(ToxSave):
|
||||||
else:
|
else:
|
||||||
self.send_file(path, friend_number, True)
|
self.send_file(path, friend_number, True)
|
||||||
friend.clear_unsent_files()
|
friend.clear_unsent_files()
|
||||||
for key in list(self._paused_file_transfers.keys()):
|
for key in self._paused_file_transfers.keys():
|
||||||
(path, ft_friend_number, is_incoming, start_position) = self._paused_file_transfers[key]
|
(path, ft_friend_number, is_incoming, start_position) = self._paused_file_transfers[key]
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
del self._paused_file_transfers[key]
|
del self._paused_file_transfers[key]
|
||||||
|
@ -221,14 +221,15 @@ class FileTransfersHandler(ToxSave):
|
||||||
print('Exception in file sending: ' + str(ex))
|
print('Exception in file sending: ' + str(ex))
|
||||||
|
|
||||||
def friend_exit(self, friend_number):
|
def friend_exit(self, friend_number):
|
||||||
for friend_num, file_num in list(self._file_transfers.keys()):
|
for friend_num, file_num in self._file_transfers.keys():
|
||||||
if friend_num == friend_number:
|
if friend_num != friend_number:
|
||||||
ft = self._file_transfers[(friend_num, file_num)]
|
continue
|
||||||
if type(ft) is SendTransfer:
|
ft = self._file_transfers[(friend_num, file_num)]
|
||||||
self._paused_file_transfers[ft.file_id] = [ft.path, friend_num, False, -1]
|
if type(ft) is SendTransfer:
|
||||||
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, False, -1]
|
||||||
self._paused_file_transfers[ft.file_id] = [ft.path, friend_num, True, ft.total_size()]
|
elif type(ft) is ReceiveTransfer and ft.state != FILE_TRANSFER_STATE['INCOMING_NOT_STARTED']:
|
||||||
self.cancel_transfer(friend_num, file_num, True)
|
self._paused_file_transfers[ft.file_id] = [ft.path, friend_num, True, ft.total_size()]
|
||||||
|
self.cancel_transfer(friend_num, file_num, True)
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# Avatars support
|
# Avatars support
|
||||||
|
@ -267,7 +268,9 @@ class FileTransfersHandler(ToxSave):
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
def _is_friend_online(self, friend_number):
|
def _is_friend_online(self, friend_number):
|
||||||
return self._get_friend_by_number(friend_number).status is not None
|
friend = self._get_friend_by_number(friend_number)
|
||||||
|
|
||||||
|
return friend.status is not None
|
||||||
|
|
||||||
def _get_friend_by_number(self, friend_number):
|
def _get_friend_by_number(self, friend_number):
|
||||||
return self._contact_provider.get_friend_by_number(friend_number)
|
return self._contact_provider.get_friend_by_number(friend_number)
|
||||||
|
|
|
@ -82,14 +82,15 @@ class History:
|
||||||
messages.reverse()
|
messages.reverse()
|
||||||
messages = messages[self._messages.count():self._messages.count() + PAGE_SIZE]
|
messages = messages[self._messages.count():self._messages.count() + PAGE_SIZE]
|
||||||
for message in messages:
|
for message in messages:
|
||||||
if message.get_type() in (MESSAGE_TYPE['TEXT'], MESSAGE_TYPE['ACTION']): # text message
|
message_type = message.get_type()
|
||||||
|
if message_type in (MESSAGE_TYPE['TEXT'], MESSAGE_TYPE['ACTION']): # text message
|
||||||
self._create_message_item(message)
|
self._create_message_item(message)
|
||||||
elif message.get_type() == MESSAGE_TYPE['FILE_TRANSFER']: # file transfer
|
elif message_type == MESSAGE_TYPE['FILE_TRANSFER']: # file transfer
|
||||||
if message.get_status() is None:
|
if message.state == FILE_TRANSFER_STATE['UNSENT']:
|
||||||
self._create_unsent_file_item(message)
|
self._create_unsent_file_item(message)
|
||||||
continue
|
else:
|
||||||
self._create_file_transfer_item(message)
|
self._create_file_transfer_item(message)
|
||||||
elif message.get_type() == MESSAGE_TYPE['INLINE']: # inline image
|
elif message_type == MESSAGE_TYPE['INLINE']: # inline image
|
||||||
self._create_inline_item(message)
|
self._create_inline_item(message)
|
||||||
else: # info message
|
else: # info message
|
||||||
self._create_message_item(message)
|
self._create_message_item(message)
|
||||||
|
|
|
@ -183,7 +183,7 @@ def tox_file_recv(window, tray, profile, file_transfer_handler, contacts_manager
|
||||||
sound_notification(SOUND_NOTIFICATION['FILE_TRANSFER'])
|
sound_notification(SOUND_NOTIFICATION['FILE_TRANSFER'])
|
||||||
icon = util.join_path(util.get_images_directory(), 'icon_new_messages.png')
|
icon = util.join_path(util.get_images_directory(), 'icon_new_messages.png')
|
||||||
invoke_in_main_thread(tray.setIcon, QtGui.QIcon(icon))
|
invoke_in_main_thread(tray.setIcon, QtGui.QIcon(icon))
|
||||||
else: # AVATAR
|
else: # avatar
|
||||||
print('Avatar')
|
print('Avatar')
|
||||||
invoke_in_main_thread(file_transfer_handler.incoming_avatar,
|
invoke_in_main_thread(file_transfer_handler.incoming_avatar,
|
||||||
friend_number,
|
friend_number,
|
||||||
|
@ -208,7 +208,7 @@ def file_chunk_request(file_transfer_handler):
|
||||||
Outgoing chunk
|
Outgoing chunk
|
||||||
"""
|
"""
|
||||||
def wrapped(tox, friend_number, file_number, position, size, user_data):
|
def wrapped(tox, friend_number, file_number, position, size, user_data):
|
||||||
invoke_in_main_thread(file_transfer_handler.outgoing_chunk, friend_number, file_number, position, size)
|
execute(file_transfer_handler.outgoing_chunk, friend_number, file_number, position, size)
|
||||||
|
|
||||||
return wrapped
|
return wrapped
|
||||||
|
|
||||||
|
@ -440,7 +440,6 @@ def group_peer_join(contacts_provider, groups_service):
|
||||||
def group_peer_exit(contacts_provider, groups_service, contacts_manager):
|
def group_peer_exit(contacts_provider, groups_service, contacts_manager):
|
||||||
def wrapped(tox, group_number, peer_id, message, length, user_data):
|
def wrapped(tox, group_number, peer_id, message, length, user_data):
|
||||||
group = contacts_provider.get_group_by_number(group_number)
|
group = contacts_provider.get_group_by_number(group_number)
|
||||||
contacts_manager.remove_group_peer_by_id(group, peer_id)
|
|
||||||
group.remove_peer(peer_id)
|
group.remove_peer(peer_id)
|
||||||
invoke_in_main_thread(groups_service.generate_peers_list)
|
invoke_in_main_thread(groups_service.generate_peers_list)
|
||||||
|
|
||||||
|
|
|
@ -45,9 +45,9 @@ class MessagesItemsFactory:
|
||||||
|
|
||||||
return item
|
return item
|
||||||
|
|
||||||
def create_inline_item(self, data, append=True, position=0):
|
def create_inline_item(self, message, append=True, position=0):
|
||||||
elem = QtWidgets.QListWidgetItem()
|
elem = QtWidgets.QListWidgetItem()
|
||||||
item = InlineImageItem(data, self._messages.width(), elem, self._messages)
|
item = InlineImageItem(message.data, self._messages.width(), elem, self._messages)
|
||||||
elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height()))
|
elem.setSizeHint(QtCore.QSize(self._messages.width(), item.height()))
|
||||||
if append:
|
if append:
|
||||||
self._messages.addItem(elem)
|
self._messages.addItem(elem)
|
||||||
|
|
Loading…
Reference in a new issue