Revision: 26803 http://sourceforge.net/p/bibdesk/svn/26803 Author: hofman Date: 2021-09-05 08:50:45 +0000 (Sun, 05 Sep 2021) Log Message: ----------- Add a function and method to create bookmark data for a linked file for possible later use
Modified Paths: -------------- trunk/bibdesk/BDSKLinkedFile.m Modified: trunk/bibdesk/BDSKLinkedFile.m =================================================================== --- trunk/bibdesk/BDSKLinkedFile.m 2021-09-05 08:30:26 UTC (rev 26802) +++ trunk/bibdesk/BDSKLinkedFile.m 2021-09-05 08:50:45 UTC (rev 26803) @@ -54,6 +54,7 @@ static NSURL *BDSKCreateURLFromFSRef(const FSRef *inRef); static BOOL BDSKPathToFSRef(NSString *inPath, FSRef *outRef); +static NSData *BDSKCreateBookmarkDataFromURL(NSURL *aURL, NSURL *baseURL); static NSDictionary *BDSKDictionaryFromPlistData(NSData *data); static NSDictionary *BDSKDictionaryFromArchivedData(NSData *data); @@ -646,6 +647,23 @@ return data; } +- (NSData *)copyBookmarkDataRelativeToPath:(NSString *)basePath; +{ + NSData *data = nil; + NSURL *baseURL = basePath ? [NSURL fileURLWithPath:basePath isDirectory:YES] : nil; + + if (fileURL) { + data = BDSKCreateBookmarkDataFromURL(fileURL, baseURL); + } else if (relativePath && basePath) { + NSURL *aURL = [NSURL fileURLWithPath:[relativePath isAbsolutePath] ? relativePath : [[basePath stringByAppendingPathComponent:relativePath] stringByNormalizingPath]]; + data = BDSKCreateBookmarkDataFromURL(aURL, baseURL); + } + if (data == nil && [alias isKindOfClass:[NSData class]]) + data = [alias copy]; + + return data; +} + - (NSString *)stringRelativeToPath:(NSString *)newBasePath; { BOOL noAlias = saveRelativePathOnly && newBasePath != nil; @@ -867,6 +885,27 @@ #pragma clang diagnostic pop +static NSData *BDSKCreateBookmarkDataFromURL(NSURL *aURL, NSURL *baseURL) { + if (aURL == nil) + return nil; + if (baseURL) { + CFTypeRef volumeID = NULL; + BOOL equalVolume = NO; + if (CFURLCopyResourcePropertyForKey((CFURLRef)aURL, kCFURLVolumeIdentifierKey, &volumeID, NULL) && volumeID) { + CFTypeRef baseVolumeID= NULL; + if (CFURLCopyResourcePropertyForKey((CFURLRef)baseURL, kCFURLVolumeIdentifierKey, &baseVolumeID, NULL) && baseVolumeID) { + equalVolume = CFEqual(volumeID, baseVolumeID); + CFRelease(baseVolumeID); + } + CFRelease(volumeID); + } + if (equalVolume == NO) + baseURL = nil; + } + CFURLBookmarkCreationOptions options = RUNNING_BEFORE(10_12) ? kCFURLBookmarkResolutionWithoutUIMask : 0; + return (NSData *)CFURLCreateBookmarkData(kCFAllocatorDefault, (CFURLRef)aURL, options, NULL, (CFURLRef)baseURL, NULL); +} + static NSDictionary *BDSKDictionaryFromPlistData(NSData *data) { NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:NULL error:NULL]; if ([dictionary isKindOfClass:[NSDictionary class]] == NO) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ Bibdesk-commit mailing list Bibdesk-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bibdesk-commit