Skip to content

Commit 81ab70a

Browse files
Merge pull request #3696 from nextcloud/fpe-download
Fpe download
2 parents 0a3150a + b48e55e commit 81ab70a

6 files changed

Lines changed: 59 additions & 59 deletions

File tree

File Provider Extension/FileProviderData.swift

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,26 @@ class FileProviderData: NSObject {
134134

135135
// MARK: - DOWNLOAD
136136

137-
func downloadComplete(metadata: tableMetadata, task: URLSessionTask, etag: String?, error: NKError) async {
138-
let ocId = metadata.ocId
137+
func downloadComplete(fileName: String,
138+
serverUrl: String,
139+
etag: String?,
140+
date: Date?,
141+
dateLastModified: Date?,
142+
length: Int64,
143+
task: URLSessionTask,
144+
error: NKError) async {
139145
let taskIdentifier = task.taskIdentifier
146+
let metadata = await self.database.getMetadataAsync(predicate: NSPredicate(format: "serverUrl == %@ AND fileName == %@", serverUrl, fileName))
147+
148+
guard let metadata else {
149+
downloadPendingCompletionHandlers[taskIdentifier]?(nil)
150+
downloadPendingCompletionHandlers.removeValue(forKey: taskIdentifier)
151+
152+
await signalEnumerator(ocId: "", type: .update)
153+
return
154+
}
155+
156+
let ocId = metadata.ocId
140157

141158
await self.database.setMetadataSessionAsync(ocId: ocId,
142159
session: "",
@@ -151,7 +168,11 @@ class FileProviderData: NSObject {
151168
}
152169
}
153170

154-
downloadPendingCompletionHandlers[taskIdentifier]?(nil)
171+
if let completion = downloadPendingCompletionHandlers[taskIdentifier] {
172+
await MainActor.run {
173+
completion(nil)
174+
}
175+
}
155176
downloadPendingCompletionHandlers.removeValue(forKey: taskIdentifier)
156177

157178
await signalEnumerator(ocId: ocId, type: .update)
@@ -167,8 +188,7 @@ class FileProviderData: NSObject {
167188
size: Int64,
168189
task: URLSessionTask,
169190
error: NKError) async {
170-
guard let url = task.currentRequest?.url,
171-
let metadata = await self.database.getMetadataAsync(from: url, sessionTaskIdentifier: task.taskIdentifier) else {
191+
guard let metadata = await self.database.getMetadataAsync(predicate: NSPredicate(format: "serverUrl == %@ AND fileName == %@", serverUrl, fileName)) else {
172192
let predicate = NSPredicate(format: "fileName == %@ AND serverUrl == %@", fileName, serverUrl)
173193
await self.database.deleteMetadataAsync(predicate: predicate)
174194

File Provider Extension/FileProviderExtension.swift

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,7 @@ final class FileProviderExtension: NSFileProviderExtension {
163163
return
164164
}
165165

166-
guard let metadata = await self.database.setMetadataSessionAsync(ocId: metadata.ocId,
167-
session: NCNetworking.shared.sessionDownload,
168-
sessionTaskIdentifier: 0,
169-
sessionError: "",
170-
selector: "",
171-
status: NCGlobal.shared.metadataStatusDownloading) else {
172-
completionHandler(NSFileProviderError(.noSuchItem))
173-
return
174-
}
175-
176-
await fileProviderData.signalEnumerator(ocId: metadata.ocId, type: .update)
166+
await fileProviderData.signalEnumerator(ocId: ocId, type: .update)
177167

178168
let (task, error) = backgroundSession.download(serverUrlFileName: serverUrlFileName,
179169
fileNameLocalPath: fileNameLocalPath,
@@ -182,9 +172,12 @@ final class FileProviderExtension: NSFileProviderExtension {
182172
sessionIdentifier: NCNetworking.shared.sessionDownloadBackgroundExt)
183173

184174
if let task, error == .success {
185-
await self.database.setMetadataSessionAsync(ocId: ocId,
186-
sessionTaskIdentifier: task.taskIdentifier)
187-
175+
await self.database.setMetadataSessionAsync(ocId: metadata.ocId,
176+
session: NCNetworking.shared.sessionDownload,
177+
sessionTaskIdentifier: task.taskIdentifier,
178+
sessionError: "",
179+
selector: "",
180+
status: NCGlobal.shared.metadataStatusDownloading)
188181
do {
189182
if let domain = self.domain,
190183
let manager = NSFileProviderManager(for: domain) {

Nextcloud.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5928,7 +5928,7 @@
59285928
CLANG_WARN_UNREACHABLE_CODE = YES;
59295929
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
59305930
COPY_PHASE_STRIP = NO;
5931-
CURRENT_PROJECT_VERSION = 2;
5931+
CURRENT_PROJECT_VERSION = 0;
59325932
DEBUG_INFORMATION_FORMAT = dwarf;
59335933
DEVELOPMENT_TEAM = NKUJUXUJ3B;
59345934
ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -5955,7 +5955,7 @@
59555955
"@executable_path/Frameworks",
59565956
"@executable_path/../../Frameworks",
59575957
);
5958-
MARKETING_VERSION = 7.1.2;
5958+
MARKETING_VERSION = 7.1.3;
59595959
ONLY_ACTIVE_ARCH = YES;
59605960
OTHER_CFLAGS = "-v";
59615961
OTHER_LDFLAGS = "";
@@ -5994,7 +5994,7 @@
59945994
CLANG_WARN_UNREACHABLE_CODE = YES;
59955995
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
59965996
COPY_PHASE_STRIP = NO;
5997-
CURRENT_PROJECT_VERSION = 2;
5997+
CURRENT_PROJECT_VERSION = 0;
59985998
DEVELOPMENT_TEAM = NKUJUXUJ3B;
59995999
ENABLE_STRICT_OBJC_MSGSEND = YES;
60006000
ENABLE_TESTABILITY = YES;
@@ -6018,7 +6018,7 @@
60186018
"@executable_path/Frameworks",
60196019
"@executable_path/../../Frameworks",
60206020
);
6021-
MARKETING_VERSION = 7.1.2;
6021+
MARKETING_VERSION = 7.1.3;
60226022
ONLY_ACTIVE_ARCH = YES;
60236023
OTHER_CFLAGS = "-v";
60246024
OTHER_LDFLAGS = "";

iOSClient/Data/NCManageDatabase+Metadata+Session.swift

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -203,30 +203,6 @@ extension NCManageDatabase {
203203

204204
// MARK: - Realm Read
205205

206-
func getMetadataAsync(from url: URL?, sessionTaskIdentifier: Int) async -> tableMetadata? {
207-
guard let url,
208-
var serverUrl = url.deletingLastPathComponent().absoluteString.removingPercentEncoding
209-
else {
210-
return nil
211-
}
212-
let fileName = url.lastPathComponent
213-
214-
if serverUrl.hasSuffix("/") {
215-
serverUrl = String(serverUrl.dropLast())
216-
}
217-
let predicate = NSPredicate(format: "serverUrl == %@ AND fileName == %@ AND sessionTaskIdentifier == %d",
218-
serverUrl,
219-
fileName,
220-
sessionTaskIdentifier)
221-
222-
return await performRealmReadAsync { realm in
223-
realm.objects(tableMetadata.self)
224-
.filter(predicate)
225-
.first
226-
.map { $0.detachedCopy() }
227-
}
228-
}
229-
230206
func updateBadge() async {
231207
#if !EXTENSION
232208
let num = await performRealmReadAsync { realm in

iOSClient/Networking/NCNetworking+Download.swift

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,19 +159,28 @@ extension NCNetworking {
159159
length: Int64,
160160
task: URLSessionTask,
161161
error: NKError) {
162+
163+
#if EXTENSION_FILE_PROVIDER_EXTENSION
162164
Task {
163-
guard let url = task.currentRequest?.url,
164-
let metadata = await self.database.getMetadataAsync(from: url, sessionTaskIdentifier: task.taskIdentifier) else {
165+
await FileProviderData.shared.downloadComplete(fileName: fileName,
166+
serverUrl: serverUrl,
167+
etag: etag,
168+
date: date,
169+
dateLastModified: dateLastModified,
170+
length: length,
171+
task: task,
172+
error: error)
173+
return
174+
}
175+
#endif
176+
177+
Task {
178+
guard let metadata = await self.database.getMetadataAsync(predicate: NSPredicate(format: "serverUrl == %@ AND fileName == %@", serverUrl, fileName)) else {
165179
return
166180
}
167181

168182
await NextcloudKit.shared.nkCommonInstance.appendServerErrorAccount(metadata.account, errorCode: error.errorCode)
169183

170-
#if EXTENSION_FILE_PROVIDER_EXTENSION
171-
await FileProviderData.shared.downloadComplete(metadata: metadata, task: task, etag: etag, error: error)
172-
return
173-
#endif
174-
175184
if error == .success {
176185
nkLog(success: "Downloaded file: " + metadata.serverUrlFileName)
177186
#if !EXTENSION

iOSClient/Networking/NCNetworking+Upload.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -434,8 +434,8 @@ extension NCNetworking {
434434
size: Int64,
435435
task: URLSessionTask,
436436
error: NKError) {
437+
#if EXTENSION_FILE_PROVIDER_EXTENSION
437438
Task {
438-
#if EXTENSION_FILE_PROVIDER_EXTENSION
439439
await FileProviderData.shared.uploadComplete(fileName: fileName,
440440
serverUrl: serverUrl,
441441
ocId: ocId,
@@ -444,15 +444,17 @@ extension NCNetworking {
444444
size: size,
445445
task: task,
446446
error: error)
447-
#else
448-
if let url = task.currentRequest?.url,
449-
let metadata = await self.database.getMetadataAsync(from: url, sessionTaskIdentifier: task.taskIdentifier) {
447+
return
448+
}
449+
#endif
450+
451+
Task {
452+
if let metadata = await self.database.getMetadataAsync(predicate: NSPredicate(format: "serverUrl == %@ AND fileName == %@", serverUrl, fileName)) {
450453
await uploadComplete(withMetadata: metadata, ocId: ocId, etag: etag, date: date, size: size, error: error)
451454
} else {
452455
let predicate = NSPredicate(format: "fileName == %@ AND serverUrl == %@", fileName, serverUrl)
453456
await self.database.deleteMetadataAsync(predicate: predicate)
454457
}
455-
#endif
456458
}
457459
}
458460

0 commit comments

Comments
 (0)