18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebNSFileManagerExtras.h> 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import "WebKitNSStringExtras.h" 32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import "WebNSURLExtras.h" 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <JavaScriptCore/Assertions.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h> 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <sys/stat.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation NSFileManager (WebNSFileManagerExtras) 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)_webkit_carbonPathForPath:(NSString *)posixPath 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus error; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FSRef ref, rootRef, parentRef; 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FSCatalogInfo info; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableArray *carbonPathPieces; 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HFSUniStr255 nameString; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make an FSRef. 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = FSPathMakeRef((const UInt8 *)[posixPath fileSystemRepresentation], &ref, NULL); 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error != noErr) { 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Get volume refNum. 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = FSGetCatalogInfo(&ref, kFSCatInfoVolume, &info, NULL, NULL, NULL); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error != noErr) { 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Get root directory FSRef. 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = FSGetVolumeInfo(info.volume, 0, NULL, kFSVolInfoNone, NULL, NULL, &rootRef); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error != noErr) { 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Get the pieces of the path. 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project carbonPathPieces = [NSMutableArray array]; 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (;;) { 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project error = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, &nameString, NULL, &parentRef); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error != noErr) { 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [carbonPathPieces insertObject:[NSString stringWithCharacters:nameString.unicode length:nameString.length] atIndex:0]; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (FSCompareFSRefs(&ref, &rootRef) == noErr) { 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ref = parentRef; 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Volume names need trailing : character. 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([carbonPathPieces count] == 1) { 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [carbonPathPieces addObject:@""]; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [carbonPathPieces componentsJoinedByString:@":"]; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarktypedef struct MetaDataInfo 88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen CFStringRef URLString; 90bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen CFStringRef referrer; 91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen CFStringRef path; 92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} MetaDataInfo; 93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void *setMetaData(void* context) 95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark MetaDataInfo *info = (MetaDataInfo *)context; 97f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen WKSetMetadataURL((NSString *)info->URLString, (NSString *)info->referrer, (NSString *)info->path); 99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (info->URLString) 101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen CFRelease(info->URLString); 102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (info->referrer) 103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen CFRelease(info->referrer); 104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (info->path) 105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen CFRelease(info->path); 106f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark free(info); 108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch [pool drain]; 109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return 0; 111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_webkit_setMetadataURL:(NSString *)URLString referrer:(NSString *)referrer atPath:(NSString *)path 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(URLString); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(path); 117231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 118231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NSURL *URL = [NSURL _web_URLWithUserTypedString:URLString]; 119231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (URL) 120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block URLString = [[URL _web_URLByRemovingUserInfo] _web_userVisibleString]; 121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark // Spawn a background thread for WKSetMetadataURL because this function will not return until mds has 123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark // journaled the data we're're trying to set. Depending on what other I/O is going on, it can take some 124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark // time. 125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark pthread_t tid; 126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark pthread_attr_t attr; 127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark pthread_attr_init(&attr); 128563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 129563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark MetaDataInfo *info = malloc(sizeof(MetaDataInfo)); 131563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 132bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen info->URLString = URLString ? CFStringCreateCopy(0, (CFStringRef)URLString) : 0; 133bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen info->referrer = referrer ? CFStringCreateCopy(0, (CFStringRef)referrer) : 0; 134bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen info->path = path ? CFStringCreateCopy(0, (CFStringRef)path) : 0; 135563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 136563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark pthread_create(&tid, &attr, setMetaData, info); 137563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark pthread_attr_destroy(&attr); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)_webkit_startupVolumeName 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *path = [self _webkit_carbonPathForPath:@"/"]; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [path substringToIndex:[path length]-1]; 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// -[NSFileManager fileExistsAtPath:] returns NO if there is a broken symlink at the path. 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// So we use this function instead, which returns YES if there is anything there, including 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// a broken symlink. 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic BOOL fileExists(NSString *path) 150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block struct stat statBuffer; 152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return !lstat([path fileSystemRepresentation], &statBuffer); 153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)_webkit_pathWithUniqueFilenameForPath:(NSString *)path 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // "Fix" the filename of the path. 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *filename = [[path lastPathComponent] _webkit_filenameByFixingIllegalCharacters]; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project path = [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:filename]; 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (fileExists(path)) { 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't overwrite existing file by appending "-n", "-n.ext" or "-n.ext.ext" to the filename. 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *extensions = nil; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *pathWithoutExtensions; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *lastPathComponent = [path lastPathComponent]; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSRange periodRange = [lastPathComponent rangeOfString:@"."]; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (periodRange.location == NSNotFound) { 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pathWithoutExtensions = path; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project extensions = [lastPathComponent substringFromIndex:periodRange.location + 1]; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lastPathComponent = [lastPathComponent substringToIndex:periodRange.location]; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pathWithoutExtensions = [[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:lastPathComponent]; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (unsigned i = 1; ; i++) { 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block NSString *pathWithAppendedNumber = [NSString stringWithFormat:@"%@-%d", pathWithoutExtensions, i]; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project path = [extensions length] ? [pathWithAppendedNumber stringByAppendingPathExtension:extensions] : pathWithAppendedNumber; 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!fileExists(path)) 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return path; 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef BUILDING_ON_TIGER 190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation NSFileManager (WebNSFileManagerTigerForwardCompatibility) 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We don't report errors via the NSError* output parameter, so ensure that the caller does not expect us to do so. 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_ARG(error, !error); 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self directoryContentsAtPath:path]; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (NSString *)destinationOfSymbolicLinkAtPath:(NSString *)path error:(NSError **)error 2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // We don't report errors via the NSError* output parameter, so ensure that the caller does not expect us to do so. 2040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT_ARG(error, !error); 2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return [self pathContentOfSymbolicLinkAtPath:path]; 2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSDictionary *)attributesOfFileSystemForPath:(NSString *)path error:(NSError **)error 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We don't report errors via the NSError* output parameter, so ensure that the caller does not expect us to do so. 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_ARG(error, !error); 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self fileSystemAttributesAtPath:path]; 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error 2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // We don't report errors via the NSError* output parameter, so ensure that the caller does not expect us to do so. 2200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT_ARG(error, !error); 2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return [self fileAttributesAtPath:path traverseLink:NO]; 2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The implementation of moveItemAtPath:toPath:error: interacts with the NSFileManager's delegate. 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We are not matching that behaviour at the moment, but it should not be a problem as any client 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // expecting that would need to call setDelegate: first which will generate a compile-time warning, 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as that method is not available on Tiger. 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self movePath:srcPath toPath:dstPath handler:nil]; 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The implementation of removeItemAtPath:error: interacts with the NSFileManager's delegate. 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We are not matching that behaviour at the moment, but it should not be a problem as any client 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // expecting that would need to call setDelegate: first which will generate a compile-time warning, 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // as that method is not available on Tiger. 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self removeFileAtPath:path handler:nil]; 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 246