From 9b20fa745e0f74484eeaac633549121c27bb3ad0 Mon Sep 17 00:00:00 2001 From: "N0\\A" Date: Fri, 24 Oct 2025 19:14:13 +0200 Subject: [PATCH] receive confirmation --- core/dukto.py | 43 +++++++++++++++++++++---------- main.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 98 insertions(+), 16 deletions(-) diff --git a/core/dukto.py b/core/dukto.py index 37d24eb..0d1e19d 100644 --- a/core/dukto.py +++ b/core/dukto.py @@ -40,6 +40,7 @@ class DuktoProtocol: # Callbacks self.on_peer_added: Optional[Callable[[Peer], None]] = None self.on_peer_removed: Optional[Callable[[Peer], None]] = None + self.on_receive_request: Optional[Callable[[str, int, int], bool]] = None self.on_receive_start: Optional[Callable[[str], None]] = None self.on_receive_complete: Optional[Callable[[List[str], int], None]] = None self.on_receive_text: Optional[Callable[[str, int], None]] = None @@ -192,29 +193,45 @@ class DuktoProtocol: conn.close() continue - threading.Thread(target=self._receive_files, + threading.Thread(target=self._handle_connection_request, args=(conn, addr[0]), daemon=True).start() except Exception as e: if self.running: print(f"TCP listener error: {e}") - - def _receive_files(self, conn: socket.socket, sender_ip: str): + + def _handle_connection_request(self, conn: socket.socket, sender_ip: str): + try: + conn.settimeout(10) + + header = conn.recv(16) + if len(header) < 16: + conn.close() + return + + elements_count = struct.unpack(' bool: + self.receive_confirmation_event.clear() + + QtCore.QMetaObject.invokeMethod( + self, "show_receive_dialog", QtCore.Qt.QueuedConnection, #type: ignore + QtCore.Q_ARG(str, sender_ip), + QtCore.Q_ARG(int, file_count), + QtCore.Q_ARG(int, total_size), + ) + + self.receive_confirmation_event.wait() + return self.receive_confirmation_result[0] + def restart_application(self): presence.end() + self.dukto_handler.shutdown() args = [sys.executable] + sys.argv @@ -534,9 +591,16 @@ def main(): restart = "--restart" in sys.argv no_quit = "--no-quit" in sys.argv super_menu = not "--no-super" in sys.argv - pet = MainWindow(restart=restart, no_quit=no_quit, super_menu=super_menu) + + dukto_handler = DuktoProtocol() + + pet = MainWindow(dukto_handler=dukto_handler, restart=restart, no_quit=no_quit, super_menu=super_menu) + presence.start() + dukto_handler.initialize() + dukto_handler.say_hello() + # bottom right corner screen_geometry = app.primaryScreen().availableGeometry() pet_geometry = pet.frameGeometry() @@ -547,6 +611,7 @@ def main(): pet.show() app.aboutToQuit.connect(presence.end) + app.aboutToQuit.connect(dukto_handler.shutdown) sys.exit(app.exec())