mirror of
https://github.com/nextcloud/desktop.git
synced 2024-11-25 06:25:56 +03:00
Perform lock/unlock procedure in lock view controller
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
parent
72ec0d5f1f
commit
2b7734ac4d
1 changed files with 86 additions and 0 deletions
|
@ -7,6 +7,7 @@
|
|||
|
||||
import AppKit
|
||||
import FileProvider
|
||||
import NextcloudFileProviderKit
|
||||
import NextcloudKit
|
||||
import OSLog
|
||||
import QuickLookThumbnailing
|
||||
|
@ -67,6 +68,7 @@ class LockViewController: NSViewController {
|
|||
}
|
||||
await updateFileDetailsDisplay(itemUrl: itemUrl)
|
||||
itemUrl.stopAccessingSecurityScopedResource()
|
||||
await lockOrUnlockFile(localItemUrl: itemUrl)
|
||||
} catch let error {
|
||||
let errorString = "Error processing item: \(error)"
|
||||
Logger.lockViewController.error("\(errorString, privacy: .public)")
|
||||
|
@ -101,4 +103,88 @@ class LockViewController: NSViewController {
|
|||
fileThumbnail?.nsImage ??
|
||||
NSImage(systemSymbolName: "doc", accessibilityDescription: "doc")
|
||||
}
|
||||
|
||||
private func lockOrUnlockFile(localItemUrl: URL) async {
|
||||
descriptionLabel.stringValue = "Fetching file details…"
|
||||
|
||||
guard let itemIdentifier = await withCheckedContinuation({
|
||||
(continuation: CheckedContinuation<NSFileProviderItemIdentifier?, Never>) -> Void in
|
||||
NSFileProviderManager.getIdentifierForUserVisibleFile(
|
||||
at: localItemUrl
|
||||
) { identifier, domainIdentifier, error in
|
||||
defer { continuation.resume(returning: identifier) }
|
||||
guard error == nil else {
|
||||
self.presentError("No item with identifier: \(error.debugDescription)")
|
||||
return
|
||||
}
|
||||
}
|
||||
}) else {
|
||||
presentError("Could not get identifier for item, no shares can be acquired.")
|
||||
return
|
||||
}
|
||||
|
||||
do {
|
||||
let connection = try await serviceConnection(url: localItemUrl, interruptionHandler: {
|
||||
Logger.lockViewController.error("Service connection interrupted")
|
||||
})
|
||||
guard let serverPath = await connection.itemServerPath(identifier: itemIdentifier),
|
||||
let credentials = await connection.credentials() as? Dictionary<String, String>,
|
||||
let account = Account(dictionary: credentials),
|
||||
!account.password.isEmpty
|
||||
else {
|
||||
presentError("Failed to get details from File Provider Extension.")
|
||||
return
|
||||
}
|
||||
let serverPathString = serverPath as String
|
||||
let itemServerRelativePath = serverPathString
|
||||
let kit = NextcloudKit()
|
||||
kit.setup(
|
||||
user: account.username,
|
||||
userId: account.username,
|
||||
password: account.password,
|
||||
urlBase: account.serverUrl
|
||||
)
|
||||
// guard let capabilities = await fetchCapabilities() else {
|
||||
guard let itemMetadata = await fetchItemMetadata(
|
||||
itemRelativePath: serverPathString, kit: kit
|
||||
) else {
|
||||
presentError("Could not get item metadata.")
|
||||
return
|
||||
}
|
||||
|
||||
// Run lock state checks
|
||||
if locking {
|
||||
guard !itemMetadata.lock else {
|
||||
presentError("File is already locked.")
|
||||
return
|
||||
}
|
||||
} else {
|
||||
guard itemMetadata.lock else {
|
||||
presentError("File is already unlocked.")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
descriptionLabel.stringValue =
|
||||
"Communicating with server, \(locking ? "locking" : "unlocking") file…"
|
||||
|
||||
await withCheckedContinuation { continuation in
|
||||
kit.lockUnlockFile(
|
||||
serverUrlFileName: itemServerRelativePath,
|
||||
shouldLock: locking,
|
||||
completion: { account, error in
|
||||
if error == .success {
|
||||
self.descriptionLabel.stringValue =
|
||||
"File \(self.locking ? "locked" : "unlocked")!"
|
||||
continuation.resume()
|
||||
} else {
|
||||
self.presentError("Could not lock file: \(error).")
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
} catch let error {
|
||||
presentError("Could not lock file: \(error).")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue