// // CCActions.swift // Nextcloud iOS // // Created by Marino Faggiana on 06/02/17. // Copyright (c) 2017 TWS. All rights reserved. // // Author Marino Faggiana // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // import Foundation @objc protocol CCActionsDeleteDelegate { func deleteFileOrFolderSuccess(_ metadataNet: CCMetadataNet) func deleteFileOrFolderFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) } @objc protocol CCActionsRenameDelegate { func renameSuccess(_ metadataNet: CCMetadataNet) func renameMoveFileOrFolderFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) func uploadFileSuccess(_ metadataNet: CCMetadataNet, fileID: String, serverUrl: String, selector: String, selectorPost: String) func uploadFileFailure(_ metadataNet: CCMetadataNet, fileID: String, serverUrl: String, selector: String, message: String, errorCode: NSInteger) } @objc protocol CCActionsSearchDelegate { func searchSuccess(_ metadataNet: CCMetadataNet, metadatas: [Any]) func searchFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) } @objc protocol CCActionsDownloadThumbnailDelegate { func downloadThumbnailSuccess(_ metadataNet: CCMetadataNet) } @objc protocol CCActionsSettingFavoriteDelegate { func settingFavoriteSuccess(_ metadataNet: CCMetadataNet) func settingFavoriteFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) } @objc protocol CCActionsListingFavoritesDelegate { func listingFavoritesSuccess(_ metadataNet: CCMetadataNet, metadatas: [Any]) func listingFavoritesFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) } class CCActions: NSObject { //MARK: Shared Instance @objc static let sharedInstance: CCActions = { let instance = CCActions() return instance }() //MARK: Local Variable let appDelegate = UIApplication.shared.delegate as! AppDelegate //MARK: Init override init() { } // -------------------------------------------------------------------------------------------- // MARK: Delete File or Folder // -------------------------------------------------------------------------------------------- @objc func deleteFileOrFolder(_ metadata: tableMetadata, delegate: AnyObject) { guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else { return } let metadataNet: CCMetadataNet = CCMetadataNet.init(account: appDelegate.activeAccount) // fix CCActions.swift line 88 2.17.2 (00005) if (serverUrl == "") { print("[LOG] Server URL not found \(metadata.directoryID)") appDelegate.messageNotification("_delete_", description: "_file_not_found_reload_", visible: true, delay: TimeInterval(k_dismissAfterSecond), type: TWMessageBarMessageType.error, errorCode: 0) return } metadataNet.action = actionDeleteFileDirectory metadataNet.delegate = delegate metadataNet.directoryID = metadata.directoryID metadataNet.fileID = metadata.fileID metadataNet.fileName = metadata.fileName metadataNet.selector = selectorDelete metadataNet.serverUrl = serverUrl appDelegate.addNetworkingOperationQueue(appDelegate.netQueue, delegate: self, metadataNet: metadataNet) } @objc func deleteFileOrFolderSuccess(_ metadataNet: CCMetadataNet) { let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", metadataNet.fileID)) if let metadata = metadata { self.deleteFile(metadata: metadata, serverUrl: metadataNet.serverUrl) } metadataNet.delegate?.deleteFileOrFolderSuccess(metadataNet) } @objc func deleteFileOrFolderFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) { if errorCode == 404 { let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", metadataNet.fileID)) if metadata != nil { self.deleteFile(metadata: metadata!, serverUrl: metadataNet.serverUrl) } } if message.length > 0 { appDelegate.messageNotification("_delete_", description: message as String, visible: true, delay:TimeInterval(k_dismissAfterSecond), type:TWMessageBarMessageType.error, errorCode: errorCode) } metadataNet.delegate?.deleteFileOrFolderFailure(metadataNet, message: message, errorCode: errorCode) } // -------------------------------------------------------------------------------------------- // MARK: Rename File or Folder // -------------------------------------------------------------------------------------------- @objc func renameFileOrFolder(_ metadata: tableMetadata, fileName: String, delegate: AnyObject) { let metadataNet: CCMetadataNet = CCMetadataNet.init(account: appDelegate.activeAccount) let fileName = CCUtility.removeForbiddenCharactersServer(fileName)! guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else { return } if fileName.count == 0 { return } if metadata.fileName == fileName { return } let ocNetworking = OCnetworking.init(delegate: nil, metadataNet: nil, withUser: appDelegate.activeUser, withUserID: appDelegate.activeUserID, withPassword: appDelegate.activePassword, withUrl: appDelegate.activeUrl); // Verify if exists the fileName TO guard (ocNetworking?.readFileSync("\(String(describing: serverUrl))/\(fileName)")) != nil else { let alertController = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: NSLocalizedString("_file_already_exists_", comment: ""), preferredStyle: UIAlertControllerStyle.alert) let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in } alertController.addAction(okAction) delegate.present(alertController, animated: true, completion: nil) return; } // Plain metadataNet.action = actionMoveFileOrFolder metadataNet.delegate = delegate metadataNet.fileID = metadata.fileID metadataNet.fileName = metadata.fileName metadataNet.fileNameTo = fileName metadataNet.selector = selectorRename metadataNet.serverUrl = serverUrl metadataNet.serverUrlTo = serverUrl appDelegate.addNetworkingOperationQueue(appDelegate.netQueue, delegate: self, metadataNet: metadataNet) } @objc func renameSuccess(_ metadataNet: CCMetadataNet) { let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID = %@", metadataNet.fileID)) if metadata?.directory == true { let directory = CCUtility.stringAppendServerUrl(metadataNet.serverUrl, addFileName: metadataNet.fileName) let directoryTo = CCUtility.stringAppendServerUrl(metadataNet.serverUrl, addFileName: metadataNet.fileNameTo) NCManageDatabase.sharedInstance.setDirectory(serverUrl: directory!, serverUrlTo: directoryTo!, etag: nil) } else { NCManageDatabase.sharedInstance.setLocalFile(fileID: metadataNet.fileID, date: nil, exifDate: nil, exifLatitude: nil, exifLongitude: nil, fileName: metadataNet.fileNameTo) } metadataNet.delegate?.renameSuccess(metadataNet) } @objc func renameMoveFileOrFolderFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) { if message.length > 0 { var title : String = "" if metadataNet.selector == selectorRename { title = "_delete_" } if metadataNet.selector == selectorMove { title = "_move_" } appDelegate.messageNotification(title, description: message as String, visible: true, delay:TimeInterval(k_dismissAfterSecond), type:TWMessageBarMessageType.error, errorCode: errorCode) } metadataNet.delegate?.renameMoveFileOrFolderFailure(metadataNet, message: message as NSString, errorCode: errorCode) } @objc func uploadFileSuccess(_ metadataNet: CCMetadataNet, fileID: String, serverUrl: String, selector: String, selectorPost: String) { metadataNet.delegate?.uploadFileSuccess(metadataNet, fileID:fileID, serverUrl: serverUrl, selector: selector, selectorPost: selectorPost) } @objc func uploadFileFailure(_ metadataNet: CCMetadataNet, fileID: String, serverUrl: String, selector: String, message: String, errorCode: NSInteger) { metadataNet.delegate?.uploadFileFailure(metadataNet, fileID:fileID, serverUrl: serverUrl, selector: selector, message: message, errorCode: errorCode) } // -------------------------------------------------------------------------------------------- // MARK: Search // -------------------------------------------------------------------------------------------- @objc func search(_ serverUrl: String, fileName: String, depth: String, date: Date?, selector: String, delegate: AnyObject) { guard let directoryID = NCManageDatabase.sharedInstance.getDirectoryID(serverUrl) else { return } // Search DAV API let metadataNet: CCMetadataNet = CCMetadataNet.init(account: appDelegate.activeAccount) metadataNet.action = actionSearch metadataNet.date = date metadataNet.delegate = delegate metadataNet.directoryID = directoryID metadataNet.fileName = fileName metadataNet.depth = depth metadataNet.priority = Operation.QueuePriority.high.rawValue metadataNet.selector = selector metadataNet.serverUrl = serverUrl appDelegate.addNetworkingOperationQueue(appDelegate.netQueue, delegate: self, metadataNet: metadataNet) } @objc func searchSuccess(_ metadataNet: CCMetadataNet, metadatas: [tableMetadata]) { metadataNet.delegate?.searchSuccess(metadataNet, metadatas: metadatas) } @objc func searchFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) { metadataNet.delegate?.searchFailure(metadataNet, message: message, errorCode: errorCode) } // -------------------------------------------------------------------------------------------- // MARK: Download Tumbnail // -------------------------------------------------------------------------------------------- @objc func downloadTumbnail(_ metadata: tableMetadata, delegate: AnyObject) { let metadataNet: CCMetadataNet = CCMetadataNet.init(account: appDelegate.activeAccount) guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else { return } metadataNet.action = actionDownloadThumbnail metadataNet.delegate = delegate metadataNet.fileID = metadata.fileID metadataNet.fileName = CCUtility.returnFileNamePath(fromFileName: metadata.fileName, serverUrl: serverUrl, activeUrl: appDelegate.activeUrl) metadataNet.options = "m" metadataNet.priority = Operation.QueuePriority.low.rawValue metadataNet.selector = selectorDownloadThumbnail; metadataNet.serverUrl = serverUrl; appDelegate.addNetworkingOperationQueue(appDelegate.netQueue, delegate: self, metadataNet: metadataNet) } @objc func downloadThumbnailSuccess(_ metadataNet: CCMetadataNet) { metadataNet.delegate?.downloadThumbnailSuccess(metadataNet) } @objc func downloadThumbnailFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) { NSLog("[LOG] Thumbnail Error \(metadataNet.fileName!) \(message) error %\(errorCode))") } // -------------------------------------------------------------------------------------------- // MARK: Setting Favorite // -------------------------------------------------------------------------------------------- @objc func settingFavorite(_ metadata: tableMetadata, favorite: Bool, delegate: AnyObject) { let metadataNet: CCMetadataNet = CCMetadataNet.init(account: appDelegate.activeAccount) guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else { return } metadataNet.action = actionSettingFavorite metadataNet.delegate = delegate metadataNet.fileID = metadata.fileID metadataNet.fileName = CCUtility.returnFileNamePath(fromFileName: metadata.fileName, serverUrl: serverUrl, activeUrl: appDelegate.activeUrl) metadataNet.options = "\(favorite)" metadataNet.selector = selectorAddFavorite metadataNet.serverUrl = serverUrl; appDelegate.addNetworkingOperationQueue(appDelegate.netQueue, delegate: self, metadataNet: metadataNet) } @objc func settingFavoriteSuccess(_ metadataNet: CCMetadataNet) { metadataNet.delegate?.settingFavoriteSuccess(metadataNet) } @objc func settingFavoriteFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) { appDelegate.messageNotification("_favorites_", description: message as String, visible: true, delay:TimeInterval(k_dismissAfterSecond), type:TWMessageBarMessageType.error, errorCode: errorCode) metadataNet.delegate?.settingFavoriteFailure(metadataNet, message: message, errorCode: errorCode) } // -------------------------------------------------------------------------------------------- // MARK: Linsting Favorites // -------------------------------------------------------------------------------------------- @objc func listingFavorites(_ serverUrl: String, delegate: AnyObject) { let metadataNet: CCMetadataNet = CCMetadataNet.init(account: appDelegate.activeAccount) metadataNet.action = actionListingFavorites metadataNet.delegate = delegate metadataNet.serverUrl = serverUrl appDelegate.addNetworkingOperationQueue(appDelegate.netQueue, delegate: self, metadataNet: metadataNet) } @objc func listingFavoritesSuccess(_ metadataNet: CCMetadataNet, metadatas: [tableMetadata]) { metadataNet.delegate?.listingFavoritesSuccess(metadataNet, metadatas: metadatas) } @objc func listingFavoritesFailure(_ metadataNet: CCMetadataNet, message: NSString, errorCode: NSInteger) { metadataNet.delegate?.listingFavoritesFailure(metadataNet, message: message, errorCode: errorCode) } // -------------------------------------------------------------------------------------------- // MARK: Utility // -------------------------------------------------------------------------------------------- @objc func deleteFile(metadata: tableMetadata, serverUrl: String) { do { try FileManager.default.removeItem(atPath: "\(appDelegate.directoryUser)/\(metadata.fileID)") } catch { // handle error } do { try FileManager.default.removeItem(atPath: "\(appDelegate.directoryUser)/\(metadata.fileID).ico") } catch { // handle error } if metadata.directory { let dirForDelete = CCUtility.stringAppendServerUrl(serverUrl, addFileName: metadata.fileName) NCManageDatabase.sharedInstance.deleteDirectoryAndSubDirectory(serverUrl: dirForDelete!) } NCManageDatabase.sharedInstance.deleteLocalFile(predicate: NSPredicate(format: "fileID == %@", metadata.fileID)) NCManageDatabase.sharedInstance.deleteMetadata(predicate: NSPredicate(format: "fileID == %@", metadata.fileID), clearDateReadDirectoryID: nil) } }