Remove progress if file was aborted

This commit is contained in:
Leon Böttger committed 2025-07-25 14:35:37 +02:00
1 parent ae2fcfe886
commit 83a6ed7040
2 files changed
+32 -25

No files matched your search

+17 -17
View File
@@ -114,7 +114,7 @@ class InboundNearbyConnection: NearbyConnection {
let id = frame.payloadHeader.id
guard let fileInfo = transferredFiles[id] else { throw NearbyError.protocolError("File payload ID \(id) is not known") }
guard let fileInfo = filesToBeTransferred[id] else { throw NearbyError.protocolError("File payload ID \(id) is not known") }
let currentOffset = fileInfo.bytesTransferred
@@ -125,8 +125,8 @@ class InboundNearbyConnection: NearbyConnection {
if frame.payloadChunk.body.count > 0 {
do {
try fileInfo.fileHandle?.write(contentsOf: frame.payloadChunk.body)
transferredFiles[id]!.bytesTransferred += Int64(frame.payloadChunk.body.count)
fileInfo.progress?.completedUnitCount = transferredFiles[id]!.bytesTransferred
filesToBeTransferred[id]!.bytesTransferred += Int64(frame.payloadChunk.body.count)
fileInfo.progress?.completedUnitCount = filesToBeTransferred[id]!.bytesTransferred
} catch {
log("Error occurred during writing file: \(error.localizedDescription)")
@@ -135,13 +135,13 @@ class InboundNearbyConnection: NearbyConnection {
}
else if (frame.payloadChunk.flags & 1) == 1 {
try fileInfo.fileHandle?.close()
transferredFiles[id]!.fileHandle = nil
filesToBeTransferred[id]!.fileHandle = nil
fileInfo.progress?.unpublish()
SaveFilesManager.shared.registerFileFinishedDownloading(fileInfo.destinationURL)
transferredFiles.removeValue(forKey: id)
filesToBeTransferred.removeValue(forKey: id)
if transferredFiles.isEmpty {
if filesToBeTransferred.isEmpty {
log("All files received, sending disconnection frame and disconnecting.")
try sendDisconnectionAndDisconnect()
}
@@ -169,14 +169,14 @@ class InboundNearbyConnection: NearbyConnection {
try sendDisconnectionAndDisconnect()
return true
}
else if let fileInfo = transferredFiles[id] {
else if let fileInfo = filesToBeTransferred[id] {
fileInfo.fileHandle?.write(payload)
transferredFiles[id]!.bytesTransferred += Int64(payload.count)
fileInfo.progress?.completedUnitCount = transferredFiles[id]!.bytesTransferred
filesToBeTransferred[id]!.bytesTransferred += Int64(payload.count)
fileInfo.progress?.completedUnitCount = filesToBeTransferred[id]!.bytesTransferred
try fileInfo.fileHandle?.close()
transferredFiles[id]!.fileHandle = nil
filesToBeTransferred[id]!.fileHandle = nil
fileInfo.progress?.unpublish()
transferredFiles.removeValue(forKey: id)
filesToBeTransferred.removeValue(forKey: id)
SaveFilesManager.shared.registerFileFinishedDownloading(fileInfo.destinationURL)
log("Received file payload. Disconnecting...")
@@ -368,9 +368,9 @@ class InboundNearbyConnection: NearbyConnection {
let info = InternalFileInfo(meta: FileMetadata(name: file.name, size: file.size, mimeType: file.mimeType),
payloadID: file.payloadID,
destinationURL: dest)
transferredFiles[file.payloadID] = info
filesToBeTransferred[file.payloadID] = info
}
let metadata = TransferMetadata(files: transferredFiles.map { $0.value.meta }, id: id, pinCode: pinCode)
let metadata = TransferMetadata(files: filesToBeTransferred.map { $0.value.meta }, id: id, pinCode: pinCode)
DispatchQueue.main.async {
self.delegate?.obtainUserConsent(for: metadata, from: self.remoteDeviceInfo!, connection: self)
}
@@ -429,12 +429,12 @@ class InboundNearbyConnection: NearbyConnection {
try FileManager.default.createDirectory(at: SaveFilesManager.shared.tempDirectory, withIntermediateDirectories: true)
}
for (id, file) in transferredFiles {
for (id, file) in filesToBeTransferred {
let targetURL = storeInTemp ? SaveFilesManager.shared.tempDirectory.appendingPathComponent(file.destinationURL.lastPathComponent) : file.destinationURL
FileManager.default.createFile(atPath: targetURL.path, contents: nil)
let handle = try FileHandle(forWritingTo: targetURL)
transferredFiles[id]!.fileHandle = handle
filesToBeTransferred[id]!.fileHandle = handle
let progress = Progress()
progress.fileURL = targetURL
@@ -442,8 +442,8 @@ class InboundNearbyConnection: NearbyConnection {
progress.kind = .file
progress.isPausable = false
progress.publish()
transferredFiles[id]!.progress = progress
transferredFiles[id]!.created = true
filesToBeTransferred[id]!.progress = progress
filesToBeTransferred[id]!.created = true
}
var frame = Sharing_Nearby_Frame()
+15 -8
View File
@@ -18,13 +18,15 @@ class NearbyConnection {
static let SANE_FRAME_LENGTH = 5 * 1024 * 1024
private static let dispatchQueue = DispatchQueue(label: "com.leonboettger.quickdrop.queue", qos: .utility) // FIFO (non-concurrent) queue to avoid those exciting concurrency bugs
let connection: NWConnection
var remoteDeviceInfo: RemoteDeviceInfo?
private var payloadBuffers: [Int64: NSMutableData] = [:]
var encryptionDone: Bool = false
var transferredFiles: [Int64: InternalFileInfo] = [:]
public let id: String
let connection: NWConnection
var remoteDeviceInfo: RemoteDeviceInfo?
var encryptionDone: Bool = false
var filesToBeTransferred: [Int64: InternalFileInfo] = [:]
var lastError: Error?
private var payloadBuffers: [Int64: NSMutableData] = [:]
private var connectionClosed: Bool = false
private var inactivityTimer: DispatchSourceTimer?
@@ -321,7 +323,7 @@ class NearbyConnection {
let chunk = payloadTransfer.payloadChunk
guard header.hasType, header.hasID else { throw NearbyError.requiredFieldMissing("payloadHeader.type|id") }
guard payloadTransfer.hasPayloadChunk, chunk.hasOffset, chunk.hasFlags else { throw NearbyError.requiredFieldMissing("payloadTransfer.payloadChunk|offset|flags") }
guard payloadTransfer.hasPayloadChunk, chunk.hasOffset, chunk.hasFlags else { throw NearbyError.requiredFieldMissing("File transfer was likely canceled.") }
if case .bytes = header.type {
@@ -364,7 +366,7 @@ class NearbyConnection {
}
else if offlineFrame.hasV1, offlineFrame.v1.hasType, case .keepAlive = offlineFrame.v1.type {
log("Sent keep-alive, current transfer progress: \(transferredFiles.values.reduce(0) { $0 + $1.bytesTransferred }) bytes")
log("Sent keep-alive, current transfer progress: \(filesToBeTransferred.values.reduce(0) { $0 + $1.bytesTransferred }) bytes")
sendKeepAlive(ack: true)
} else {
@@ -544,7 +546,12 @@ class NearbyConnection {
}
private func deletePartiallyReceivedFiles() {
for (_, file) in transferredFiles {
for (_, file) in filesToBeTransferred {
if let progress = file.progress {
progress.unpublish()
}
guard file.created else { continue }
do {
try FileManager.default.removeItem(at: file.destinationURL)