AeroToss: исправлена отмена передачи
- Добавлен activeSockets для хранения сокетов при передаче - cancelTransfer закрывает сокет + отменяет корутину + обновляет состояние - Исправлено на обеих платформах (Desktop + Android)
This commit is contained in:
@@ -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<String, Job>()
|
||||
private val activeSockets = ConcurrentHashMap<String, Socket>()
|
||||
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)
|
||||
|
||||
@@ -31,6 +31,7 @@ class DesktopFileTransferManager : TransferManager {
|
||||
}
|
||||
|
||||
private val transferStates = ConcurrentHashMap<String, MutableStateFlow<TransferProgress>>()
|
||||
private val activeSockets = ConcurrentHashMap<String, Socket>()
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user