diff --git a/ios-sdk b/ios-sdk index 275bad5ac..60d980bad 160000 --- a/ios-sdk +++ b/ios-sdk @@ -1 +1 @@ -Subproject commit 275bad5ac6c03012882e01c50d3862f93105a15a +Subproject commit 60d980bada516a7cb2f6a24a8f07947ec17a1374 diff --git a/ownCloud File Provider/FileProviderContentEnumerator.m b/ownCloud File Provider/FileProviderContentEnumerator.m index 883cd4ff2..2d91a6597 100644 --- a/ownCloud File Provider/FileProviderContentEnumerator.m +++ b/ownCloud File Provider/FileProviderContentEnumerator.m @@ -581,7 +581,7 @@ - (BOOL)provideItemsToEnumerationObserver:(id ((content.query == nil) && (content != nil))) { NSArray *queryResults = content.query.queryResults; - OCBookmarkUUIDString bookmarkUUIDString = content.core.bookmark.uuid.UUIDString; + OCBookmarkUUIDString bookmarkUUIDString = content.core.bookmark.uuidString; for (OCItem *item in queryResults) { @@ -620,7 +620,7 @@ - (BOOL)provideItemsForChangeObserver:(id)changeOb OCLogDebug(@"##### PROVIDE ITEMS TO %lu --CHANGE-- OBSERVER FOR %@: %@", _changeObservers.count, content.query.queryLocation.path, content.query.queryResults); NSArray *queryResults = content.query.queryResults; - OCBookmarkUUIDString bookmarkUUIDString = content.core.bookmark.uuid.UUIDString; + OCBookmarkUUIDString bookmarkUUIDString = content.core.bookmark.uuidString; for (OCItem *item in queryResults) { diff --git a/ownCloud File Provider/FileProviderExtension.m b/ownCloud File Provider/FileProviderExtension.m index e1dc74df1..11bd1703c 100644 --- a/ownCloud File Provider/FileProviderExtension.m +++ b/ownCloud File Provider/FileProviderExtension.m @@ -292,7 +292,7 @@ - (nullable OCItem *)cachedItemInParent:(OCItem *)parentItem withName:(NSString if ((item = [self.core cachedItemInParent:parentItem withName:name isDirectory:isDirectory error:outError]) != nil) { - item.bookmarkUUID = self.core.bookmark.uuid.UUIDString; + item.bookmarkUUID = self.core.bookmark.uuidString; // ensure bookmarkUUID is present so that vfsItemID / itemIdentifier succeed } return (item); @@ -337,15 +337,29 @@ - (void)startProvidingItemAtURL:(NSURL *)provideAtURL completionHandler:(void (^ { if ((item = [self itemForIdentifier:itemIdentifier error:&error]) != nil) { - FPLogCmdBegin(@"StartProviding", @"Downloading %@", item); + OCItem *ocItem = OCTypedCast(item, OCItem); - if (((OCItem *)item).type == OCItemTypeCollection) { - // Can't download folders - completionHandler([NSError errorWithDomain:NSCocoaErrorDomain code:NSFeatureUnsupportedError userInfo:@{}]); + if (ocItem == nil) + { + // itemForIdentifier can also return OCVFSNode items, typically for virtual folders. Nothing to download in this case. + // Return success regardless for consistency with the behaviour for "real" folders (=> see below) + FPLogCmdBegin(@"StartProviding", @"Completed with success for VFS item %@", item); + completionHandler(nil); return; } - [self.core downloadItem:(OCItem *)item options:@{ + if (ocItem.type == OCItemTypeCollection) + { + // Folder item - nothing to download + // Return success regardless to avoid breaking recursive ops in Files.app. + FPLogCmdBegin(@"StartProviding", @"Completed with success for folder %@", item); + completionHandler(nil); + return; + } + + FPLogCmdBegin(@"StartProviding", @"Downloading %@", item); + + [self.core downloadItem:ocItem options:@{ OCCoreOptionAddFileClaim : [OCClaim claimForLifetimeOfCore:core explicitIdentifier:OCClaimExplicitIdentifierFileProvider withLockType:OCClaimLockTypeRead] @@ -552,14 +566,18 @@ - (void)createDirectoryWithName:(NSString *)directoryName inParentItemIdentifier __block BOOL calledCompletionHandler = NO; [self.core createFolder:directoryName inside:parentItem options:nil placeholderCompletionHandler:^(NSError * _Nullable error, OCItem * _Nullable item) { - FPLogCmd(@"Completed placeholder creation with item=%@, error=%@", item, error); + FPLogCmd(@"Completed placeholder creation with item=%@, error=%@, offline=%d", item, error, (self.core.connectionStatus != OCCoreConnectionStatusOnline)); - if (!calledCompletionHandler) + if (!calledCompletionHandler && + (self.core.connectionStatus != OCCoreConnectionStatusOnline)) // Only return placeholder item right away if we're offline - otherwise wait for actual outcome (avoids DB race condition) { calledCompletionHandler = YES; + item.bookmarkUUID = self.bookmark.uuidString; // ensure bookmarkUUID is present so that vfsItemID / itemIdentifier succeed completionHandler(item, [error translatedError]); } } resultHandler:^(NSError *error, OCCore *core, OCItem *item, id parameter) { + item.bookmarkUUID = self.core.bookmark.uuidString; // ensure bookmarkUUID is present so that vfsItemID / itemIdentifier succeed + if (error != nil) { if (error.HTTPStatus.code == OCHTTPStatusCodeMETHOD_NOT_ALLOWED) @@ -623,6 +641,7 @@ - (void)reparentItemWithIdentifier:(NSFileProviderItemIdentifier)itemIdentifier [self.core moveItem:item to:parentItem withName:((newName != nil) ? newName : item.name) options:nil resultHandler:^(NSError *error, OCCore *core, OCItem *item, id parameter) { FPLogCmd(@"Completed with item=%@, error=%@", item, error); + item.bookmarkUUID = self.core.bookmark.uuidString; // ensure bookmarkUUID is present so that vfsItemID / itemIdentifier succeed completionHandler(item, [error translatedError]); }]; } @@ -657,6 +676,8 @@ - (void)renameItemWithIdentifier:(NSFileProviderItemIdentifier)itemIdentifier to [self.core renameItem:item to:itemName options:nil resultHandler:^(NSError *error, OCCore *core, OCItem *item, id parameter) { FPLogCmd(@"Completed with item=%@, error=%@", item, error); + + item.bookmarkUUID = self.core.bookmark.uuidString; // ensure bookmarkUUID is present so that vfsItemID / itemIdentifier succeed completionHandler(item, [error translatedError]); }]; } @@ -769,7 +790,7 @@ - (void)importDocumentAtURL:(NSURL *)fileURL toParentItemIdentifier:(NSFileProvi OCCoreOptionImportByCopying : @(importByCopying) } placeholderCompletionHandler:^(NSError *error, OCItem *item) { FPLogCmd(@"Completed with placeholderItem=%@, error=%@", item, error); - item.bookmarkUUID = self.core.bookmark.uuid.UUIDString; // ensure bookmarkUUID is present so that vfsItemID / itemIdentifier succeed + item.bookmarkUUID = self.core.bookmark.uuidString; // ensure bookmarkUUID is present so that vfsItemID / itemIdentifier succeed completionHandler(item, [error translatedError]); } resultHandler:^(NSError *error, OCCore *core, OCItem *item, id parameter) { if ([error.domain isEqual:OCHTTPStatusErrorDomain] && (error.code == OCHTTPStatusCodePRECONDITION_FAILED)) @@ -1307,7 +1328,7 @@ - (void)core:(OCCore *)core handleError:(NSError *)error issue:(OCIssue *)issue UNNotificationRequest *request; - request = [UNNotificationRequest requestWithIdentifier:ComposeNotificationIdentifier(NotificationAuthErrorForwarder, bookmark.uuid.UUIDString) content:content trigger:nil]; + request = [UNNotificationRequest requestWithIdentifier:ComposeNotificationIdentifier(NotificationAuthErrorForwarder, bookmark.uuidString) content:content trigger:nil]; [NotificationManager.sharedNotificationManager addNotificationRequest:request withCompletionHandler:^(NSError * _Nonnull error) { OCLogDebug(@"Add Notification error: %@", error); diff --git a/ownCloud File Provider/OCVFSNode+FileProviderItem.m b/ownCloud File Provider/OCVFSNode+FileProviderItem.m index aab747277..484b1f8eb 100644 --- a/ownCloud File Provider/OCVFSNode+FileProviderItem.m +++ b/ownCloud File Provider/OCVFSNode+FileProviderItem.m @@ -82,6 +82,11 @@ - (NSFileProviderItemCapabilities)capabilities return (NSFileProviderItemCapabilitiesAllowsContentEnumerating); } +- (NSNumber *)documentSize +{ + return (nil); // Despite being documented as optional, this method is invoked when copying a space from one account to another space of another account via drag and drop +} + @end #endif /* OC_FEATURE_AVAILABLE_FILEPROVIDER */ diff --git a/ownCloud Intents/OCBookmarkManager+Extension.swift b/ownCloud Intents/OCBookmarkManager+Extension.swift index b19a5e82c..3432987c9 100644 --- a/ownCloud Intents/OCBookmarkManager+Extension.swift +++ b/ownCloud Intents/OCBookmarkManager+Extension.swift @@ -25,10 +25,10 @@ extension OCBookmarkManager { var accountList : [Account] { var accountList : [Account] = [] accountList = OCBookmarkManager.shared.bookmarks.map { (bookmark) -> Account in - let account = Account(identifier: bookmark.uuid.uuidString, display: bookmark.shortName) + let account = Account(identifier: bookmark.uuidString, display: bookmark.shortName) account.name = bookmark.shortName account.serverURL = bookmark.url - account.uuid = bookmark.uuid.uuidString + account.uuid = bookmark.uuidString return account } @@ -38,10 +38,10 @@ extension OCBookmarkManager { func accountBookmark(for uuidString: String) -> (OCBookmark, Account)? { if let bookmark = bookmark(forUUIDString: uuidString) { - let account = Account(identifier: bookmark.uuid.uuidString, display: bookmark.shortName) + let account = Account(identifier: bookmark.uuidString, display: bookmark.shortName) account.name = bookmark.shortName account.serverURL = bookmark.url - account.uuid = bookmark.uuid.uuidString + account.uuid = bookmark.uuidString return (bookmark, account) } diff --git a/ownCloud/Bookmarks/BookmarkViewController.swift b/ownCloud/Bookmarks/BookmarkViewController.swift index 166c3b5cf..7b38a5280 100644 --- a/ownCloud/Bookmarks/BookmarkViewController.swift +++ b/ownCloud/Bookmarks/BookmarkViewController.swift @@ -1113,7 +1113,7 @@ extension BookmarkViewController { if let bookmark { // Retrieve latest version of bookmark from OCBookmarkManager - if let latestStoredBookmarkVersion = OCBookmarkManager.shared.bookmark(forUUIDString: bookmark.uuid.uuidString) { + if let latestStoredBookmarkVersion = OCBookmarkManager.shared.bookmark(forUUIDString: bookmark.uuidString) { editBookmark = latestStoredBookmarkVersion } } diff --git a/ownCloud/Client/Actions/Actions+Extensions/CopyAction.swift b/ownCloud/Client/Actions/Actions+Extensions/CopyAction.swift index a1926d386..bbe5e61ab 100644 --- a/ownCloud/Client/Actions/Actions+Extensions/CopyAction.swift +++ b/ownCloud/Client/Actions/Actions+Extensions/CopyAction.swift @@ -157,7 +157,7 @@ class CopyAction : Action { } let items = context.items - let uuid = core.bookmark.uuid.uuidString + let uuid = core.bookmark.uuidString let globalPasteboard = UIPasteboard.general globalPasteboard.items = [] var itemProviderItems: [NSItemProvider] = [] diff --git a/ownCloud/Client/Actions/Actions+Extensions/CutAction.swift b/ownCloud/Client/Actions/Actions+Extensions/CutAction.swift index 03c06fb56..f31499fd2 100644 --- a/ownCloud/Client/Actions/Actions+Extensions/CutAction.swift +++ b/ownCloud/Client/Actions/Actions+Extensions/CutAction.swift @@ -46,7 +46,7 @@ class CutAction : Action { } let items = context.items - let uuid = core.bookmark.uuid.uuidString + let uuid = core.bookmark.uuidString var itemProviderItems: [NSItemProvider] = [] let globalPasteboard = UIPasteboard.general globalPasteboard.items = [] diff --git a/ownCloud/Client/Actions/Actions+Extensions/ImportPasteboardAction.swift b/ownCloud/Client/Actions/Actions+Extensions/ImportPasteboardAction.swift index ee1a48d4b..9902c6c1b 100644 --- a/ownCloud/Client/Actions/Actions+Extensions/ImportPasteboardAction.swift +++ b/ownCloud/Client/Actions/Actions+Extensions/ImportPasteboardAction.swift @@ -93,7 +93,7 @@ class ImportPasteboardAction : Action { return } - if core.bookmark.uuid.uuidString == bookmarkUUID { + if core.bookmark.uuidString == bookmarkUUID { // Copy within account core.copy(item, to: rootItem, withName: name, options: nil, resultHandler: { (error, _, _, _) in if error != nil { @@ -136,7 +136,7 @@ class ImportPasteboardAction : Action { return } - if core.bookmark.uuid.uuidString == bookmarkUUID { + if core.bookmark.uuidString == bookmarkUUID { // Move within same account core.move(item, to: rootItem, withName: name, options: nil) { (error, _, _, _) in if error != nil { diff --git a/ownCloud/FileProvider Integration/FileProviderInterfaceManager.swift b/ownCloud/FileProvider Integration/FileProviderInterfaceManager.swift index 3d7dece40..6f719e064 100644 --- a/ownCloud/FileProvider Integration/FileProviderInterfaceManager.swift +++ b/ownCloud/FileProvider Integration/FileProviderInterfaceManager.swift @@ -63,7 +63,7 @@ class FileProviderInterfaceManager: NSObject { // Collect info on bookmarks for bookmark in bookmarks { - let bookmarkUUIDString = bookmark.uuid.uuidString + let bookmarkUUIDString = bookmark.uuidString bookmarkUUIDStrings.append(bookmarkUUIDString) bookmarksByUUIDString[bookmarkUUIDString] = bookmark diff --git a/ownCloudAppFramework/Licensing/Environment/OCLicenseEnvironment.m b/ownCloudAppFramework/Licensing/Environment/OCLicenseEnvironment.m index ec4c81474..821a1bbb5 100644 --- a/ownCloudAppFramework/Licensing/Environment/OCLicenseEnvironment.m +++ b/ownCloudAppFramework/Licensing/Environment/OCLicenseEnvironment.m @@ -36,7 +36,7 @@ + (instancetype)environmentWithBookmark:(OCBookmark *)bookmark { OCLicenseEnvironment *environment = [self new]; - environment.identifier = bookmark.uuid.UUIDString; + environment.identifier = bookmark.uuidString; environment.bookmarkUUID = bookmark.uuid; environment.bookmark = bookmark; environment.hostname = bookmark.url.host; diff --git a/ownCloudAppFramework/VFS/OCVault+VFSManager.m b/ownCloudAppFramework/VFS/OCVault+VFSManager.m index 18bdee873..8d222baa1 100644 --- a/ownCloudAppFramework/VFS/OCVault+VFSManager.m +++ b/ownCloudAppFramework/VFS/OCVault+VFSManager.m @@ -64,7 +64,7 @@ - (OCVFSNode *)vfsNodeForDriveID:(OCDriveID)driveID OCVFSNode *vfsNode = nil; OCVFSItemID vfsItemID = nil, parentVFSItemID = nil; - item.bookmarkUUID = self.bookmark.uuid.UUIDString; + item.bookmarkUUID = self.bookmark.uuidString; switch (item.type) { diff --git a/ownCloudAppShared/Client/Account/Connection/AccountConnectionPool.swift b/ownCloudAppShared/Client/Account/Connection/AccountConnectionPool.swift index 5c879e5bb..f95401a24 100644 --- a/ownCloudAppShared/Client/Account/Connection/AccountConnectionPool.swift +++ b/ownCloudAppShared/Client/Account/Connection/AccountConnectionPool.swift @@ -37,7 +37,7 @@ public class AccountConnectionPool: NSObject { public func connection(for bookmark: OCBookmark) -> AccountConnection? { var connection: AccountConnection? - let bookmarkUUID = bookmark.uuid.uuidString + let bookmarkUUID = bookmark.uuidString OCSynchronized(self) { OCSynchronized(connectionsByBookmarkUUID) { diff --git a/ownCloudAppShared/Client/Account/Controller/AccountControllerSection.swift b/ownCloudAppShared/Client/Account/Controller/AccountControllerSection.swift index 656d457ca..f4254ac0d 100644 --- a/ownCloudAppShared/Client/Account/Controller/AccountControllerSection.swift +++ b/ownCloudAppShared/Client/Account/Controller/AccountControllerSection.swift @@ -24,7 +24,7 @@ public class AccountControllerSection: CollectionViewSection { public init(with accountController: AccountController) { self.accountController = accountController - let uuid = accountController.connection?.bookmark.uuid.uuidString ?? "_missing_bookmark_" + let uuid = accountController.connection?.bookmark.uuidString ?? "_missing_bookmark_" super.init(identifier: "account.\(uuid)", dataSource: accountController.accountSectionDataSource, cellStyle: CollectionViewCellStyle(with: .sideBar), cellLayout: .list(appearance: accountController.configuration.sectionAppearance), clientContext: accountController.clientContext) accountController.accountControllerSection = self } diff --git a/ownCloudAppShared/Client/View Controllers/Location Picker/ClientLocationPicker.swift b/ownCloudAppShared/Client/View Controllers/Location Picker/ClientLocationPicker.swift index be7b6a03d..8f0c5abe5 100644 --- a/ownCloudAppShared/Client/View Controllers/Location Picker/ClientLocationPicker.swift +++ b/ownCloudAppShared/Client/View Controllers/Location Picker/ClientLocationPicker.swift @@ -564,7 +564,7 @@ public class ClientLocationPicker : NSObject { } } else if let item, location == nil { // Add missing location for item - if item.bookmarkUUID == nil, let bookmarkUUID = context?.core?.bookmark.uuid.uuidString { + if item.bookmarkUUID == nil, let bookmarkUUID = context?.core?.bookmark.uuidString { item.bookmarkUUID = bookmarkUUID } if let itemLocation = item.location, let core = context?.core { diff --git a/ownCloudAppShared/User Interface/State Restoration/Actions/AppStateActionConnect.swift b/ownCloudAppShared/User Interface/State Restoration/Actions/AppStateActionConnect.swift index 029946116..20df075d9 100644 --- a/ownCloudAppShared/User Interface/State Restoration/Actions/AppStateActionConnect.swift +++ b/ownCloudAppShared/User Interface/State Restoration/Actions/AppStateActionConnect.swift @@ -65,6 +65,6 @@ public class AppStateActionConnect: AppStateAction { public extension AppStateAction { static func connection(with bookmark: OCBookmark, children: [AppStateAction]? = nil) -> AppStateActionConnect { - return AppStateActionConnect(bookmarkUUID: bookmark.uuid.uuidString, children: children) + return AppStateActionConnect(bookmarkUUID: bookmark.uuidString, children: children) } }