From ce59cc5e1b0f75942fe63e50f1e8256d3c07a755 Mon Sep 17 00:00:00 2001 From: grendervill Date: Thu, 20 Aug 2026 00:24:42 +0300 Subject: [PATCH] =?UTF-8?q?AeroToss:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=82=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлен activeSockets для хранения сокетов при передаче - cancelTransfer закрывает сокет + отменяет корутину + обновляет состояние - Исправлено на обеих платформах (Desktop + Android) --- .../kotlin/com/aerotoss/transfer/AndroidTransferManager.kt | 4 ++++ .../kotlin/com/aerotoss/transfer/DesktopTransferManager.kt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/src/androidMain/kotlin/com/aerotoss/transfer/AndroidTransferManager.kt b/app/src/androidMain/kotlin/com/aerotoss/transfer/AndroidTransferManager.kt index 125deda..68425b3 100644 --- a/app/src/androidMain/kotlin/com/aerotoss/transfer/AndroidTransferManager.kt +++ b/app/src/androidMain/kotlin/com/aerotoss/transfer/AndroidTransferManager.kt @@ -37,6 +37,7 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager private var serverThread: Thread? = null private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) private val activeJobs = ConcurrentHashMap() + private val activeSockets = ConcurrentHashMap() private val running = AtomicBoolean(false) private val connectionLimiter = Semaphore(10) @@ -220,6 +221,7 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager val job = scope.launch { try { val socket = Socket(targetHost, targetPort) + activeSockets[requestId] = socket socket.use { sock -> sock.soTimeout = 30_000 val input = DataInputStream(sock.getInputStream()) @@ -300,6 +302,8 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager override fun cancelTransfer(requestId: String) { activeJobs[requestId]?.cancel() activeJobs.remove(requestId) + activeSockets[requestId]?.let { try { it.close() } catch (_: Exception) {} } + activeSockets.remove(requestId) updateOutgoingById(requestId, _outgoingTransfers.value.find { it.id == requestId }?.copy( state = TransferState.CANCELLED ) ?: return) diff --git a/app/src/desktopMain/kotlin/com/aerotoss/transfer/DesktopTransferManager.kt b/app/src/desktopMain/kotlin/com/aerotoss/transfer/DesktopTransferManager.kt index 73faf3e..e6c30d7 100644 --- a/app/src/desktopMain/kotlin/com/aerotoss/transfer/DesktopTransferManager.kt +++ b/app/src/desktopMain/kotlin/com/aerotoss/transfer/DesktopTransferManager.kt @@ -31,6 +31,7 @@ class DesktopFileTransferManager : TransferManager { } private val transferStates = ConcurrentHashMap>() + private val activeSockets = ConcurrentHashMap() private var serverSocket: ServerSocket? = null private var serverThread: Thread? = null @@ -218,6 +219,7 @@ class DesktopFileTransferManager : TransferManager { val job = scope.launch { try { val socket = Socket(targetHost, targetPort) + activeSockets[requestId] = socket socket.use { sock -> sock.soTimeout = 30_000 val input = DataInputStream(sock.getInputStream()) @@ -292,6 +294,8 @@ class DesktopFileTransferManager : TransferManager { override fun cancelTransfer(requestId: String) { activeJobs[requestId]?.cancel() activeJobs.remove(requestId) + activeSockets[requestId]?.let { try { it.close() } catch (_: Exception) {} } + activeSockets.remove(requestId) transferStates[requestId]?.let { flow -> flow.value = flow.value.copy(state = TransferState.CANCELLED) updateOutgoing(flow.value)