aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMNSFileHandle+UniqueName.m
diff options
context:
space:
mode:
authorGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2010-07-26 17:00:52 +0000
committerGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2010-07-26 17:00:52 +0000
commit5d588c34c079b3ac0333c2ef5eed6efb76b31b88 (patch)
tree294488e6da48402e4276603ef3853f39f67b9aaf /Foundation/GTMNSFileHandle+UniqueName.m
parent4d56ee54c0f2b36d0e96db4a74e1b84d539df29d (diff)
[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)
Diffstat (limited to 'Foundation/GTMNSFileHandle+UniqueName.m')
-rw-r--r--Foundation/GTMNSFileHandle+UniqueName.m120
1 files changed, 120 insertions, 0 deletions
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 <unistd.h>
+
+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