diff --git a/toxygen/contacts/contacts_manager.py b/toxygen/contacts/contacts_manager.py index 156c409..87a61ff 100644 --- a/toxygen/contacts/contacts_manager.py +++ b/toxygen/contacts/contacts_manager.py @@ -116,7 +116,7 @@ class ContactsManager(ToxSave): if message.type == MESSAGE_TYPE['FILE_TRANSFER']: self._messages_items_factory.create_file_transfer_item(message) elif message.type == MESSAGE_TYPE['INLINE']: - self._messages_items_factory.create_inline_item(message.data) + self._messages_items_factory.create_inline_item(message) else: self._messages_items_factory.create_message_item(message) self._messages.scrollToBottom() diff --git a/toxygen/contacts/profile.py b/toxygen/contacts/profile.py index ed7cd83..81220af 100644 --- a/toxygen/contacts/profile.py +++ b/toxygen/contacts/profile.py @@ -2,6 +2,7 @@ from contacts import basecontact import random import threading import common.tox_save as tox_save +from middleware.threads import invoke_in_main_thread class Profile(basecontact.BaseContact, tox_save.ToxSave): @@ -73,12 +74,13 @@ class Profile(basecontact.BaseContact, tox_save.ToxSave): Recreate tox instance """ self.status = None - self._reset_action() + invoke_in_main_thread(self._reset_action) def _reconnect(self): self._waiting_for_reconnection = False 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.restart() self._timer = threading.Timer(50, self._reconnect) diff --git a/toxygen/file_transfers/file_transfers.py b/toxygen/file_transfers/file_transfers.py index 9b29575..0f04e5b 100644 --- a/toxygen/file_transfers/file_transfers.py +++ b/toxygen/file_transfers/file_transfers.py @@ -52,10 +52,10 @@ class FileTransfer: self._file_id = self._file = None 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): - self._finished_event += handler + self._finished_event += lambda *args: invoke_in_main_thread(handler, *args) def get_file_number(self): return self._file_number @@ -100,17 +100,17 @@ class FileTransfer: def cancelled(self): if self._file is not None: self._file.close() - self.state = FILE_TRANSFER_STATE['CANCELLED'] + self.set_state(FILE_TRANSFER_STATE['CANCELLED']) def pause(self, by_friend): if not by_friend: self.send_control(TOX_FILE_CONTROL['PAUSE']) else: - self.state = FILE_TRANSFER_STATE['PAUSED_BY_FRIEND'] + self.set_state(FILE_TRANSFER_STATE['PAUSED_BY_FRIEND']) def send_control(self, 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): return self._tox.file_get_file_id(self._friend_number, self._file_number) @@ -121,10 +121,10 @@ class FileTransfer: t = -1 else: 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): - invoke_in_main_thread(self._finished_event, self._friend_number, self._file_number) + self._finished_event(self._friend_number, self._file_number) # ----------------------------------------------------------------------------------------------------------------- # Send file diff --git a/toxygen/file_transfers/file_transfers_handler.py b/toxygen/file_transfers/file_transfers_handler.py index 463152f..114383b 100644 --- a/toxygen/file_transfers/file_transfers_handler.py +++ b/toxygen/file_transfers/file_transfers_handler.py @@ -167,7 +167,7 @@ class FileTransfersHandler(ToxSave): return elif friend.status is None and is_resend: print('Error in sending') - raise RuntimeError() + return st = SendTransfer(path, self._tox, friend_number, TOX_FILE_KIND['DATA'], file_id) file_name = os.path.basename(path) self._send_file_add_set_handlers(st, friend, file_name) @@ -210,7 +210,7 @@ class FileTransfersHandler(ToxSave): else: self.send_file(path, friend_number, True) 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] if not os.path.exists(path): del self._paused_file_transfers[key] @@ -221,14 +221,15 @@ class FileTransfersHandler(ToxSave): print('Exception in file sending: ' + str(ex)) def friend_exit(self, friend_number): - for friend_num, file_num in list(self._file_transfers.keys()): - if friend_num == friend_number: - 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] - 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()] - self.cancel_transfer(friend_num, file_num, True) + for friend_num, file_num in self._file_transfers.keys(): + if friend_num != friend_number: + 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] + 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()] + self.cancel_transfer(friend_num, file_num, True) # ----------------------------------------------------------------------------------------------------------------- # Avatars support @@ -267,7 +268,9 @@ class FileTransfersHandler(ToxSave): # ----------------------------------------------------------------------------------------------------------------- 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): return self._contact_provider.get_friend_by_number(friend_number) diff --git a/toxygen/history/history.py b/toxygen/history/history.py index f551df5..bd7e353 100644 --- a/toxygen/history/history.py +++ b/toxygen/history/history.py @@ -82,14 +82,15 @@ class History: messages.reverse() messages = messages[self._messages.count():self._messages.count() + PAGE_SIZE] 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) - elif message.get_type() == MESSAGE_TYPE['FILE_TRANSFER']: # file transfer - if message.get_status() is None: + elif message_type == MESSAGE_TYPE['FILE_TRANSFER']: # file transfer + if message.state == FILE_TRANSFER_STATE['UNSENT']: self._create_unsent_file_item(message) - continue - self._create_file_transfer_item(message) - elif message.get_type() == MESSAGE_TYPE['INLINE']: # inline image + else: + self._create_file_transfer_item(message) + elif message_type == MESSAGE_TYPE['INLINE']: # inline image self._create_inline_item(message) else: # info message self._create_message_item(message) diff --git a/toxygen/middleware/callbacks.py b/toxygen/middleware/callbacks.py index da94a7f..b9a4099 100644 --- a/toxygen/middleware/callbacks.py +++ b/toxygen/middleware/callbacks.py @@ -183,7 +183,7 @@ def tox_file_recv(window, tray, profile, file_transfer_handler, contacts_manager sound_notification(SOUND_NOTIFICATION['FILE_TRANSFER']) icon = util.join_path(util.get_images_directory(), 'icon_new_messages.png') invoke_in_main_thread(tray.setIcon, QtGui.QIcon(icon)) - else: # AVATAR + else: # avatar print('Avatar') invoke_in_main_thread(file_transfer_handler.incoming_avatar, friend_number, @@ -208,7 +208,7 @@ def file_chunk_request(file_transfer_handler): Outgoing chunk """ 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 @@ -440,7 +440,6 @@ def group_peer_join(contacts_provider, groups_service): def group_peer_exit(contacts_provider, groups_service, contacts_manager): def wrapped(tox, group_number, peer_id, message, length, user_data): group = contacts_provider.get_group_by_number(group_number) - contacts_manager.remove_group_peer_by_id(group, peer_id) group.remove_peer(peer_id) invoke_in_main_thread(groups_service.generate_peers_list) diff --git a/toxygen/ui/items_factories.py b/toxygen/ui/items_factories.py index df6c95d..7346f8f 100644 --- a/toxygen/ui/items_factories.py +++ b/toxygen/ui/items_factories.py @@ -45,9 +45,9 @@ class MessagesItemsFactory: 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() - 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())) if append: self._messages.addItem(elem)