123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531 |
- //
- // DocumentPickerViewController.swift
- // Picker
- //
- // Created by Marino Faggiana on 27/12/16.
- // Copyright © 2016 TWS. All rights reserved.
- //
- // Author Marino Faggiana <m.faggiana@twsweb.it>
- //
- // 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 <http://www.gnu.org/licenses/>.
- //
- import UIKit
- class DocumentPickerViewController: UIDocumentPickerExtensionViewController, CCNetworkingDelegate, OCNetworkingDelegate {
-
- // MARK: - Properties
-
- var providerDB : providerSessionDB?
-
- lazy var fileCoordinator: NSFileCoordinator = {
-
- let fileCoordinator = NSFileCoordinator()
- fileCoordinator.purposeIdentifier = self.providerIdentifier
- return fileCoordinator
-
- }()
-
- var metadata : CCMetadata?
- var recordsTableMetadata : [TableMetadata]?
- var titleFolder : String?
-
- var activeAccount : String?
- var activeUrl : String?
- var activeUser : String?
- var activePassword : String?
- var activeUID : String?
- var activeAccessToken : String?
- var directoryUser : String?
- var typeCloud : String?
- var serverUrl : String?
-
- var localServerUrl : String?
- var thumbnailInLoading = [String: IndexPath]()
-
- lazy var networkingOperationQueue : OperationQueue = {
-
- var queue = OperationQueue()
- queue.name = netQueueName
- queue.maxConcurrentOperationCount = 10
-
- return queue
- }()
-
- var hud : CCHud!
-
- // MARK: - IBOutlets
-
- @IBOutlet weak var tableView: UITableView!
-
- @IBOutlet weak var toolBar: UIToolbar!
- @IBOutlet weak var saveButton: UIBarButtonItem!
-
- // MARK: - View Life Cycle
-
- override func viewDidLoad() {
-
- providerDB = providerSessionDB.sharedInstance
-
- if let record = CCCoreData.getActiveAccount() {
-
- activeAccount = record.account!
- activePassword = record.password!
- activeUrl = record.url!
- activeUser = record.user!
- typeCloud = record.typeCloud!
- directoryUser = CCUtility.getDirectoryActiveUser(activeUser, activeUrl: activeUrl)
-
- if (localServerUrl == nil) {
-
- localServerUrl = CCUtility.getHomeServerUrlActiveUrl(activeUrl, typeCloud: typeCloud)
-
- } else {
-
- self.navigationItem.title = titleFolder
- }
-
- } else {
-
- // Close error no account return nil
-
- let deadlineTime = DispatchTime.now() + 0.1
- DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
-
- let alert = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: NSLocalizedString("_no_active_account_", comment: ""), preferredStyle: .alert)
- alert.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default) { action in
- self.dismissGrantingAccess(to: nil)
- })
-
- self.present(alert, animated: true, completion: nil)
- }
- return
- }
-
- // MARK: - init Object
- CCNetworking.shared().settingDelegate(self)
- hud = CCHud.init(view: self.navigationController?.view)
-
- // COLOR_SEPARATOR_TABLE
- self.tableView.separatorColor = UIColor(colorLiteralRed: 153.0/255.0, green: 153.0/255.0, blue: 153.0/255.0, alpha: 0.2)
-
- readFolder()
- }
-
- // MARK: - Overridden Instance Methods
-
- override func prepareForPresentation(in mode: UIDocumentPickerMode) {
-
- switch mode {
-
- case .exportToService:
-
- print("Document Picker Mode : exportToService")
- saveButton.title = "Save in this position"
-
- case .moveToService:
-
- //Show confirmation button
- print("Document Picker Mode : moveToService")
- saveButton.title = "Save in this position"
-
- case .open:
-
- print("Document Picker Mode : open")
- saveButton.tintColor = UIColor.clear
-
- case .import:
-
- print("Document Picker Mode : import")
- saveButton.tintColor = UIColor.clear
- }
- }
- // MARK: - Read folder
-
- func readFolder() {
-
- let metadataNet = CCMetadataNet.init(account: activeAccount)!
- metadataNet.action = actionReadFolder
- metadataNet.serverUrl = localServerUrl
- metadataNet.selector = selectorReadFolder
-
- let ocNetworking : OCnetworking = OCnetworking.init(delegate: self, metadataNet: metadataNet, withUser: activeUser, withPassword: activePassword, withUrl: activeUrl, withTypeCloud: typeCloud, activityIndicator: false)
- networkingOperationQueue.addOperation(ocNetworking)
-
- hud.visibleIndeterminateHud()
- }
-
- func readFolderFailure(_ metadataNet: CCMetadataNet!, message: String!, errorCode: Int) {
-
- hud.hideHud()
-
- let alert = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: message, preferredStyle: .alert)
- alert.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default) { action in
- self.dismissGrantingAccess(to: nil)
- })
-
- self.present(alert, animated: true, completion: nil)
- }
-
- func readFolderSuccess(_ metadataNet: CCMetadataNet!, permissions: String!, rev: String!, metadatas: [Any]!) {
-
- // remove all record
- let predicate = NSPredicate(format: "(account == '\(activeAccount!)') AND (directoryID == '\(metadataNet.directoryID!)') AND ((session == NULL) OR (session == ''))")
- CCCoreData.deleteMetadata(with: predicate)
-
- for metadata in metadatas as! [CCMetadata] {
-
- // do not insert crypto file
- if CCUtility.isCryptoString(metadata.fileName) {
-
- continue
- }
-
- // plist + crypto = completed ?
- if CCUtility.isCryptoPlistString(metadata.fileName) && metadata.directory == false {
-
- var isCryptoComplete = false
-
- for completeMetadata in metadatas as! [CCMetadata] {
-
- if completeMetadata.fileName == CCUtility.trasformedFileNamePlist(inCrypto: metadata.fileName) {
-
- isCryptoComplete = true
- }
- }
- if isCryptoComplete == false {
-
- continue
- }
- }
-
- // Add record
- CCCoreData.add(metadata, activeAccount: activeAccount, activeUrl: activeUrl, typeCloud: typeCloud, context: nil)
-
- // if plist do not exists, download it
- if CCUtility.isCryptoPlistString(metadata.fileName) && FileManager.default.fileExists(atPath: "\(directoryUser!)/\(metadata.fileName!)") == false {
-
- let metadataNet = CCMetadataNet.init(account: activeAccount)!
-
- metadataNet.action = actionDownloadFile
- metadataNet.metadata = metadata
- metadataNet.downloadData = false
- metadataNet.downloadPlist = true
- metadataNet.selector = selectorLoadPlist
- metadataNet.serverUrl = localServerUrl
- metadataNet.session = download_session_foreground
- metadataNet.taskStatus = Int(taskStatusResume)
-
- let ocNetworking : OCnetworking = OCnetworking.init(delegate: self, metadataNet: metadataNet, withUser: activeUser, withPassword: activePassword, withUrl: activeUrl, withTypeCloud: typeCloud, activityIndicator: false)
- networkingOperationQueue.addOperation(ocNetworking)
- }
- }
-
- // Get Datasource
- recordsTableMetadata = CCCoreData.getTableMetadata(with: NSPredicate(format: "(account == '\(activeAccount!)') AND (directoryID == '\(metadataNet.directoryID!)')"), fieldOrder: "fileName", ascending: true) as? [TableMetadata]
-
- tableView.reloadData()
-
- hud.hideHud()
- }
-
- // MARK: - Download
-
- func progressTask(_ fileID: String!, serverUrl: String!, cryptated: Bool, progress: Float) {
-
- hud.progress(progress)
- }
-
- func cancelTransfer() {
-
- networkingOperationQueue.cancelAllOperations()
- }
-
- func downloadFileFailure(_ fileID: String!, serverUrl: String!, selector: String!, message: String!, errorCode: Int) {
-
- hud.hideHud()
-
- if selector == selectorLoadFileView && errorCode != -999 {
-
- let alert = UIAlertController(title: NSLocalizedString("_error_", comment: ""), message: message, preferredStyle: .alert)
- alert.addAction(UIAlertAction(title: NSLocalizedString("_ok_", comment: ""), style: .default) { action in
- //self.dismissGrantingAccess(to: nil)
- NSLog("[LOG] Download Error \(fileID) \(message) (error \(errorCode))");
- })
-
- self.present(alert, animated: true, completion: nil)
- }
- }
- func downloadFileSuccess(_ fileID: String!, serverUrl: String!, selector: String!, selectorPost: String!) {
-
- hud.hideHud()
-
- let metadata = CCCoreData.getMetadataWithPreficate(NSPredicate(format: "(account == '\(activeAccount!)') AND (fileID == '\(fileID!)')"), context: nil)
-
- switch selector {
-
- case selectorLoadFileView :
-
- do {
-
- try FileManager.default.moveItem(atPath: "\(directoryUser!)/\(fileID!)", toPath: "\(directoryUser!)/\(metadata!.fileNamePrint!)")
-
- } catch let error as NSError {
-
- print(error)
- }
-
- let url = URL(string: "file://\(directoryUser!)/\(metadata!.fileNamePrint!)".addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!)
- self.dismissGrantingAccess(to: url)
-
- case selectorLoadPlist :
-
- CCCoreData.downloadFilePlist(metadata, activeAccount: activeAccount, activeUrl: activeUrl, typeCloud: typeCloud, directoryUser: directoryUser)
- tableView.reloadData()
-
- default :
-
- print("selector : \(selector!)")
- tableView.reloadData()
-
- }
- }
-
- // MARK: - Download Thumbnail
- func downloadThumbnailFailure(_ metadataNet: CCMetadataNet!, message: String!, errorCode: Int) {
-
- NSLog("[LOG] Thumbnail Error \(metadataNet.fileName) \(message) (error \(errorCode))");
- }
-
- func downloadThumbnailSuccess(_ metadataNet: CCMetadataNet!) {
-
- if let indexPath = thumbnailInLoading[metadataNet.fileID] {
- let path = "\(directoryUser!)/\(metadataNet.fileID!).ico"
-
- if FileManager.default.fileExists(atPath: path) {
-
- if let cell = tableView.cellForRow(at: indexPath) as? recordMetadataCell {
-
- cell.fileImageView.image = UIImage(contentsOfFile: path)
- }
- }
- }
- }
-
- func downloadThumbnail(_ metadata : CCMetadata) {
-
- let metadataNet = CCMetadataNet.init(account: activeAccount)!
-
- metadataNet.action = actionDownloadThumbnail
- metadataNet.fileID = metadata.fileID
- metadataNet.fileName = CCUtility.returnFileNamePath(fromFileName: metadata.fileName, serverUrl: localServerUrl, activeUrl: activeUrl, typeCloud: typeCloud)
- metadataNet.fileNameLocal = metadata.fileID;
- metadataNet.fileNamePrint = metadata.fileNamePrint;
- metadataNet.options = "m";
- metadataNet.selector = selectorDownloadThumbnail;
- metadataNet.serverUrl = localServerUrl
- let ocNetworking : OCnetworking = OCnetworking.init(delegate: self, metadataNet: metadataNet, withUser: activeUser, withPassword: activePassword, withUrl: activeUrl, withTypeCloud: typeCloud, activityIndicator: false)
- networkingOperationQueue.addOperation(ocNetworking)
- }
- }
- // MARK: - IBActions
- extension DocumentPickerViewController {
-
- @IBAction func saveButtonTapped(_ sender: AnyObject) {
-
- guard let sourceURL = originalURL else {
- return
- }
-
- switch documentPickerMode {
-
- case .moveToService, .exportToService:
-
- let fileName = sourceURL.deletingPathExtension().lastPathComponent
-
- /*
- guard let destinationURL = Note.fileUrlForDocumentNamed(fileName) else {
- return
- }
-
- fileCoordinator.coordinate(readingItemAt: sourceURL, options: .withoutChanges, error: nil, byAccessor: { [weak self] newURL in
- do {
- try FileManager.default.copyItem(at: sourceURL, to: destinationURL)
- self?.dismissGrantingAccess(to: destinationURL)
- } catch _ {
- print("error copying file")
- }
- })
- */
-
- default:
- dismiss(animated: true, completion: nil)
- }
- }
- }
- // MARK: - UITableViewDelegate
- extension DocumentPickerViewController: UITableViewDelegate {
- func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
-
- return 50
- }
- }
- // MARK: - UITableViewDataSource
- extension DocumentPickerViewController: UITableViewDataSource {
-
- func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
-
- if (recordsTableMetadata == nil) {
-
- return 0
-
- } else {
-
- return recordsTableMetadata!.count
- }
- }
-
- func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-
- let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! recordMetadataCell
-
- cell.separatorInset = UIEdgeInsetsMake(0, 60, 0, 0)
-
- let recordTableMetadata = recordsTableMetadata?[(indexPath as NSIndexPath).row]
- let metadata = CCCoreData.insertEntity(in: recordTableMetadata)!
-
- // File Image View
- let filePath = "\(directoryUser!)/\(metadata.fileID!).ico"
-
- if FileManager.default.fileExists(atPath: filePath) {
-
- cell.fileImageView.image = UIImage(contentsOfFile: filePath)
-
- } else {
-
- cell.fileImageView.image = UIImage(named: metadata.iconName!)
-
- if metadata.thumbnailExists && metadata.directory == false {
-
- downloadThumbnail(metadata)
- thumbnailInLoading[metadata.fileID] = indexPath
- }
- }
-
- // File Name
- cell.FileName.text = metadata.fileNamePrint
-
- return cell
- }
-
- func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-
- let recordTableMetadata = recordsTableMetadata?[(indexPath as NSIndexPath).row]
- tableView.deselectRow(at: indexPath, animated: true)
-
- if recordTableMetadata!.directory == 0 {
-
- let metadata = CCCoreData.insertEntity(in: recordTableMetadata)!
-
- if FileManager.default.fileExists(atPath: "\(directoryUser!)/\(metadata.fileID!)") {
-
- downloadFileSuccess(metadata.fileID!, serverUrl: localServerUrl!, selector: selectorLoadFileView, selectorPost: nil)
-
- } else {
-
- // Download file
- let metadataNet = CCMetadataNet.init(account: activeAccount)!
-
- metadataNet.action = actionDownloadFile
- metadataNet.downloadData = true
- metadataNet.downloadPlist = false
- metadataNet.metadata = metadata
- metadataNet.selector = selectorLoadFileView
- metadataNet.serverUrl = localServerUrl
- metadataNet.session = download_session_foreground
- metadataNet.taskStatus = Int(taskStatusResume)
-
- let ocNetworking : OCnetworking = OCnetworking.init(delegate: self, metadataNet: metadataNet, withUser: activeUser, withPassword: activePassword, withUrl: activeUrl, withTypeCloud: typeCloud, activityIndicator: false)
- networkingOperationQueue.addOperation(ocNetworking)
-
- hud.visibleHudTitle(NSLocalizedString("_loading_", comment: ""), mode: MBProgressHUDMode.determinateHorizontalBar, color: self.navigationController?.view.tintColor)
- hud.addButtonCancel(withTarget: self, selector: "cancelTransfer")
- }
-
- } else {
-
- var dir : String! = recordTableMetadata!.fileName
- let nextViewController = self.storyboard?.instantiateViewController(withIdentifier: "DocumentPickerViewController") as! DocumentPickerViewController
-
- if recordTableMetadata?.cryptated == 1 {
-
- dir = CCUtility.trasformedFileNamePlist(inCrypto: recordTableMetadata!.fileName)
- }
-
- nextViewController.localServerUrl = CCUtility.stringAppendServerUrl(localServerUrl!, addServerUrl: dir)
- nextViewController.titleFolder = recordTableMetadata?.fileNamePrint
-
- self.navigationController?.pushViewController(nextViewController, animated: true)
- }
- }
- }
- // MARK: - Class UITableViewCell
- class recordMetadataCell: UITableViewCell {
-
- @IBOutlet weak var fileImageView: UIImageView!
- @IBOutlet weak var FileName : UILabel!
- }
- // MARK: - Class providerSession
- class providerSessionDB {
-
- class var sharedInstance : providerSessionDB {
-
- struct Static {
-
- static let instance = providerSessionDB()
- }
-
- return Static.instance
- }
-
- private init() {
-
- let dirGroup = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: capabilitiesGroups)
- let pathDB = dirGroup?.appendingPathComponent(appDatabase).appendingPathComponent("cryptocloud")
-
- MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStore(at: pathDB!)
- MagicalRecord.setLoggingLevel(MagicalRecordLoggingLevel.off)
- }
- }
|