|
@@ -56,13 +56,9 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
|
|
|
|
|
|
lazy var fileCoordinator: NSFileCoordinator = {
|
|
|
|
|
|
- if #available(iOSApplicationExtension 11.0, *) {
|
|
|
- let fileCoordinator = NSFileCoordinator()
|
|
|
- fileCoordinator.purposeIdentifier = NSFileProviderManager.default.providerIdentifier
|
|
|
- return fileCoordinator
|
|
|
- } else {
|
|
|
- return NSFileCoordinator()
|
|
|
- }
|
|
|
+ let fileCoordinator = NSFileCoordinator()
|
|
|
+ fileCoordinator.purposeIdentifier = NSFileProviderManager.default.providerIdentifier
|
|
|
+ return fileCoordinator
|
|
|
}()
|
|
|
|
|
|
override init() {
|
|
@@ -75,29 +71,14 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
|
|
|
// Setup account
|
|
|
_ = providerData.setupActiveAccount()
|
|
|
|
|
|
- if #available(iOSApplicationExtension 11.0, *) {
|
|
|
-
|
|
|
- self.uploadFileImportDocument()
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- NSFileCoordinator().coordinate(writingItemAt: self.documentStorageURL, options: [], error: nil, byAccessor: { newURL in
|
|
|
- do {
|
|
|
- try providerData.fileManager.createDirectory(at: newURL, withIntermediateDirectories: true, attributes: nil)
|
|
|
- } catch let error {
|
|
|
- print("error: \(error)")
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
+ // Upload Imnport Document
|
|
|
+ self.uploadFileImportDocument()
|
|
|
}
|
|
|
|
|
|
// MARK: - Enumeration
|
|
|
|
|
|
override func enumerator(for containerItemIdentifier: NSFileProviderItemIdentifier) throws -> NSFileProviderEnumerator {
|
|
|
|
|
|
- /* ONLY iOS 11*/
|
|
|
- guard #available(iOS 11, *) else { throw NSError(domain: NSCocoaErrorDomain, code: NSFileNoSuchFileError, userInfo:[:]) }
|
|
|
-
|
|
|
var maybeEnumerator: NSFileProviderEnumerator? = nil
|
|
|
|
|
|
// Check account
|
|
@@ -135,9 +116,6 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
|
|
|
|
|
|
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
|
|
|
|
|
|
- /* ONLY iOS 11*/
|
|
|
- guard #available(iOS 11, *) else { throw NSError(domain: NSCocoaErrorDomain, code: NSFileNoSuchFileError, userInfo:[:]) }
|
|
|
-
|
|
|
if identifier == .rootContainer {
|
|
|
|
|
|
if let directory = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@", providerData.account, providerData.homeServerUrl)) {
|
|
@@ -174,9 +152,6 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
|
|
|
|
|
|
override func urlForItem(withPersistentIdentifier identifier: NSFileProviderItemIdentifier) -> URL? {
|
|
|
|
|
|
- /* ONLY iOS 11*/
|
|
|
- guard #available(iOS 11, *) else { return nil }
|
|
|
-
|
|
|
// resolve the given identifier to a file on disk
|
|
|
guard let item = try? item(for: identifier) else {
|
|
|
return nil
|
|
@@ -212,206 +187,114 @@ class FileProviderExtension: NSFileProviderExtension, CCNetworkingDelegate {
|
|
|
// MARK: -
|
|
|
|
|
|
override func providePlaceholder(at url: URL, completionHandler: @escaping (Error?) -> Void) {
|
|
|
-
|
|
|
- if #available(iOSApplicationExtension 11.0, *) {
|
|
|
|
|
|
- guard let identifier = persistentIdentifierForItem(at: url) else {
|
|
|
- completionHandler(NSFileProviderError(.noSuchItem))
|
|
|
- return
|
|
|
- }
|
|
|
+ guard let identifier = persistentIdentifierForItem(at: url) else {
|
|
|
+ completionHandler(NSFileProviderError(.noSuchItem))
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- do {
|
|
|
- let fileProviderItem = try item(for: identifier)
|
|
|
- let placeholderURL = NSFileProviderManager.placeholderURL(for: url)
|
|
|
- try NSFileProviderManager.writePlaceholder(at: placeholderURL,withMetadata: fileProviderItem)
|
|
|
- completionHandler(nil)
|
|
|
- } catch let error {
|
|
|
- print("error: \(error)")
|
|
|
- completionHandler(error)
|
|
|
- }
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- let fileName = url.lastPathComponent
|
|
|
- let placeholderURL = NSFileProviderExtension.placeholderURL(for: self.documentStorageURL.appendingPathComponent(fileName))
|
|
|
- let fileSize = 0
|
|
|
- let metadata = [AnyHashable(URLResourceKey.fileSizeKey): fileSize]
|
|
|
- do {
|
|
|
- try NSFileProviderExtension.writePlaceholder(at: placeholderURL, withMetadata: metadata as! [URLResourceKey : Any])
|
|
|
- } catch let error {
|
|
|
- print("error: \(error)")
|
|
|
- }
|
|
|
+ do {
|
|
|
+ let fileProviderItem = try item(for: identifier)
|
|
|
+ let placeholderURL = NSFileProviderManager.placeholderURL(for: url)
|
|
|
+ try NSFileProviderManager.writePlaceholder(at: placeholderURL,withMetadata: fileProviderItem)
|
|
|
completionHandler(nil)
|
|
|
+ } catch let error {
|
|
|
+ print("error: \(error)")
|
|
|
+ completionHandler(error)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
override func startProvidingItem(at url: URL, completionHandler: @escaping ((_ error: Error?) -> Void)) {
|
|
|
|
|
|
- if #available(iOSApplicationExtension 11.0, *) {
|
|
|
-
|
|
|
- let pathComponents = url.pathComponents
|
|
|
- let identifier = NSFileProviderItemIdentifier(pathComponents[pathComponents.count - 2])
|
|
|
+ let pathComponents = url.pathComponents
|
|
|
+ let identifier = NSFileProviderItemIdentifier(pathComponents[pathComponents.count - 2])
|
|
|
|
|
|
- // Check account
|
|
|
- if providerData.setupActiveAccount() == false {
|
|
|
- completionHandler(NSFileProviderError(.notAuthenticated))
|
|
|
- return
|
|
|
- }
|
|
|
+ // Check account
|
|
|
+ if providerData.setupActiveAccount() == false {
|
|
|
+ completionHandler(NSFileProviderError(.notAuthenticated))
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- guard let metadata = providerData.getTableMetadataFromItemIdentifier(identifier) else {
|
|
|
- completionHandler(NSFileProviderError(.noSuchItem))
|
|
|
- return
|
|
|
- }
|
|
|
+ guard let metadata = providerData.getTableMetadataFromItemIdentifier(identifier) else {
|
|
|
+ completionHandler(NSFileProviderError(.noSuchItem))
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- // Error ? reUpload when touch
|
|
|
- if metadata.status == k_metadataStatusUploadError && metadata.session == k_upload_session_extension {
|
|
|
-
|
|
|
- if metadata.sessionSelectorPost == providerData.selectorPostImportDocument || metadata.sessionSelectorPost == providerData.selectorPostItemChanged {
|
|
|
- self.reUpload(metadata)
|
|
|
- }
|
|
|
-
|
|
|
- completionHandler(nil)
|
|
|
- return
|
|
|
- }
|
|
|
+ // Error ? reUpload when touch
|
|
|
+ if metadata.status == k_metadataStatusUploadError && metadata.session == k_upload_session_extension {
|
|
|
|
|
|
- // is Upload [Office 365 !!!]
|
|
|
- if metadata.fileID.contains(metadata.directoryID + metadata.fileName) {
|
|
|
- completionHandler(nil)
|
|
|
- return
|
|
|
+ if metadata.sessionSelectorPost == providerData.selectorPostImportDocument || metadata.sessionSelectorPost == providerData.selectorPostItemChanged {
|
|
|
+ self.reUpload(metadata)
|
|
|
}
|
|
|
+
|
|
|
+ completionHandler(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- let tableLocalFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "fileID == %@", metadata.fileID))
|
|
|
- if tableLocalFile != nil && CCUtility.fileProviderStorageExists(metadata.fileID, fileNameView: metadata.fileNameView) {
|
|
|
- completionHandler(nil)
|
|
|
- return
|
|
|
- }
|
|
|
+ // is Upload [Office 365 !!!]
|
|
|
+ if metadata.fileID.contains(metadata.directoryID + metadata.fileName) {
|
|
|
+ completionHandler(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else {
|
|
|
- completionHandler(NSFileProviderError(.noSuchItem))
|
|
|
- return
|
|
|
- }
|
|
|
+ let tableLocalFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "fileID == %@", metadata.fileID))
|
|
|
+ if tableLocalFile != nil && CCUtility.fileProviderStorageExists(metadata.fileID, fileNameView: metadata.fileNameView) {
|
|
|
+ completionHandler(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ guard let serverUrl = NCManageDatabase.sharedInstance.getServerUrl(metadata.directoryID) else {
|
|
|
+ completionHandler(NSFileProviderError(.noSuchItem))
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
- let ocNetworking = OCnetworking.init(delegate: nil, metadataNet: nil, withUser: providerData.accountUser, withUserID: providerData.accountUserID, withPassword: providerData.accountPassword, withUrl: providerData.accountUrl)
|
|
|
- let task = ocNetworking?.downloadFileNameServerUrl(serverUrl + "/" + metadata.fileName, fileNameLocalPath: url.path, communication: CCNetworking.shared().sharedOCCommunicationExtensionDownload(), success: { (lenght, etag, date) in
|
|
|
+ let ocNetworking = OCnetworking.init(delegate: nil, metadataNet: nil, withUser: providerData.accountUser, withUserID: providerData.accountUserID, withPassword: providerData.accountPassword, withUrl: providerData.accountUrl)
|
|
|
+ let task = ocNetworking?.downloadFileNameServerUrl(serverUrl + "/" + metadata.fileName, fileNameLocalPath: url.path, communication: CCNetworking.shared().sharedOCCommunicationExtensionDownload(), success: { (lenght, etag, date) in
|
|
|
|
|
|
- // remove Task
|
|
|
- self.outstandingDownloadTasks.removeValue(forKey: url)
|
|
|
+ // remove Task
|
|
|
+ self.outstandingDownloadTasks.removeValue(forKey: url)
|
|
|
|
|
|
- // update DB Local
|
|
|
- metadata.date = date! as NSDate
|
|
|
- metadata.etag = etag!
|
|
|
- NCManageDatabase.sharedInstance.addLocalFile(metadata: metadata)
|
|
|
- NCManageDatabase.sharedInstance.setLocalFile(fileID: metadata.fileID, date: date! as NSDate, exifDate: nil, exifLatitude: nil, exifLongitude: nil, fileName: nil, etag: etag)
|
|
|
-
|
|
|
- // Update DB Metadata
|
|
|
- _ = NCManageDatabase.sharedInstance.addMetadata(metadata)
|
|
|
+ // update DB Local
|
|
|
+ metadata.date = date! as NSDate
|
|
|
+ metadata.etag = etag!
|
|
|
+ NCManageDatabase.sharedInstance.addLocalFile(metadata: metadata)
|
|
|
+ NCManageDatabase.sharedInstance.setLocalFile(fileID: metadata.fileID, date: date! as NSDate, exifDate: nil, exifLatitude: nil, exifLongitude: nil, fileName: nil, etag: etag)
|
|
|
+
|
|
|
+ // Update DB Metadata
|
|
|
+ _ = NCManageDatabase.sharedInstance.addMetadata(metadata)
|
|
|
|
|
|
- completionHandler(nil)
|
|
|
- return
|
|
|
+ completionHandler(nil)
|
|
|
+ return
|
|
|
|
|
|
- }, failure: { (errorMessage, errorCode) in
|
|
|
+ }, failure: { (errorMessage, errorCode) in
|
|
|
|
|
|
- // remove task
|
|
|
- self.outstandingDownloadTasks.removeValue(forKey: url)
|
|
|
-
|
|
|
- if errorCode == Int(CFNetworkErrors.cfurlErrorCancelled.rawValue) {
|
|
|
- completionHandler(NSFileProviderError(.noSuchItem))
|
|
|
- } else {
|
|
|
- completionHandler(NSFileProviderError(.serverUnreachable))
|
|
|
- }
|
|
|
- return
|
|
|
- })
|
|
|
+ // remove task
|
|
|
+ self.outstandingDownloadTasks.removeValue(forKey: url)
|
|
|
|
|
|
- // Add and register task
|
|
|
- if task != nil {
|
|
|
- outstandingDownloadTasks[url] = task
|
|
|
- NSFileProviderManager.default.register(task!, forItemWithIdentifier: NSFileProviderItemIdentifier(identifier.rawValue)) { (error) in }
|
|
|
+ if errorCode == Int(CFNetworkErrors.cfurlErrorCancelled.rawValue) {
|
|
|
+ completionHandler(NSFileProviderError(.noSuchItem))
|
|
|
+ } else {
|
|
|
+ completionHandler(NSFileProviderError(.serverUnreachable))
|
|
|
}
|
|
|
-
|
|
|
- } else {
|
|
|
+ return
|
|
|
+ })
|
|
|
|
|
|
- guard let fileData = try? Data(contentsOf: url) else {
|
|
|
- completionHandler(nil)
|
|
|
- return
|
|
|
- }
|
|
|
- do {
|
|
|
- _ = try fileData.write(to: url, options: NSData.WritingOptions())
|
|
|
- completionHandler(nil)
|
|
|
- } catch let error {
|
|
|
- print("error: \(error)")
|
|
|
- completionHandler(error)
|
|
|
- }
|
|
|
+ // Add and register task
|
|
|
+ if task != nil {
|
|
|
+ outstandingDownloadTasks[url] = task
|
|
|
+ NSFileProviderManager.default.register(task!, forItemWithIdentifier: NSFileProviderItemIdentifier(identifier.rawValue)) { (error) in }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
override func itemChanged(at url: URL) {
|
|
|
|
|
|
- if #available(iOSApplicationExtension 11.0, *) {
|
|
|
-
|
|
|
- let pathComponents = url.pathComponents
|
|
|
+ let pathComponents = url.pathComponents
|
|
|
|
|
|
- assert(pathComponents.count > 2)
|
|
|
+ assert(pathComponents.count > 2)
|
|
|
|
|
|
- let itemIdentifier = NSFileProviderItemIdentifier(pathComponents[pathComponents.count - 2])
|
|
|
-
|
|
|
- uploadFileItemChanged(for: itemIdentifier, url: url)
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- let fileSize = (try! providerData.fileManager.attributesOfItem(atPath: url.path)[FileAttributeKey.size] as! NSNumber).uint64Value
|
|
|
- NSLog("[LOG] Item changed at URL %@ %lu", url as NSURL, fileSize)
|
|
|
-
|
|
|
- guard let account = NCManageDatabase.sharedInstance.getAccountActive() else {
|
|
|
- self.stopProvidingItem(at: url)
|
|
|
- return
|
|
|
- }
|
|
|
- guard let fileName = CCUtility.getFileNameExt() else {
|
|
|
- self.stopProvidingItem(at: url)
|
|
|
- return
|
|
|
- }
|
|
|
- // -------> Fix : Clear FileName for twice Office 365
|
|
|
- CCUtility.setFileNameExt("")
|
|
|
- // --------------------------------------------------
|
|
|
- if (fileName != url.lastPathComponent) {
|
|
|
- self.stopProvidingItem(at: url)
|
|
|
- return
|
|
|
- }
|
|
|
- guard let serverUrl = CCUtility.getServerUrlExt() else {
|
|
|
- self.stopProvidingItem(at: url)
|
|
|
- return
|
|
|
- }
|
|
|
- guard let directoryID = NCManageDatabase.sharedInstance.getDirectoryID(serverUrl) else {
|
|
|
- self.stopProvidingItem(at: url)
|
|
|
- return
|
|
|
- }
|
|
|
+ let itemIdentifier = NSFileProviderItemIdentifier(pathComponents[pathComponents.count - 2])
|
|
|
|
|
|
- let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileName == %@ AND directoryID == %@", fileName, directoryID))
|
|
|
- if metadata != nil {
|
|
|
-
|
|
|
- // Update
|
|
|
- let directoryUser = CCUtility.getDirectoryActiveUser(account.user, activeUrl: account.url)
|
|
|
- let destinationDirectoryUser = "\(directoryUser!)/\(metadata!.fileName)"
|
|
|
-
|
|
|
- // copy sourceURL on directoryUser
|
|
|
- _ = providerData.copyFile(url.path, toPath: destinationDirectoryUser)
|
|
|
-
|
|
|
- // Prepare for send Metadata
|
|
|
- metadata!.session = k_upload_session
|
|
|
- _ = NCManageDatabase.sharedInstance.updateMetadata(metadata!)
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- // New
|
|
|
- let directoryUser = CCUtility.getDirectoryActiveUser(account.user, activeUrl: account.url)
|
|
|
- let destinationDirectoryUser = "\(directoryUser!)/\(fileName)"
|
|
|
-
|
|
|
- _ = providerData.copyFile(url.path, toPath: destinationDirectoryUser)
|
|
|
-
|
|
|
- CCNetworking.shared().uploadFile(metadata!, taskStatus: Int(k_taskStatusResume), delegate: self)
|
|
|
- }
|
|
|
-
|
|
|
- self.stopProvidingItem(at: url)
|
|
|
- }
|
|
|
+ uploadFileItemChanged(for: itemIdentifier, url: url)
|
|
|
}
|
|
|
|
|
|
override func stopProvidingItem(at url: URL) {
|