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

Reply via email to