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 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)
|
||||||
|
|||||||
Reference in New Issue
Block a user