Q_PROPERTY(bool shared READ shared CONSTANT)
Q_PROPERTY(bool sharedByCurrentUser READ sharedByCurrentUser CONSTANT)
+ Q_PROPERTY(QString userVisiblePath READ userVisiblePath CONSTANT)
+
public:
static FileProviderItemMetadata fromNSFileProviderItem(const void *const nsFileProviderItem, const QString &domainIdentifier);
bool shared() const;
bool sharedByCurrentUser() const;
+ QString userVisiblePath() const;
+
// Check equality via identifier, contentVersion, and metadataVersion
friend bool operator==(const FileProviderItemMetadata &lhs, const FileProviderItemMetadata &rhs);
#include "fileprovideritemmetadata.h"
+#include <QLoggingCategory>
+
#import <Foundation/Foundation.h>
-#import <FileProvider/NSFileProviderItem.h>
+#import <FileProvider/FileProvider.h>
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
namespace {
namespace Mac {
+Q_LOGGING_CATEGORY(lcMacImplFileProviderItemMetadata, "nextcloud.gui.macfileprovideritemmetadatamacimpl", QtInfoMsg)
+
FileProviderItemMetadata FileProviderItemMetadata::fromNSFileProviderItem(const void *const nsFileProviderItem, const QString &domainIdentifier)
{
FileProviderItemMetadata metadata;
return metadata;
}
+QString FileProviderItemMetadata::userVisiblePath() const
+{
+ qCDebug(lcMacImplFileProviderItemMetadata) << "Getting user visible path";
+
+ const auto id = identifier();
+ const auto domainId = domainIdentifier();
+
+ if (id.isEmpty() || domainId.isEmpty()) {
+ qCWarning(lcMacImplFileProviderItemMetadata) << "Could not fetch user visible path for item, no identifier or domainIdentifier";
+ return QStringLiteral("Unknown");
+ }
+
+ NSString *const nsItemIdentifier = id.toNSString();
+ NSString *const nsDomainIdentifier = domainId.toNSString();
+
+ __block QString returnPath = QObject::tr("Unknown");
+ __block NSFileProviderManager *manager = nil;
+ dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
+
+ // getDomainsWithCompletionHandler is asynchronous -- we create a dispatch semaphore in order
+ // to wait until it is done. This should tell you that we should not call this method very
+ // often!
+
+ [NSFileProviderManager getDomainsWithCompletionHandler:^(NSArray<NSFileProviderDomain *> *const domains, NSError *const error) {
+ if (error != nil) {
+ qCWarning(lcMacImplFileProviderItemMetadata) << "Error fetching domains:" << error.localizedDescription;
+ dispatch_semaphore_signal(semaphore);
+ return;
+ }
+
+ BOOL foundDomain = NO;
+
+ for (NSFileProviderDomain *const domain in domains) {
+ if ([domain.identifier isEqualToString:nsDomainIdentifier]) {
+ foundDomain = YES;
+ manager = [NSFileProviderManager managerForDomain:domain];
+ }
+ }
+
+ if (!foundDomain) {
+ qCWarning(lcMacImplFileProviderItemMetadata) << "No matching item domain, cannot get item path";
+ }
+
+ dispatch_semaphore_signal(semaphore);
+ }];
+
+ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
+
+ if (manager == nil) {
+ qCWarning(lcMacImplFileProviderItemMetadata) << "Null manager, cannot get item path";
+ dispatch_release(semaphore);
+ return returnPath;
+ }
+
+ // getUserVisibleUrl is also async, so wait here too
+
+ [manager getUserVisibleURLForItemIdentifier:nsItemIdentifier
+ completionHandler:^(NSURL *const userVisibleFile, NSError *const error) {
+ qCDebug(lcMacImplFileProviderItemMetadata) << "Got user visible url for item identifier." << "url:" << userVisibleFile << "error:" << error.localizedDescription;
+
+ if (error != nil) {
+ qCWarning(lcMacImplFileProviderItemMetadata) << "Error fetching user visible url for item identifier." << error.localizedDescription;
+ } else {
+ returnPath = QString::fromNSString(userVisibleFile.path);
+ }
+
+ dispatch_semaphore_signal(semaphore);
+ }];
+
+ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
+ dispatch_release(semaphore);
+
+ return returnPath;
+}
+
}
}