diff options
author | thomasvl@gmail.com <thomasvl@gmail.com@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2008-12-12 15:24:34 +0000 |
---|---|---|
committer | thomasvl@gmail.com <thomasvl@gmail.com@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2008-12-12 15:24:34 +0000 |
commit | 2e8516354aacef064d01425808da06d2cdcb4791 (patch) | |
tree | 9da4758828930280d32f18d54ece7a249df742c7 /Foundation/GTMNSFileManager+Carbon.m | |
parent | 9f64d056dd70f2f938ac6f5adb8e75b650dc2e1a (diff) |
- GTMStackTrace works on 10.5+ (and iPhone) using NSThread to build the call stack.
- Added GTM_EXTERN that makes it easier to mix and match objc and objc++ code.
- Added GTMHotKeysTextField for display and editing of hot key settings.
- Added GTMCarbonEvent for dealing with Carbon Events and HotKeys in a ObjC like way.
- Backported the Atomic Barrier Swap functions for Objective C back to Tiger.
- Added a variety of new functions to GTMUnitTestingUtilities for checking if the screensaver is in the way, waiting on user events, and generating keystrokes.
- If you are using any Carbon routines that log (DebugStr, AssertMacros.h) and use GTMUnitTestDevLog, the log routines now go through _GTMDevLog so that they can be caught in GTMUnitTestDevLog and verified like any _GTMDevLog calls you may make. For an example of this in action see GTMCarbonEventTest.m.
- Added GTMFileSystemKQueue. It provides a simple wrapper for kqueuing something in the file system and tracking changes to it.
- RunIPhoneUnitTest.sh now cleans up the user home directory and creates a documents directory within it, used when requesting a NSDocumentDirectory.
- Added GTMNSFileManager+Carbon which contains routines for path <-> Alias conversion and path <-> FSRef conversion.
- Added GTMNSArray+Merge for merging one array into another with or without a custom merging function, returning a new array with the merged contents.
Diffstat (limited to 'Foundation/GTMNSFileManager+Carbon.m')
-rw-r--r-- | Foundation/GTMNSFileManager+Carbon.m | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/Foundation/GTMNSFileManager+Carbon.m b/Foundation/GTMNSFileManager+Carbon.m new file mode 100644 index 0000000..4f8ba8b --- /dev/null +++ b/Foundation/GTMNSFileManager+Carbon.m @@ -0,0 +1,99 @@ +// +// GTMNSFileManager+Carbon.m +// +// Copyright 2008 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +// + +#import "GTMNSFileManager+Carbon.h" +#import <CoreServices/CoreServices.h> +#import <sys/param.h> +#import "GTMDefines.h" + +@implementation NSFileManager (GTMFileManagerCarbonAdditions) + +- (NSData *)gtm_aliasDataForPath:(NSString *)path { + NSData *data = nil; + FSRef ref; + AliasHandle alias = NULL; + + require_quiet([path length], CantUseParams); + require_noerr(FSPathMakeRef((UInt8 *)[path fileSystemRepresentation], + &ref, NULL), CantMakeRef); + require_noerr(FSNewAlias(NULL, &ref, &alias), CantMakeAlias); + + Size length = GetAliasSize(alias); + data = [NSData dataWithBytes:*alias length:length]; + + DisposeHandle((Handle)alias); + +CantMakeAlias: +CantMakeRef: +CantUseParams: + return data; +} + +- (NSString *)gtm_pathFromAliasData:(NSData *)data { + NSString *path = nil; + require_quiet(data, CantUseParams); + + AliasHandle alias; + const void *bytes = [data bytes]; + NSUInteger length = [data length]; + require_noerr(PtrToHand(bytes, (Handle *)&alias, length), CantMakeHandle); + + FSRef ref; + 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]; + } + DisposeHandle((Handle)alias); +CantMakeHandle: +CantUseParams: + return path; +} + +- (FSRef *)gtm_FSRefForPath:(NSString *)path { + FSRef* fsRef = NULL; + require_quiet([path length], CantUseParams); + NSMutableData *fsRefData = [NSMutableData dataWithLength:sizeof(FSRef)]; + require(fsRefData, CantAllocateFSRef); + fsRef = (FSRef*)[fsRefData mutableBytes]; + Boolean isDir = FALSE; + const UInt8 *filePath = (const UInt8 *)[path fileSystemRepresentation]; + require_noerr_action(FSPathMakeRef(filePath, fsRef, &isDir), + CantMakeRef, fsRef = NULL); +CantMakeRef: +CantAllocateFSRef: +CantUseParams: + return fsRef; +} + +- (NSString *)gtm_pathFromFSRef:(FSRef *)fsRef { + NSString *nsPath = nil; + require_quiet(fsRef, CantUseParams); + + char path[MAXPATHLEN]; + require_noerr(FSRefMakePath(fsRef, (UInt8 *)path, MAXPATHLEN), CantMakePath); + nsPath = [self stringWithFileSystemRepresentation:path length:strlen(path)]; + nsPath = [nsPath stringByStandardizingPath]; + +CantMakePath: +CantUseParams: + return nsPath; +} + +@end |