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