123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- //
- // NCDataSource.swift
- // Nextcloud
- //
- // Created by Marino Faggiana on 06/09/2020.
- // Copyright © 2020 Marino Faggiana. All rights reserved.
- //
- // Author Marino Faggiana <marino.faggiana@nextcloud.com>
- //
- // 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 Foundation
- class NCDataSource: NSObject {
-
- public var metadatas: [tableMetadata] = []
- public var metadataShare: [String:tableShare] = [:]
- public var metadataLocalImage: [String:String] = [:]
- private var ascending: Bool = true
- private var sort: String = ""
- private var directoryOnTop: Bool = true
- private var favoriteOnTop: Bool = true
- private var filterLivePhoto: Bool = true
-
- override init() {
- super.init()
- }
-
- init(metadatasSource: [tableMetadata], sort: String = "", ascending: Bool = false, directoryOnTop: Bool = false, favoriteOnTop: Bool = false, filterLivePhoto: Bool = false) {
- super.init()
-
- self.sort = sort
- self.ascending = ascending
- self.directoryOnTop = directoryOnTop
- self.favoriteOnTop = favoriteOnTop
- self.filterLivePhoto = filterLivePhoto
-
- createMetadatas(metadatasSource: metadatasSource)
- }
-
- // MARK: -
-
- private func createMetadatas(metadatasSource: [tableMetadata]) {
-
- var metadatasSourceSorted: [tableMetadata] = []
- var metadataFavoriteDirectory: [tableMetadata] = []
- var metadataFavoriteFile: [tableMetadata] = []
- var metadataDirectory: [tableMetadata] = []
- var metadataFile: [tableMetadata] = []
-
- /*
- Metadata order
- */
-
- if sort != "none" && sort != "" {
- metadatasSourceSorted = metadatasSource.sorted { (obj1:tableMetadata, obj2:tableMetadata) -> Bool in
- if sort == "date" {
- if ascending {
- return obj1.date.compare(obj2.date as Date) == ComparisonResult.orderedAscending
- } else {
- return obj1.date.compare(obj2.date as Date) == ComparisonResult.orderedDescending
- }
- } else if sort == "size" {
- if ascending {
- return obj1.size < obj2.size
- } else {
- return obj1.size > obj2.size
- }
- } else {
- if ascending {
- return obj1.fileNameView.localizedStandardCompare(obj2.fileNameView) == ComparisonResult.orderedAscending
- } else {
- return obj1.fileNameView.localizedStandardCompare(obj2.fileNameView) == ComparisonResult.orderedDescending
- }
- }
- }
- } else {
- metadatasSourceSorted = metadatasSource
- }
-
- /*
- Initialize datasource
- */
-
- for metadata in metadatasSourceSorted {
-
- // skipped the root file
- if metadata.fileName == "." || metadata.serverUrl == ".." {
- continue
- }
-
- // skipped livePhoto
- if metadata.ext == "mov" && metadata.livePhoto && filterLivePhoto {
- continue
- }
-
- // share
- let shares = NCManageDatabase.sharedInstance.getTableShares(account: metadata.account, serverUrl: metadata.serverUrl, fileName: metadata.fileName)
- if shares.count > 0 {
- metadataShare[metadata.ocId] = shares.first
- }
-
- // is Local / offline
- if !metadata.directory {
- let size = CCUtility.fileProviderStorageSize(metadata.ocId, fileNameView: metadata.fileNameView)
- if size > 0 {
- let tableLocalFile = NCManageDatabase.sharedInstance.getTableLocalFile(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
- if tableLocalFile == nil && size == metadata.size {
- NCManageDatabase.sharedInstance.addLocalFile(metadata: metadata)
- }
- if tableLocalFile?.offline ?? false {
- metadataLocalImage[metadata.ocId] = "offlineFlag"
- } else {
- metadataLocalImage[metadata.ocId] = "local"
- }
- }
- }
-
- // Organized the metadata
- if metadata.favorite && favoriteOnTop {
- if metadata.directory {
- metadataFavoriteDirectory.append(metadata)
- } else {
- metadataFavoriteFile.append(metadata)
- }
- } else if metadata.directory && directoryOnTop {
- metadataDirectory.append(metadata)
- } else {
- metadataFile.append(metadata)
- }
- }
-
- metadatas.removeAll()
- metadatas += metadataFavoriteDirectory
- metadatas += metadataFavoriteFile
- metadatas += metadataDirectory
- metadatas += metadataFile
- }
-
- // MARK: -
- func getFilesInformation() -> (directories: Int, files: Int, size: Double) {
- var directories: Int = 0
- var files: Int = 0
- var size: Double = 0
- for metadata in metadatas {
- if metadata.directory {
- directories += 1
- } else {
- files += 1
- }
- size = size + metadata.size
- }
-
- return (directories, files, size)
- }
-
- func deleteMetadata(ocId: String) -> Int? {
-
- if let index = self.getIndexMetadata(ocId: ocId) {
- metadatas.remove(at: index)
- return index
- }
-
- return nil
- }
-
- @discardableResult
- func reloadMetadata(ocId: String, ocIdTemp: String? = nil) -> Int? {
-
- var index: Int?
-
- if ocIdTemp != nil {
- index = self.getIndexMetadata(ocId: ocIdTemp!)
- } else {
- index = self.getIndexMetadata(ocId: ocId)
- }
-
- if index != nil {
- if let metadata = NCManageDatabase.sharedInstance.getMetadataFromOcId(ocId) {
- metadatas[index!] = metadata
- }
- }
-
- return index
- }
-
- func addMetadata(_ metadata: tableMetadata) -> Int? {
-
- var index: Int = 0
-
- // Already exists
- for metadataCount in metadatas {
- if metadataCount.fileNameView == metadata.fileNameView || metadataCount.ocId == metadata.ocId {
- metadatas[index] = metadata
- return index
- }
- index += 1
- }
-
- // Append & rebuild
- metadatas.append(metadata)
- createMetadatas(metadatasSource: metadatas)
-
- return getIndexMetadata(ocId: metadata.ocId)
- }
-
- func getIndexMetadata(ocId: String) -> Int? {
-
- var index: Int = 0
- for metadataCount in metadatas {
- if metadataCount.ocId == ocId {
- return index
- }
- index += 1
- }
-
- return nil
- }
-
- func numberOfItems() -> Int {
-
- return metadatas.count
- }
-
- func cellForItemAt(indexPath: IndexPath) -> tableMetadata? {
-
- let row = indexPath.row
-
- if row > metadatas.count - 1 {
- return nil
- } else {
- return metadatas[row]
- }
- }
- }
|