123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- import FileProvider
- class FileProviderData: NSObject {
-
- var fileManager = FileManager()
-
- var account = ""
- var accountUser = ""
- var accountUserID = ""
- var accountPassword = ""
- var accountUrl = ""
- var homeServerUrl = ""
-
-
- let selectorPostImportDocument = "importDocument"
- let selectorPostItemChanged = "itemChanged"
-
-
- let itemForPage = 20
-
- var listServerUrlEtag = [String:String]()
-
-
- var currentAnchor: UInt64 = 0
-
- var listFavoriteIdentifierRank = [String:NSNumber]()
-
-
- let queueTradeSafe = DispatchQueue(label: "com.nextcloud.fileproviderextension.tradesafe", attributes: .concurrent)
-
- var fileProviderSignalDeleteContainerItemIdentifier = [NSFileProviderItemIdentifier:NSFileProviderItemIdentifier]()
- var fileProviderSignalUpdateContainerItem = [NSFileProviderItemIdentifier:FileProviderItem]()
- var fileProviderSignalDeleteWorkingSetItemIdentifier = [NSFileProviderItemIdentifier:NSFileProviderItemIdentifier]()
- var fileProviderSignalUpdateWorkingSetItem = [NSFileProviderItemIdentifier:FileProviderItem]()
-
- let timeReupload: Double = 10
-
-
-
- func setupActiveAccount() -> Bool {
-
- if CCUtility.getDisableFilesApp() {
- return false
- }
-
- guard let activeAccount = NCManageDatabase.sharedInstance.getAccountActive() else {
- return false
- }
-
- if account == "" {
- queueTradeSafe.sync(flags: .barrier) {
- account = activeAccount.account
- accountUser = activeAccount.user
- accountUserID = activeAccount.userID
- accountPassword = activeAccount.password
- accountUrl = activeAccount.url
- homeServerUrl = CCUtility.getHomeServerUrlActiveUrl(activeAccount.url)
- }
- } else if account != activeAccount.account {
- assert(false, "change user")
- }
-
- return true
- }
-
-
-
- func getAccountFromItemIdentifier(_ itemIdentifier: NSFileProviderItemIdentifier) -> String? {
-
- let fileID = itemIdentifier.rawValue
- return NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", fileID))?.account
- }
-
- func getTableMetadataFromItemIdentifier(_ itemIdentifier: NSFileProviderItemIdentifier) -> tableMetadata? {
-
- let fileID = itemIdentifier.rawValue
- return NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", fileID))
- }
- func getItemIdentifier(metadata: tableMetadata) -> NSFileProviderItemIdentifier {
-
- return NSFileProviderItemIdentifier(metadata.fileID)
- }
-
- func createFileIdentifierOnFileSystem(metadata: tableMetadata) {
-
- let itemIdentifier = getItemIdentifier(metadata: metadata)
-
- if metadata.directory {
- CCUtility.getDirectoryProviderStorageFileID(itemIdentifier.rawValue)
- } else {
- CCUtility.getDirectoryProviderStorageFileID(itemIdentifier.rawValue, fileNameView: metadata.fileNameView)
- }
- }
-
- func getParentItemIdentifier(metadata: tableMetadata) -> NSFileProviderItemIdentifier? {
-
-
- guard #available(iOS 11, *) else { return NSFileProviderItemIdentifier("") }
-
- if let directory = NCManageDatabase.sharedInstance.getTableDirectory(predicate: NSPredicate(format: "directoryID == %@", metadata.directoryID)) {
- if directory.serverUrl == homeServerUrl {
- return NSFileProviderItemIdentifier(NSFileProviderItemIdentifier.rootContainer.rawValue)
- } else {
-
- if let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", directory.fileID)) {
- let identifier = getItemIdentifier(metadata: metadata)
- return identifier
- }
- }
- }
-
- return nil
- }
-
- func getTableDirectoryFromParentItemIdentifier(_ parentItemIdentifier: NSFileProviderItemIdentifier) -> tableDirectory? {
-
-
- guard #available(iOS 11, *) else { return nil }
-
- var predicate: NSPredicate
-
- if parentItemIdentifier == .rootContainer {
-
- predicate = NSPredicate(format: "account == %@ AND serverUrl == %@", account, homeServerUrl)
-
- } else {
-
- guard let metadata = getTableMetadataFromItemIdentifier(parentItemIdentifier) else {
- return nil
- }
- predicate = NSPredicate(format: "fileID == %@", metadata.fileID)
- }
-
- guard let directory = NCManageDatabase.sharedInstance.getTableDirectory(predicate: predicate) else {
- return nil
- }
-
- return directory
- }
-
-
-
- func updateFavoriteForWorkingSet() {
-
-
- guard #available(iOS 11, *) else { return }
-
- var updateWorkingSet = false
- let oldListFavoriteIdentifierRank = listFavoriteIdentifierRank
- listFavoriteIdentifierRank = NCManageDatabase.sharedInstance.getTableMetadatasDirectoryFavoriteIdentifierRank()
-
-
- for (identifier, _) in listFavoriteIdentifierRank {
-
- if !oldListFavoriteIdentifierRank.keys.contains(identifier) {
-
- guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", identifier)) else {
- continue
- }
- guard let parentItemIdentifier = getParentItemIdentifier(metadata: metadata) else {
- continue
- }
-
- let item = FileProviderItem(metadata: metadata, parentItemIdentifier: parentItemIdentifier, providerData: self)
- queueTradeSafe.sync(flags: .barrier) {
- fileProviderSignalUpdateWorkingSetItem[item.itemIdentifier] = item
- }
- updateWorkingSet = true
- }
- }
-
-
- for (identifier, _) in oldListFavoriteIdentifierRank {
-
- if !listFavoriteIdentifierRank.keys.contains(identifier) {
-
- guard let metadata = NCManageDatabase.sharedInstance.getMetadata(predicate: NSPredicate(format: "fileID == %@", identifier)) else {
- continue
- }
-
- let itemIdentifier = getItemIdentifier(metadata: metadata)
- queueTradeSafe.sync(flags: .barrier) {
- fileProviderSignalDeleteWorkingSetItemIdentifier[itemIdentifier] = itemIdentifier
- }
- updateWorkingSet = true
- }
- }
-
- if updateWorkingSet {
- signalEnumerator(for: [.workingSet])
- }
- }
-
-
-
-
- func signalEnumerator(for containerItemIdentifiers: [NSFileProviderItemIdentifier]) {
-
-
- guard #available(iOS 11, *) else { return }
-
- currentAnchor += 1
-
- for containerItemIdentifier in containerItemIdentifiers {
-
- NSFileProviderManager.default.signalEnumerator(for: containerItemIdentifier) { error in
- if let error = error {
- print("SignalEnumerator for \(containerItemIdentifier) returned error: \(error)")
- }
- }
- }
- }
-
-
-
- func copyFile(_ atPath: String, toPath: String) -> Error? {
-
- var errorResult: Error?
-
- if !fileManager.fileExists(atPath: atPath) {
- return NSError(domain: NSCocoaErrorDomain, code: NSFileNoSuchFileError, userInfo:[:])
- }
-
- do {
- try fileManager.removeItem(atPath: toPath)
- } catch let error {
- print("error: \(error)")
- }
- do {
- try fileManager.copyItem(atPath: atPath, toPath: toPath)
- } catch let error {
- errorResult = error
- }
-
- return errorResult
- }
-
- func moveFile(_ atPath: String, toPath: String) -> Error? {
-
- var errorResult: Error?
-
- if !fileManager.fileExists(atPath: atPath) {
- return NSError(domain: NSCocoaErrorDomain, code: NSFileNoSuchFileError, userInfo:[:])
- }
-
- do {
- try fileManager.removeItem(atPath: toPath)
- } catch let error {
- print("error: \(error)")
- }
- do {
- try fileManager.moveItem(atPath: atPath, toPath: toPath)
- } catch let error {
- errorResult = error
- }
-
- return errorResult
- }
-
- func deleteFile(_ atPath: String) -> Error? {
-
- var errorResult: Error?
-
- do {
- try fileManager.removeItem(atPath: atPath)
- } catch let error {
- errorResult = error
- }
-
- return errorResult
- }
- }
|