From 5d588c34c079b3ac0333c2ef5eed6efb76b31b88 Mon Sep 17 00:00:00 2001 From: "gtm.daemon" Date: Mon, 26 Jul 2010 17:00:52 +0000 Subject: [Author: dmaclach] Added GTMNSFileHandle+UniqueName for easily and safely creating temporary files and unique directory names. Modified some tests to use the new calls. R=thomasvl DELTA=420 (397 added, 16 deleted, 7 changed) --- Foundation/GTMNSFileHandle+UniqueName.m | 120 ++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 Foundation/GTMNSFileHandle+UniqueName.m (limited to 'Foundation/GTMNSFileHandle+UniqueName.m') diff --git a/Foundation/GTMNSFileHandle+UniqueName.m b/Foundation/GTMNSFileHandle+UniqueName.m new file mode 100644 index 0000000..fc790ee --- /dev/null +++ b/Foundation/GTMNSFileHandle+UniqueName.m @@ -0,0 +1,120 @@ +// +// GTMNSFileHandle+UniqueName.m +// +// Copyright 2010 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 "GTMNSFileHandle+UniqueName.h" +#include + +NSString *GTMUniqueFileObjectPathBasedOn(NSString *pathTemplate) { + if (!pathTemplate) return nil; + char *pathTemplateCString = strdup([pathTemplate fileSystemRepresentation]); + if (!pathTemplateCString) return nil; + char *newCName = mktemp(pathTemplateCString); + NSString *newName = newCName ? [NSString stringWithUTF8String:newCName] : nil; + free(pathTemplateCString); + return newName; +} + +@implementation NSFileHandle (GTMFileHandleUniqueNameAdditions) + ++ (id)gtm_fileHandleWithUniqueNameBasedOn:(NSString *)pathTemplate + finalPath:(NSString **)path { + if (!pathTemplate) return nil; + NSString *extension = [pathTemplate pathExtension]; + char *pathTemplateCString = strdup([pathTemplate fileSystemRepresentation]); + if (!pathTemplateCString) return nil; + int fileDescriptor = mkstemps(pathTemplateCString, (int)[extension length]); + if (fileDescriptor == -1) { + free(pathTemplateCString); + return nil; + } + NSFileHandle *handle + = [[[NSFileHandle alloc] initWithFileDescriptor:fileDescriptor + closeOnDealloc:YES] autorelease]; + if (handle && path) { + *path = [NSString stringWithUTF8String:pathTemplateCString]; + } + free(pathTemplateCString); + return handle; +} + ++ (id)gtm_fileHandleWithUniqueNameBasedOn:(NSString *)nameTemplate + inDirectory:(NSString *)directory + finalPath:(NSString **)path { + NSString *fullPath = [directory stringByAppendingPathComponent:nameTemplate]; + return [self gtm_fileHandleWithUniqueNameBasedOn:fullPath finalPath:path]; +} + ++ (id)gtm_fileHandleWithUniqueNameBasedOn:(NSString *)nameTemplate + inDirectory:(NSSearchPathDirectory)directory + domainMask:(NSSearchPathDomainMask)mask + finalPath:(NSString **)path { + NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(directory, + mask, + YES); + if ([searchPaths count] == 0) return nil; + NSString *searchPath = [searchPaths objectAtIndex:0]; + return [self gtm_fileHandleWithUniqueNameBasedOn:nameTemplate + inDirectory:searchPath + finalPath:path]; +} + ++ (id)gtm_fileHandleForTemporaryFileBasedOn:(NSString *)nameTemplate + finalPath:(NSString **)path { + return [self gtm_fileHandleWithUniqueNameBasedOn:nameTemplate + inDirectory:NSTemporaryDirectory() + finalPath:path]; +} + +@end + +@implementation NSFileManager (GTMFileManagerUniqueNameAdditions) + +- (NSString *)gtm_createDirectoryWithUniqueNameBasedOn:(NSString *)pathTemplate { + if (!pathTemplate) return nil; + char *pathTemplateCString = strdup([pathTemplate fileSystemRepresentation]); + if (!pathTemplateCString) return nil; + char *outCName = mkdtemp(pathTemplateCString); + NSString *outName = outCName ? [NSString stringWithUTF8String:outCName] : nil; + free(pathTemplateCString); + return outName; +} + +- (NSString *)gtm_createDirectoryWithUniqueNameBasedOn:(NSString *)nameTemplate + inDirectory:(NSString *)directory { + NSString *fullPath = [directory stringByAppendingPathComponent:nameTemplate]; + return [self gtm_createDirectoryWithUniqueNameBasedOn:fullPath]; +} + +- (NSString *)gtm_createDirectoryWithUniqueNameBasedOn:(NSString *)nameTemplate + inDirectory:(NSSearchPathDirectory)directory + domainMask:(NSSearchPathDomainMask)mask { + NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(directory, + mask, + YES); + if ([searchPaths count] == 0) return nil; + NSString *searchPath = [searchPaths objectAtIndex:0]; + return [self gtm_createDirectoryWithUniqueNameBasedOn:nameTemplate + inDirectory:searchPath]; +} + +- (NSString *)gtm_createTemporaryDirectoryBasedOn:(NSString *)nameTemplate { + return [self gtm_createDirectoryWithUniqueNameBasedOn:nameTemplate + inDirectory:NSTemporaryDirectory()]; +} + +@end -- cgit v1.2.3