blob: 1424c44f4da808d935db3709f24039ba1a00103d [file] [log] [blame]
//
// 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>
// Export a nonsense symbol to suppress a libtool warning when this is linked alone in a static lib.
__attribute__((visibility("default")))
char GTMFileHandleUniqueNameExportToSuppressLibToolWarning = 0;
@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 len = (int)[extension length];
if (len > 0) {
// Suffix length needs to include a period.
len++;
}
int fileDescriptor = mkstemps(pathTemplateCString, len);
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