AeroToss: исправлена отмена передачи

- Добавлен activeSockets для хранения сокетов при передаче
- cancelTransfer закрывает сокет + отменяет корутину + обновляет состояние
- Исправлено на обеих платформах (Desktop + Android)
This commit is contained in:
2026-08-20 00:24:42 +03:00
parent 12ceb58868
commit ce59cc5e1b
2 changed files with 8 additions and 0 deletions
@@ -37,6 +37,7 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager
private var serverThread: Thread? = null private var serverThread: Thread? = null
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
private val activeJobs = ConcurrentHashMap<String, Job>() private val activeJobs = ConcurrentHashMap<String, Job>()
private val activeSockets = ConcurrentHashMap<String, Socket>()
private val running = AtomicBoolean(false) private val running = AtomicBoolean(false)
private val connectionLimiter = Semaphore(10) private val connectionLimiter = Semaphore(10)
@@ -220,6 +221,7 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager
val job = scope.launch { val job = scope.launch {
try { try {
val socket = Socket(targetHost, targetPort) val socket = Socket(targetHost, targetPort)
activeSockets[requestId] = socket
socket.use { sock -> socket.use { sock ->
sock.soTimeout = 30_000 sock.soTimeout = 30_000
val input = DataInputStream(sock.getInputStream()) val input = DataInputStream(sock.getInputStream())
@@ -300,6 +302,8 @@ class AndroidFileTransferManager(private val context: Context) : TransferManager
override fun cancelTransfer(requestId: String) { override fun cancelTransfer(requestId: String) {
activeJobs[requestId]?.cancel() activeJobs[requestId]?.cancel()
activeJobs.remove(requestId) activeJobs.remove(requestId)
activeSockets[requestId]?.let { try { it.close() } catch (_: Exception) {} }
activeSockets.remove(requestId)
updateOutgoingById(requestId, _outgoingTransfers.value.find { it.id == requestId }?.copy( updateOutgoingById(requestId, _outgoingTransfers.value.find { it.id == requestId }?.copy(
state = TransferState.CANCELLED state = TransferState.CANCELLED
) ?: return) ) ?: return)
@@ -31,6 +31,7 @@ class DesktopFileTransferManager : TransferManager {
} }
private val transferStates = ConcurrentHashMap<String, MutableStateFlow<TransferProgress>>() private val transferStates = ConcurrentHashMap<String, MutableStateFlow<TransferProgress>>()
private val activeSockets = ConcurrentHashMap<String, Socket>()
private var serverSocket: ServerSocket? = null private var serverSocket: ServerSocket? = null
private var serverThread: Thread? = null private var serverThread: Thread? = null
@@ -218,6 +219,7 @@ class DesktopFileTransferManager : TransferManager {
val job = scope.launch { val job = scope.launch {
try { try {
val socket = Socket(targetHost, targetPort) val socket = Socket(targetHost, targetPort)
activeSockets[requestId] = socket
socket.use { sock -> socket.use { sock ->
sock.soTimeout = 30_000 sock.soTimeout = 30_000
val input = DataInputStream(sock.getInputStream()) val input = DataInputStream(sock.getInputStream())
@@ -292,6 +294,8 @@ class DesktopFileTransferManager : TransferManager {
override fun cancelTransfer(requestId: String) { override fun cancelTransfer(requestId: String) {
activeJobs[requestId]?.cancel() activeJobs[requestId]?.cancel()
activeJobs.remove(requestId) activeJobs.remove(requestId)
activeSockets[requestId]?.let { try { it.close() } catch (_: Exception) {} }
activeSockets.remove(requestId)
transferStates[requestId]?.let { flow -> transferStates[requestId]?.let { flow ->
flow.value = flow.value.copy(state = TransferState.CANCELLED) flow.value = flow.value.copy(state = TransferState.CANCELLED)
updateOutgoing(flow.value) updateOutgoing(flow.value)