1- // SPDX-FileCopyrightText: Nextcloud GmbH
2- // SPDX-FileCopyrightText: 2024 Marino Faggiana
3- // SPDX-License-Identifier: GPL-3.0-or-later
1+ //
2+ // NCNetworking+Download.swift
3+ // Nextcloud
4+ //
5+ // Created by Marino Faggiana on 07/02/24.
6+ // Copyright © 2024 Marino Faggiana. All rights reserved.
7+ //
8+ // Author Marino Faggiana <marino.faggiana@nextcloud.com>
9+ //
10+ // This program is free software: you can redistribute it and/or modify
11+ // it under the terms of the GNU General Public License as published by
12+ // the Free Software Foundation, either version 3 of the License, or
13+ // (at your option) any later version.
14+ //
15+ // This program is distributed in the hope that it will be useful,
16+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
17+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18+ // GNU General Public License for more details.
19+ //
20+ // You should have received a copy of the GNU General Public License
21+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
22+ //
423
524import UIKit
625import NextcloudKit
@@ -319,23 +338,89 @@ extension NCNetworking {
319338 await NCManageDatabase . shared. clearMetadatasSessionAsync ( metadatas: metadatas)
320339 }
321340 } else {
322- await NCManageDatabase . shared. setOffLocalFileAsync ( ocId: metadata. ocId)
341+ nkLog ( error: " Downloaded file: " + metadata. serverUrlFileName + " , result: error \( error. errorCode) " )
342+
343+ if error. errorCode == NCGlobal . shared. errorResourceNotFound {
344+ self . utilityFileSystem. removeFile ( atPath: self . utilityFileSystem. getDirectoryProviderStorageOcId ( metadata. ocId, userId: metadata. userId, urlBase: metadata. urlBase) )
345+
346+ await NCManageDatabase . shared. deleteLocalFileAsync ( id: metadata. ocId)
347+ await NCManageDatabase . shared. deleteMetadataAsync ( id: metadata. ocId)
348+ } else if error. errorCode == NSURLErrorCancelled || error. errorCode == self . global. errorRequestExplicityCancelled {
349+ if let metadata = await NCManageDatabase . shared. setMetadataSessionAsync ( ocId: metadata. ocId,
350+ session: " " ,
351+ sessionTaskIdentifier: 0 ,
352+ sessionError: " " ,
353+ selector: " " ,
354+ status: self . global. metadataStatusNormal) {
355+ await self . transferDispatcher. notifyAllDelegates { delegate in
356+ delegate. transferChange ( status: self . global. networkingStatusDownloadCancel,
357+ metadata: metadata,
358+ error: . success)
359+ }
360+ }
361+ } else {
362+ if let metadata = await NCManageDatabase . shared. setMetadataSessionAsync ( ocId: metadata. ocId,
363+ session: " " ,
364+ sessionTaskIdentifier: 0 ,
365+ sessionError: " " ,
366+ selector: " " ,
367+ status: self . global. metadataStatusNormal) {
368+
369+ await self . transferDispatcher. notifyAllDelegates { delegate in
370+ delegate. transferChange ( status: NCGlobal . shared. networkingStatusDownloaded,
371+ metadata: metadata,
372+ error: error)
373+ }
374+ }
375+ }
376+ await NCManageDatabase . shared. updateBadge ( )
323377 }
324- } else if metadata. directory {
325- await NCManageDatabase . shared. cleanTablesOcIds ( account: metadata. account, userId: metadata. userId, urlBase: metadata. urlBase)
326- await NCManageDatabase . shared. setDirectoryAsync ( serverUrl: metadata. serverUrlFileName, offline: true , metadata: metadata)
327- await NCNetworking . shared. synchronizationDownload ( account: metadata. account, serverUrl: metadata. serverUrlFileName, userId: metadata. userId, urlBase: metadata. urlBase, metadatasInDownload: nil )
328- } else {
329- var metadatasSynchronizationOffline : [ tableMetadata ] = [ ]
330- metadatasSynchronizationOffline. append ( metadata)
331- if let metadata = await NCManageDatabase . shared. getMetadataLivePhotoAsync ( metadata: metadata) {
332- metadatasSynchronizationOffline. append ( metadata)
378+ }
379+ }
380+
381+ // MARK: - Download NextcloudKitDelegate
382+
383+ func downloadingFinish( _ session: URLSession , downloadTask: URLSessionDownloadTask , didFinishDownloadingTo location: URL ) {
384+ if let httpResponse = ( downloadTask. response as? HTTPURLResponse ) {
385+ if httpResponse. statusCode >= 200 && httpResponse. statusCode < 300 ,
386+ let url = downloadTask. currentRequest? . url,
387+ var serverUrl = url. deletingLastPathComponent ( ) . absoluteString. removingPercentEncoding {
388+ let fileName = url. lastPathComponent
389+ if serverUrl. hasSuffix ( " / " ) { serverUrl = String ( serverUrl. dropLast ( ) ) }
390+ if let metadata = NCManageDatabase . shared. getMetadata ( predicate: NSPredicate ( format: " serverUrl == %@ AND fileName == %@ " , serverUrl, fileName) ) {
391+ let destinationFilePath = utilityFileSystem. getDirectoryProviderStorageOcId ( metadata. ocId, fileName: metadata. fileName, userId: metadata. userId, urlBase: metadata. urlBase)
392+ do {
393+ if FileManager . default. fileExists ( atPath: destinationFilePath) {
394+ try FileManager . default. removeItem ( atPath: destinationFilePath)
395+ }
396+ try FileManager . default. copyItem ( at: location, to: NSURL . fileURL ( withPath: destinationFilePath) )
397+ } catch {
398+ print ( error)
399+ }
400+ }
333401 }
334- await NCManageDatabase . shared. addLocalFilesAsync ( metadatas: [ metadata] , offline: true )
335- for metadata in metadatasSynchronizationOffline {
336- await NCManageDatabase . shared. setMetadataSessionInWaitDownloadAsync ( ocId: metadata. ocId,
337- session: NCNetworking . shared. sessionDownloadBackground,
338- selector: NCGlobal . shared. selectorSynchronizationOffline)
402+ }
403+ }
404+
405+ func downloadProgress( _ progress: Float ,
406+ totalBytes: Int64 ,
407+ totalBytesExpected: Int64 ,
408+ fileName: String ,
409+ serverUrl: String ,
410+ session: URLSession ,
411+ task: URLSessionTask ) {
412+
413+ Task {
414+ guard await progressQuantizer. shouldEmit ( serverUrlFileName: serverUrl + " / " + fileName, fraction: Double ( progress) ) else {
415+ return
416+ }
417+ await NCManageDatabase . shared. setMetadataProgress ( fileName: fileName, serverUrl: serverUrl, taskIdentifier: task. taskIdentifier, progress: Double ( progress) )
418+ await self . transferDispatcher. notifyAllDelegates { delegate in
419+ delegate. transferProgressDidUpdate ( progress: progress,
420+ totalBytes: totalBytes,
421+ totalBytesExpected: totalBytesExpected,
422+ fileName: fileName,
423+ serverUrl: serverUrl)
339424 }
340425 }
341426
@@ -345,3 +430,40 @@ extension NCNetworking {
345430 }
346431 }
347432}
433+
434+ class NCOperationDownload : ConcurrentOperation , @unchecked Sendable {
435+ var metadata : tableMetadata
436+ var selector : String
437+
438+ init ( metadata: tableMetadata , selector: String ) {
439+ self . metadata = tableMetadata. init ( value: metadata)
440+ self . selector = selector
441+ }
442+
443+ override func start( ) {
444+ guard !isCancelled else { return self . finish ( ) }
445+
446+ metadata. session = NCNetworking . shared. sessionDownload
447+ metadata. sessionError = " "
448+ metadata. sessionSelector = selector
449+ metadata. sessionTaskIdentifier = 0
450+ metadata. status = NCGlobal . shared. metadataStatusWaitDownload
451+
452+ // let metadata = NCManageDatabase.shared.addMetadata(metadata)
453+
454+ // NCNetworking.shared.download(metadata: metadata, withNotificationProgressTask: true) {
455+ // } completion: { _, _ in
456+ // self.finish()
457+ // }
458+ Task {
459+ await download ( withSelector: self . selector)
460+ }
461+ }
462+
463+ private func download( withSelector selector: String = " " ) async {
464+ await NCNetworking . shared. downloadFile ( metadata: metadata) { _ in
465+ self . finish ( )
466+ } taskHandler: { _ in }
467+
468+ }
469+ }
0 commit comments