diff options
author | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2009-07-14 20:30:23 +0000 |
---|---|---|
committer | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2009-07-14 20:30:23 +0000 |
commit | d3a162e4ad8718da6ba81385be17c38d638c71cc (patch) | |
tree | cb0dd2549c014faf14b20be4e716c969d2da3442 | |
parent | 394216f691b67794dad85408340c89ef92127faf (diff) |
[Author: alcor]
Add quick and silent alias resolution
R=dmaclach
DELTA=44 (41 added, 1 deleted, 2 changed)
-rw-r--r-- | Foundation/GTMNSFileManager+Carbon.h | 13 | ||||
-rw-r--r-- | Foundation/GTMNSFileManager+Carbon.m | 23 | ||||
-rw-r--r-- | Foundation/GTMNSFileManager+CarbonTest.m | 12 |
3 files changed, 44 insertions, 4 deletions
diff --git a/Foundation/GTMNSFileManager+Carbon.h b/Foundation/GTMNSFileManager+Carbon.h index 86215ea..a303194 100644 --- a/Foundation/GTMNSFileManager+Carbon.h +++ b/Foundation/GTMNSFileManager+Carbon.h @@ -40,6 +40,19 @@ // - (NSString *)gtm_pathFromAliasData:(NSData *)alias; +// Converts an alias to a path without triggering UI +// Args: +// alias - an alias wrapped up in an NSData +// resolve - whether to try to resolve the alias, or simply read path data +// withUI - whether to show UI when trying to resolve +// +// Returns: +// The path. Nil on failure. +// +- (NSString *)gtm_pathFromAliasData:(NSData *)alias + resolve:(BOOL)resolve + withUI:(BOOL)withUI; + // Converts a path to an FSRef * // Args: // path - the path to convert diff --git a/Foundation/GTMNSFileManager+Carbon.m b/Foundation/GTMNSFileManager+Carbon.m index 4f8ba8b..465093e 100644 --- a/Foundation/GTMNSFileManager+Carbon.m +++ b/Foundation/GTMNSFileManager+Carbon.m @@ -45,6 +45,12 @@ CantUseParams: } - (NSString *)gtm_pathFromAliasData:(NSData *)data { + return [self gtm_pathFromAliasData:data resolve:YES withUI:YES]; +} + +- (NSString *)gtm_pathFromAliasData:(NSData *)data + resolve:(BOOL)resolve + withUI:(BOOL)withUI { NSString *path = nil; require_quiet(data, CantUseParams); @@ -57,14 +63,25 @@ CantUseParams: Boolean wasChanged; // we don't use a require here because it is quite legitimate for an alias // resolve to fail. - if (FSResolveAlias(NULL, alias, &ref, &wasChanged) == noErr) { - path = [self gtm_pathFromFSRef:&ref]; + + if (resolve) { + OSStatus err + = FSResolveAliasWithMountFlags(NULL, alias, &ref, &wasChanged, + withUI ? kResolveAliasFileNoUI : 0); + if (err == noErr) { + path = [self gtm_pathFromFSRef:&ref]; + } + } else { + OSStatus err + = FSCopyAliasInfo (alias, NULL, NULL, (CFStringRef *)(&path), NULL, NULL); + if (err != noErr) path = nil; + [path autorelease]; } DisposeHandle((Handle)alias); CantMakeHandle: CantUseParams: return path; -} +} - (FSRef *)gtm_FSRefForPath:(NSString *)path { FSRef* fsRef = NULL; diff --git a/Foundation/GTMNSFileManager+CarbonTest.m b/Foundation/GTMNSFileManager+CarbonTest.m index 76692b0..95f8814 100644 --- a/Foundation/GTMNSFileManager+CarbonTest.m +++ b/Foundation/GTMNSFileManager+CarbonTest.m @@ -40,6 +40,17 @@ STAssertNotNil(aliasData, nil); NSString *path2 = [fileManager gtm_pathFromAliasData:aliasData]; STAssertEqualObjects(path, path2, nil); + + path2 = [fileManager gtm_pathFromAliasData:aliasData + resolve:YES + withUI:NO]; + STAssertEqualObjects(path, path2, nil); + + path2 = [fileManager gtm_pathFromAliasData:aliasData + resolve:NO + withUI:NO]; + STAssertEqualObjects(path, path2, nil); + NSData *aliasData2 = [fileManager gtm_aliasDataForPath:path2]; STAssertNotNil(aliasData2, nil); NSString *path3 = [fileManager gtm_pathFromAliasData:aliasData2]; @@ -65,5 +76,4 @@ STAssertNil([fileManager gtm_aliasDataForPath:@""], nil); STAssertNil([fileManager gtm_aliasDataForPath:nil], nil); } - @end |