Revision: 26805
          http://sourceforge.net/p/bibdesk/svn/26805
Author:   hofman
Date:     2021-09-05 17:06:30 +0000 (Sun, 05 Sep 2021)
Log Message:
-----------
Wrap FSRef in an object

Modified Paths:
--------------
    trunk/bibdesk/BDSKLinkedFile.m

Modified: trunk/bibdesk/BDSKLinkedFile.m
===================================================================
--- trunk/bibdesk/BDSKLinkedFile.m      2021-09-05 16:46:31 UTC (rev 26804)
+++ trunk/bibdesk/BDSKLinkedFile.m      2021-09-05 17:06:30 UTC (rev 26805)
@@ -69,6 +69,13 @@
 - (NSData *)copyData;
 @end
 
+@interface BDSKFileRef : NSObject {
+    const FSRef *fsRef;
+}
+- (id)initWithFSRef:(FSRef *)aRef;
+@property (nonatomic, readonly) const FSRef *fsRef;
+@end
+
 // Private placeholder subclass
 
 @interface BDSKPlaceholderLinkedFile : BDSKLinkedFile
@@ -78,7 +85,7 @@
 
 @interface BDSKLinkedAliasFile : BDSKLinkedFile {
     id alias; // can be a BDSKAlias or bookmark NSData
-    const FSRef *fileRef;
+    BDSKFileRef *fileRef;
     NSString *relativePath;
     NSURL *fileURL;
     BOOL isInitial;
@@ -287,7 +294,7 @@
     } else {
         self = [super init];
         if (self) {
-            fileRef = NULL; // this is updated lazily, as we don't know the 
base path at this point
+            fileRef = nil; // this is updated lazily, as we don't know the 
base path at this point
             alias = [anAlias retain];
             relativePath = [relPath copy];
             delegate = aDelegate;
@@ -422,7 +429,7 @@
 
 - (void)dealloc
 {
-    BDSKZONEDESTROY(fileRef);
+    BDSKDESTROY(fileRef);
     BDSKDESTROY(alias);
     BDSKDESTROY(relativePath);
     BDSKDESTROY(fileURL);
@@ -483,26 +490,15 @@
     }
 }
 
-- (void)setFileRef:(FSRef *)aRef {
-    BDSKZONEDESTROY(fileRef);
-    if (aRef != NULL) {
-        FSRef *newRef = (FSRef *)NSZoneMalloc([self zone], sizeof(FSRef));
-        if (newRef) {
-            bcopy(aRef, newRef, sizeof(FSRef));
-            fileRef = newRef;
-        }
-    }
-}
-
 - (void)updateAliasWithBaseRef:(FSRef *)baseRef {
-    BDSKASSERT(fileRef != NULL);
+    BDSKASSERT(fileRef != nil);
     BDSKASSERT(baseRef != NULL);
     
     // update the alias
     if ([alias isKindOfClass:[BDSKAlias class]]) {
-        [alias updateWithFSRef:fileRef baseRef:baseRef];
+        [alias updateWithFSRef:[fileRef fsRef] baseRef:baseRef];
     } else {
-        BDSKAlias *anAlias = [BDSKAlias newWithFSRef:fileRef baseRef:baseRef];
+        BDSKAlias *anAlias = [BDSKAlias newWithFSRef:[fileRef fsRef] 
baseRef:baseRef];
         if (anAlias) {
             BDSKDESTROY(alias);
             alias = anAlias;
@@ -517,7 +513,7 @@
     BOOL hasBaseRef = BDSKPathToFSRef(basePath, &baseRef);
     BOOL shouldUpdate = NO;
     
-    if (fileRef == NULL) {
+    if (fileRef == nil) {
         FSRef aRef;
         BOOL hasRef = NO;
         
@@ -542,14 +538,16 @@
             }
         }
         
-        if (hasRef)
-            [self setFileRef:&aRef];
+        if (hasRef) {
+            [fileRef release];
+            fileRef = [[BDSKFileRef alloc] initWithFSRef:&aRef];
+        }
     } else if (relativePath == nil) {
         shouldUpdate = hasBaseRef;
     }
     
-    if ((shouldUpdate || fileURL == nil) && fileRef != NULL) {
-        NSURL *aURL = BDSKCreateURLFromFSRef(fileRef);
+    if ((shouldUpdate || fileURL == nil) && fileRef != nil) {
+        NSURL *aURL = BDSKCreateURLFromFSRef([fileRef fsRef]);
         if (aURL != nil) {
             if (fileURL == nil)
                 fileURL = [aURL retain];
@@ -564,19 +562,19 @@
 
 - (void)updateFileURL;
 {
-    BOOL hadFileRef = fileRef != NULL;
+    BOOL hadFileRef = fileRef != nil;
     BOOL hadFileURL = fileURL != nil;
     
     if (hadFileRef == NO)
         [self updateFileRef];
     
-    NSURL *aURL = BDSKCreateURLFromFSRef(fileRef);
+    NSURL *aURL = BDSKCreateURLFromFSRef([fileRef fsRef]);
     
     if (aURL == nil && hadFileRef) {
         // fileRef was invalid, try to update it
-        [self setFileRef:NULL];
+        BDSKDESTROY(fileRef);
         [self updateFileRef];
-        aURL = BDSKCreateURLFromFSRef(fileRef);
+        aURL = BDSKCreateURLFromFSRef([fileRef fsRef]);
     }
     
     if ([aURL isEqual:fileURL] == NO && (aURL != nil || hadFileURL)) {
@@ -584,9 +582,10 @@
         if (BDSKPathToFSRef([fileURL path], &aRef)) {
             // the file was replaced, reference the replacement rather than 
the moved file
             // this is what Dropbox does with file updates
-            [self setFileRef:&aRef];
+            [fileRef release];
+            fileRef = [[BDSKFileRef alloc] initWithFSRef:&aRef];
             [aURL release];
-            aURL = BDSKCreateURLFromFSRef(fileRef);
+            aURL = BDSKCreateURLFromFSRef([fileRef fsRef]);
             NSString *basePath = [delegate basePathForLinkedFile:self];
             FSRef baseRef;
             if (BDSKPathToFSRef(basePath, &baseRef)) {
@@ -632,7 +631,7 @@
     if (fileRef) {
         FSRef baseRef;
         BOOL hasBaseRef = BDSKPathToFSRef(basePath, &baseRef);
-        anAlias = [BDSKAlias newWithFSRef:fileRef baseRef:hasBaseRef ? 
&baseRef : NULL];
+        anAlias = [BDSKAlias newWithFSRef:[fileRef fsRef] baseRef:hasBaseRef ? 
&baseRef : NULL];
     } else if (relativePath && basePath) {
         NSString *path = [relativePath isAbsolutePath] ? relativePath : 
[[basePath stringByAppendingPathComponent:relativePath] 
stringByStandardizingPath];
         anAlias = [BDSKAlias newWithPath:path basePath:basePath];
@@ -695,7 +694,7 @@
         id saveAlias = alias;
         alias = anAlias;
         [self updateFileRef];
-        if (fileRef == NULL) {
+        if (fileRef == nil) {
             [anAlias release];
             alias = saveAlias;
             [self updateFileRef];
@@ -710,11 +709,11 @@
 - (void)updateWithPath:(NSString *)aPath {
     NSString *basePath = [delegate basePathForLinkedFile:self];
     
-    if (fileRef == NULL) {
+    if (fileRef == nil) {
         // this does the updating if possible
         [self updateFileRef];
     } else {
-        NSURL *aURL = BDSKCreateURLFromFSRef(fileRef);
+        NSURL *aURL = BDSKCreateURLFromFSRef([fileRef fsRef]);
         if (aURL != nil) {
             // if the path has changed, updating will be done below
             if (aPath == nil || [[aURL path] isEqualToString:aPath]) {
@@ -727,9 +726,9 @@
             [aURL release];
         } else {
             // the fileRef was invalid, reset it and update
-            [self setFileRef:NULL];
+            BDSKDESTROY(fileRef);
             [self updateFileRef];
-            if (fileRef == NULL && aPath) {
+            if (fileRef == nil && aPath) {
                 // this can happen after an auto file to a volume, as the file 
is actually not moved but copied
                 [self setAliasWithPath:aPath basePath:basePath];
                 if (basePath)
@@ -747,7 +746,8 @@
                 if ([path isEqualToString:[aURL path]]) {
                     needsUpdate = NO;
                 } else {
-                    [self setFileRef:&aRef];
+                    [fileRef release];
+                    fileRef = [[BDSKFileRef alloc] initWithFSRef:&aRef];
                     [self setFileURL:aURL];
                 }
                 [aURL release];
@@ -1027,3 +1027,30 @@
 #pragma clang diagnostic pop
 
 @end
+
+
+@implementation BDSKFileRef
+
+@synthesize fsRef;
+
+- (id)initWithFSRef:(FSRef *)aRef {
+    if (aRef == NULL) {
+        [self release];
+        self = nil;
+    } else {
+        self = [super init];
+        if (self) {
+            FSRef *newRef = (FSRef *)NSZoneMalloc([self zone], sizeof(FSRef));
+            if (newRef) {
+                bcopy(aRef, newRef, sizeof(FSRef));
+                fsRef = newRef;
+            } else {
+                [self release];
+                self = nil;
+            }
+        }
+    }
+    return self;
+}
+
+@end

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