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