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
@@ -301,23 +320,89 @@ extension NCNetworking {
301320 await NCManageDatabase . shared. clearMetadatasSessionAsync ( metadatas: metadatas)
302321 }
303322 } else {
304- await NCManageDatabase . shared. setOffLocalFileAsync ( ocId: metadata. ocId)
323+ nkLog ( error: " Downloaded file: " + metadata. serverUrlFileName + " , result: error \( error. errorCode) " )
324+
325+ if error. errorCode == NCGlobal . shared. errorResourceNotFound {
326+ self . utilityFileSystem. removeFile ( atPath: self . utilityFileSystem. getDirectoryProviderStorageOcId ( metadata. ocId, userId: metadata. userId, urlBase: metadata. urlBase) )
327+
328+ await NCManageDatabase . shared. deleteLocalFileAsync ( id: metadata. ocId)
329+ await NCManageDatabase . shared. deleteMetadataAsync ( id: metadata. ocId)
330+ } else if error. errorCode == NSURLErrorCancelled || error. errorCode == self . global. errorRequestExplicityCancelled {
331+ if let metadata = await NCManageDatabase . shared. setMetadataSessionAsync ( ocId: metadata. ocId,
332+ session: " " ,
333+ sessionTaskIdentifier: 0 ,
334+ sessionError: " " ,
335+ selector: " " ,
336+ status: self . global. metadataStatusNormal) {
337+ await self . transferDispatcher. notifyAllDelegates { delegate in
338+ delegate. transferChange ( status: self . global. networkingStatusDownloadCancel,
339+ metadata: metadata,
340+ error: . success)
341+ }
342+ }
343+ } else {
344+ if let metadata = await NCManageDatabase . shared. setMetadataSessionAsync ( ocId: metadata. ocId,
345+ session: " " ,
346+ sessionTaskIdentifier: 0 ,
347+ sessionError: " " ,
348+ selector: " " ,
349+ status: self . global. metadataStatusNormal) {
350+
351+ await self . transferDispatcher. notifyAllDelegates { delegate in
352+ delegate. transferChange ( status: NCGlobal . shared. networkingStatusDownloaded,
353+ metadata: metadata,
354+ error: error)
355+ }
356+ }
357+ }
358+ await NCManageDatabase . shared. updateBadge ( )
305359 }
306- } else if metadata. directory {
307- await NCManageDatabase . shared. cleanTablesOcIds ( account: metadata. account, userId: metadata. userId, urlBase: metadata. urlBase)
308- await NCManageDatabase . shared. setDirectoryAsync ( serverUrl: metadata. serverUrlFileName, offline: true , metadata: metadata)
309- await NCNetworking . shared. synchronizationDownload ( account: metadata. account, serverUrl: metadata. serverUrlFileName, userId: metadata. userId, urlBase: metadata. urlBase, metadatasInDownload: nil )
310- } else {
311- var metadatasSynchronizationOffline : [ tableMetadata ] = [ ]
312- metadatasSynchronizationOffline. append ( metadata)
313- if let metadata = await NCManageDatabase . shared. getMetadataLivePhotoAsync ( metadata: metadata) {
314- metadatasSynchronizationOffline. append ( metadata)
360+ }
361+ }
362+
363+ // MARK: - Download NextcloudKitDelegate
364+
365+ func downloadingFinish( _ session: URLSession , downloadTask: URLSessionDownloadTask , didFinishDownloadingTo location: URL ) {
366+ if let httpResponse = ( downloadTask. response as? HTTPURLResponse ) {
367+ if httpResponse. statusCode >= 200 && httpResponse. statusCode < 300 ,
368+ let url = downloadTask. currentRequest? . url,
369+ var serverUrl = url. deletingLastPathComponent ( ) . absoluteString. removingPercentEncoding {
370+ let fileName = url. lastPathComponent
371+ if serverUrl. hasSuffix ( " / " ) { serverUrl = String ( serverUrl. dropLast ( ) ) }
372+ if let metadata = NCManageDatabase . shared. getMetadata ( predicate: NSPredicate ( format: " serverUrl == %@ AND fileName == %@ " , serverUrl, fileName) ) {
373+ let destinationFilePath = utilityFileSystem. getDirectoryProviderStorageOcId ( metadata. ocId, fileName: metadata. fileName, userId: metadata. userId, urlBase: metadata. urlBase)
374+ do {
375+ if FileManager . default. fileExists ( atPath: destinationFilePath) {
376+ try FileManager . default. removeItem ( atPath: destinationFilePath)
377+ }
378+ try FileManager . default. copyItem ( at: location, to: NSURL . fileURL ( withPath: destinationFilePath) )
379+ } catch {
380+ print ( error)
381+ }
382+ }
315383 }
316- await NCManageDatabase . shared. addLocalFilesAsync ( metadatas: [ metadata] , offline: true )
317- for metadata in metadatasSynchronizationOffline {
318- await NCManageDatabase . shared. setMetadataSessionInWaitDownloadAsync ( ocId: metadata. ocId,
319- session: NCNetworking . shared. sessionDownloadBackground,
320- selector: NCGlobal . shared. selectorSynchronizationOffline)
384+ }
385+ }
386+
387+ func downloadProgress( _ progress: Float ,
388+ totalBytes: Int64 ,
389+ totalBytesExpected: Int64 ,
390+ fileName: String ,
391+ serverUrl: String ,
392+ session: URLSession ,
393+ task: URLSessionTask ) {
394+
395+ Task {
396+ guard await progressQuantizer. shouldEmit ( serverUrlFileName: serverUrl + " / " + fileName, fraction: Double ( progress) ) else {
397+ return
398+ }
399+ await NCManageDatabase . shared. setMetadataProgress ( fileName: fileName, serverUrl: serverUrl, taskIdentifier: task. taskIdentifier, progress: Double ( progress) )
400+ await self . transferDispatcher. notifyAllDelegates { delegate in
401+ delegate. transferProgressDidUpdate ( progress: progress,
402+ totalBytes: totalBytes,
403+ totalBytesExpected: totalBytesExpected,
404+ fileName: fileName,
405+ serverUrl: serverUrl)
321406 }
322407 }
323408
@@ -327,3 +412,40 @@ extension NCNetworking {
327412 }
328413 }
329414}
415+
416+ class NCOperationDownload : ConcurrentOperation , @unchecked Sendable {
417+ var metadata : tableMetadata
418+ var selector : String
419+
420+ init ( metadata: tableMetadata , selector: String ) {
421+ self . metadata = tableMetadata. init ( value: metadata)
422+ self . selector = selector
423+ }
424+
425+ override func start( ) {
426+ guard !isCancelled else { return self . finish ( ) }
427+
428+ metadata. session = NCNetworking . shared. sessionDownload
429+ metadata. sessionError = " "
430+ metadata. sessionSelector = selector
431+ metadata. sessionTaskIdentifier = 0
432+ metadata. status = NCGlobal . shared. metadataStatusWaitDownload
433+
434+ // let metadata = NCManageDatabase.shared.addMetadata(metadata)
435+
436+ // NCNetworking.shared.download(metadata: metadata, withNotificationProgressTask: true) {
437+ // } completion: { _, _ in
438+ // self.finish()
439+ // }
440+ Task {
441+ await download ( withSelector: self . selector)
442+ }
443+ }
444+
445+ private func download( withSelector selector: String = " " ) async {
446+ await NCNetworking . shared. downloadFile ( metadata: metadata) { _ in
447+ self . finish ( )
448+ } taskHandler: { _ in }
449+
450+ }
451+ }
0 commit comments