aboutsummaryrefslogtreecommitdiff
path: root/Foundation
diff options
context:
space:
mode:
authorGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2009-07-14 20:30:23 +0000
committerGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2009-07-14 20:30:23 +0000
commitd3a162e4ad8718da6ba81385be17c38d638c71cc (patch)
treecb0dd2549c014faf14b20be4e716c969d2da3442 /Foundation
parent394216f691b67794dad85408340c89ef92127faf (diff)
[Author: alcor]
Add quick and silent alias resolution R=dmaclach DELTA=44 (41 added, 1 deleted, 2 changed)
Diffstat (limited to 'Foundation')
-rw-r--r--Foundation/GTMNSFileManager+Carbon.h13
-rw-r--r--Foundation/GTMNSFileManager+Carbon.m23
-rw-r--r--Foundation/GTMNSFileManager+CarbonTest.m12
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