2023-03-13 15:28:08 +03:00
/*
* Copyright ( C ) 2023 by Claudio Cambra < claudio . cambra @ 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 2 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 .
*/
import Foundation
import FileProvider
2023-03-14 23:07:16 +03:00
import OSLog
2023-03-13 15:28:08 +03:00
class FileProviderMaterialisedEnumerationObserver : NSObject , NSFileProviderEnumerationObserver {
let ncKitAccount : String
2023-03-13 15:39:24 +03:00
let completionHandler : ( _ deletedOcIds : Set < String > ) -> Void
2023-03-13 15:28:08 +03:00
var allEnumeratedItemIds : Set < String > = Set < String > ( )
2023-03-13 15:39:24 +03:00
required init ( ncKitAccount : String , completionHandler : @ escaping ( _ deletedOcIds : Set < String > ) -> Void ) {
2023-03-13 15:28:08 +03:00
self . ncKitAccount = ncKitAccount
2023-03-13 15:39:24 +03:00
self . completionHandler = completionHandler
2023-03-13 15:28:08 +03:00
super . init ( )
}
func didEnumerate ( _ updatedItems : [ NSFileProviderItemProtocol ] ) {
let updatedItemsIds = Array ( updatedItems . map { $0 . itemIdentifier . rawValue } )
for updatedItemsId in updatedItemsIds {
allEnumeratedItemIds . insert ( updatedItemsId )
}
}
func finishEnumerating ( upTo nextPage : NSFileProviderPage ? ) {
2023-03-14 23:07:16 +03:00
Logger . materialisedFileHandling . debug ( " Handling enumerated materialised items. " )
2023-03-13 15:28:08 +03:00
FileProviderMaterialisedEnumerationObserver . handleEnumeratedItems ( self . allEnumeratedItemIds ,
2023-03-13 15:39:24 +03:00
account : self . ncKitAccount ,
completionHandler : self . completionHandler )
2023-03-13 15:28:08 +03:00
}
func finishEnumeratingWithError ( _ error : Error ) {
2023-03-15 19:21:31 +03:00
Logger . materialisedFileHandling . error ( " Ran into error when enumerating materialised items: \( error . localizedDescription , privacy : . public ) . Handling items enumerated so far " )
2023-03-13 15:28:08 +03:00
FileProviderMaterialisedEnumerationObserver . handleEnumeratedItems ( self . allEnumeratedItemIds ,
2023-03-13 15:39:24 +03:00
account : self . ncKitAccount ,
completionHandler : self . completionHandler )
2023-03-13 15:28:08 +03:00
}
2023-03-13 15:39:24 +03:00
static func handleEnumeratedItems ( _ itemIds : Set < String > , account : String , completionHandler : @ escaping ( _ deletedOcIds : Set < String > ) -> Void ) {
2023-03-13 15:28:08 +03:00
let dbManager = NextcloudFilesDatabaseManager . shared
let databaseLocalFileMetadatas = dbManager . localFileMetadatas ( account : account )
var noLongerMaterialisedIds = Set < String > ( )
DispatchQueue . global ( qos : . background ) . async {
for localFile in databaseLocalFileMetadatas {
let localFileOcId = localFile . ocId
guard itemIds . contains ( localFileOcId ) else {
noLongerMaterialisedIds . insert ( localFileOcId )
continue ;
}
}
DispatchQueue . main . async {
2023-03-14 23:07:16 +03:00
Logger . materialisedFileHandling . info ( " Cleaning up local file metadatas for unmaterialised items " )
2023-03-13 15:28:08 +03:00
for itemId in noLongerMaterialisedIds {
dbManager . deleteLocalFileMetadata ( ocId : itemId )
}
2023-03-13 15:39:24 +03:00
completionHandler ( noLongerMaterialisedIds )
2023-03-13 15:28:08 +03:00
}
}
}
}