Reviewed by Darin
authorbeidson <beidson@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 29 Aug 2006 17:25:51 +0000 (17:25 +0000)
committerbeidson <beidson@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 29 Aug 2006 17:25:51 +0000 (17:25 +0000)
        Short of a few small snippets that still need to be pushed to WebCore, this
        is a final prune of WebIconDatabase.  WebFileDatabase and WebLRUFileList are gone
        and the small remaining snippets of WebFileDatabase code that were still important
        are now in static functions in WebIconDatabase.m

        * Loader/WebIconLoader.m:
        (-[WebIconLoader didFinishLoading]): Removed the flag
        * Misc/WebFileDatabase.h: Removed.
        * Misc/WebFileDatabase.m: Removed.
        * Misc/WebIconDatabase.m:
        (+[WebIconDatabase sharedIconDatabase]):
        (-[WebIconDatabase init]):
        (-[WebIconDatabase iconForURL:withSize:cache:]):
        (-[WebIconDatabase iconURLForURL:]):
        (-[WebIconDatabase defaultIconWithSize:]):
        (-[WebIconDatabase retainIconForURL:]):
        (-[WebIconDatabase releaseIconForURL:]):
        (-[WebIconDatabase _isEnabled]):
        (-[WebIconDatabase _setIconData:forIconURL:]):
        (-[WebIconDatabase _setHaveNoIconForIconURL:]):
        (-[WebIconDatabase _setIconURL:forURL:]):
        (-[WebIconDatabase _hasEntryForIconURL:]):
        (-[WebIconDatabase _applicationWillTerminate:]):
        (-[WebIconDatabase _resetCachedWebPreferences:]):
        (uniqueFilePathForKey): Added from WebFileDatabase
        (objectFromPathForKey): Added from WebFileDatabase
        (iconDataFromPathForIconURL):
        (-[WebIconDatabase _convertToWebCoreFormat]): Make use of static functions and local variables
          instead of using WebFileDatabase and WebIconDatabase variables that are now obsolete
        * Misc/WebIconDatabasePrivate.h: Removed alot of obsoleted members
        * Misc/WebLRUFileList.h: Removed.
        * Misc/WebLRUFileList.m: Removed.
        * WebKit.xcodeproj/project.pbxproj: Deleted 4 files
        * WebKitPrefix.h: Removed ICONDEBUG

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16091 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/Loader/WebIconLoader.m
WebKit/Misc/WebFileDatabase.h [deleted file]
WebKit/Misc/WebFileDatabase.m [deleted file]
WebKit/Misc/WebIconDatabase.m
WebKit/Misc/WebIconDatabasePrivate.h
WebKit/Misc/WebLRUFileList.h [deleted file]
WebKit/Misc/WebLRUFileList.m [deleted file]
WebKit/WebKit.xcodeproj/project.pbxproj
WebKit/WebKitPrefix.h

index afdfcb1b6a60cfa9795b62c53f261fe9f28dd455..872c873ad70fbc7e24bf6acabe63ae172cd45440 100644 (file)
@@ -1,3 +1,42 @@
+2006-08-28  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Darin
+
+        Short of a few small snippets that still need to be pushed to WebCore, this
+        is a final prune of WebIconDatabase.  WebFileDatabase and WebLRUFileList are gone
+        and the small remaining snippets of WebFileDatabase code that were still important
+        are now in static functions in WebIconDatabase.m
+
+        * Loader/WebIconLoader.m:
+        (-[WebIconLoader didFinishLoading]): Removed the flag
+        * Misc/WebFileDatabase.h: Removed.
+        * Misc/WebFileDatabase.m: Removed.
+        * Misc/WebIconDatabase.m:
+        (+[WebIconDatabase sharedIconDatabase]):
+        (-[WebIconDatabase init]):
+        (-[WebIconDatabase iconForURL:withSize:cache:]):
+        (-[WebIconDatabase iconURLForURL:]):
+        (-[WebIconDatabase defaultIconWithSize:]):
+        (-[WebIconDatabase retainIconForURL:]):
+        (-[WebIconDatabase releaseIconForURL:]):
+        (-[WebIconDatabase _isEnabled]):
+        (-[WebIconDatabase _setIconData:forIconURL:]):
+        (-[WebIconDatabase _setHaveNoIconForIconURL:]):
+        (-[WebIconDatabase _setIconURL:forURL:]):
+        (-[WebIconDatabase _hasEntryForIconURL:]):
+        (-[WebIconDatabase _applicationWillTerminate:]):
+        (-[WebIconDatabase _resetCachedWebPreferences:]):
+        (uniqueFilePathForKey): Added from WebFileDatabase
+        (objectFromPathForKey): Added from WebFileDatabase
+        (iconDataFromPathForIconURL):
+        (-[WebIconDatabase _convertToWebCoreFormat]): Make use of static functions and local variables
+          instead of using WebFileDatabase and WebIconDatabase variables that are now obsolete
+        * Misc/WebIconDatabasePrivate.h: Removed alot of obsoleted members
+        * Misc/WebLRUFileList.h: Removed.
+        * Misc/WebLRUFileList.m: Removed.
+        * WebKit.xcodeproj/project.pbxproj: Deleted 4 files
+        * WebKitPrefix.h: Removed ICONDEBUG
+
 2006-08-28  Tim Omernick  <timo@apple.com>
 
         Reviewed by Darin Adler.
index 6630f58141ba7a2d0adcd019a79f6d11375f64f5..d80f53b6002a13af89b6b2fc865845dfbdc77ab0 100644 (file)
@@ -88,7 +88,6 @@
 
 - (void)didFinishLoading
 {
-#ifdef ICONDEBUG
     NSData *data;
         
     id response = [self response];
     
     [frameLoader _iconLoaderReceivedPageIcon:[self URL]];
     [super didFinishLoading];
-#endif
 }
 
 - (NSURLRequest *)willSendRequest:(NSURLRequest *)newRequest redirectResponse:(NSURLResponse *)redirectResponse;
diff --git a/WebKit/Misc/WebFileDatabase.h b/WebKit/Misc/WebFileDatabase.h
deleted file mode 100644 (file)
index 54d9ee6..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import <Foundation/Foundation.h>
-
-
-@interface WebFileDatabase : NSObject
-{
-    NSString *path;
-    unsigned count;
-    BOOL isOpen;
-    unsigned sizeLimit;
-    unsigned usage;
-    
-    struct WebLRUFileList *lru;
-    NSMutableArray *ops;
-    NSMutableDictionary *setCache;
-    NSMutableSet *removeCache;
-    
-    NSTimer *timer;
-    NSTimeInterval touch;
-    NSRecursiveLock *mutex;
-}
-
-- (void)setObject:(id)object forKey:(id)key;
-- (void)removeObjectForKey:(id)key;
-- (void)removeAllObjects;
-- (id)objectForKey:(id)key;
-
-- (id)initWithPath:(NSString *)thePath;
-
-- (void)open;
-- (void)close;
-- (void)sync;
-
-- (NSString *)path;
-- (BOOL)isOpen;
-
-- (unsigned)count;
-- (unsigned)sizeLimit;
-- (void)setSizeLimit:(unsigned)limit;
-- (unsigned)usage;
-
-- (void)performSetObject:(id)object forKey:(id)key;
-- (void)performRemoveObjectForKey:(id)key;
-
-@end
diff --git a/WebKit/Misc/WebFileDatabase.m b/WebKit/Misc/WebFileDatabase.m
deleted file mode 100644 (file)
index 19174c2..0000000
+++ /dev/null
@@ -1,722 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import <WebKit/WebFileDatabase.h>
-#import <WebKit/WebKitLogging.h>
-#import <WebKit/WebLRUFileList.h>
-#import <WebKit/WebNSFileManagerExtras.h>
-
-#import <fcntl.h>
-#import <fts.h>
-#import <pthread.h>
-#import <string.h>
-#import <sys/stat.h>
-#import <sys/types.h>
-#import <sys/mman.h>
-
-#if ERROR_DISABLED
-#define BEGIN_EXCEPTION_HANDLER
-#define END_EXCEPTION_HANDLER
-#else
-#define BEGIN_EXCEPTION_HANDLER NS_DURING
-#define END_EXCEPTION_HANDLER \
-    NS_HANDLER \
-        LOG_ERROR("Uncaught exception: %@ [%@] [%@]", [localException class], [localException reason], [localException userInfo]); \
-    NS_ENDHANDLER
-#endif
-
-static pthread_once_t databaseInitControl = PTHREAD_ONCE_INIT;
-static NSNumber *WebFileDirectoryPOSIXPermissions;
-static NSNumber *WebFilePOSIXPermissions;
-static NSRunLoop *syncRunLoop;
-
-#define UniqueFilePathSize (34)
-static void UniqueFilePathForKey(id key, char *buffer);
-
-#define MinThreadPriority (10)
-static int SetThreadPriority(int priority);
-
-typedef enum
-{
-    WebFileDatabaseSetObjectOp,
-    WebFileDatabaseRemoveObjectOp,
-} WebFileDatabaseOpcode;
-
-enum
-{
-    MAX_UNSIGNED_LENGTH = 20, // long enough to hold the string representation of a 64-bit unsigned number
-    SYNC_IDLE_THRESHOLD = 10,
-};
-
-// interface WebFileDatabaseOp -------------------------------------------------------------
-
-@interface WebFileDatabaseOp : NSObject
-{
-    WebFileDatabaseOpcode opcode;
-    id key;
-    id object; 
-}
-
-+(id)opWithCode:(WebFileDatabaseOpcode)opcode key:(id)key object:(id)object;
--(id)initWithCode:(WebFileDatabaseOpcode)opcode key:(id)key object:(id)object;
-
--(WebFileDatabaseOpcode)opcode;
--(id)key;
--(id)object;
--(void)perform:(WebFileDatabase *)target;
-
-@end
-
-
-// implementation WebFileDatabaseOp -------------------------------------------------------------
-
-@implementation WebFileDatabaseOp
-
-+(id)opWithCode:(WebFileDatabaseOpcode)theOpcode key:(id)theKey object:(id)theObject
-{
-    return [[[WebFileDatabaseOp alloc] initWithCode:theOpcode key:theKey object:theObject] autorelease];
-}
-
--(id)initWithCode:(WebFileDatabaseOpcode)theOpcode key:(id)theKey object:(id)theObject
-{
-    ASSERT(theKey);
-
-    if ((self = [super init])) {
-        
-        opcode = theOpcode;
-        key = [theKey retain];
-        object = [theObject retain];
-        
-        return self;
-    }
-  
-    return nil;
-}
-
--(WebFileDatabaseOpcode)opcode
-{
-    return opcode;
-}
-
--(id)key
-{
-    return key;
-}
-
--(id)object
-{
-    return object;
-}
-
--(void)perform:(WebFileDatabase *)target
-{
-    ASSERT(target);
-
-    switch (opcode) {
-        case WebFileDatabaseSetObjectOp:
-            [target performSetObject:object forKey:key];
-            break;
-        case WebFileDatabaseRemoveObjectOp:
-            [target performRemoveObjectForKey:key];
-            break;
-        default:
-            ASSERT_NOT_REACHED();
-            break;
-    }
-}
-
--(void)dealloc
-{
-    [key release];
-    [object release];
-    [super dealloc];
-}
-
-@end
-
-
-// interface WebFileDatabasePrivate -----------------------------------------------------------
-
-@interface WebFileDatabase (WebFileDatabasePrivate)
-
--(void)_createLRUList:(id)arg;
--(void)_truncateToSizeLimit:(unsigned)size;
-
-@end
-
-// implementation WebFileDatabasePrivate ------------------------------------------------------
-
-@implementation WebFileDatabase (WebFileDatabasePrivate)
-
-static int SetThreadPriority(int priority) 
-{
-    struct sched_param sp;
-
-    memset(&sp, 0, sizeof(struct sched_param));
-    sp.sched_priority=priority;
-    if (pthread_setschedparam(pthread_self(), SCHED_OTHER, &sp) == -1) {
-        LOG_ERROR("Failed to change priority.");
-        return -1;
-    }
-    return 0;
-}
-
-static void UniqueFilePathForKey(id key, char *buffer)
-{
-    const char *s;
-    UInt32 hash1;
-    UInt32 hash2;
-    CFIndex len;
-    CFIndex cnt;
-    
-    s = [[[[key description] lowercaseString] stringByStandardizingPath] UTF8String];
-    len = strlen(s);
-
-    // compute first hash    
-    hash1 = len;
-    for (cnt = 0; cnt < len; cnt++) {
-        hash1 += (hash1 << 8) + s[cnt];
-    }
-    hash1 += (hash1 << (len & 31));
-
-    // compute second hash    
-    hash2 = len;
-    for (cnt = 0; cnt < len; cnt++) {
-        hash2 = (37 * hash2) ^ s[cnt];
-    }
-
-#ifdef __LP64__
-    snprintf(buffer, UniqueFilePathSize, "%.2u/%.2u/%.10u-%.10u.cache", ((hash1 & 0xff) >> 4), ((hash2 & 0xff) >> 4), hash1, hash2);
-#else
-    snprintf(buffer, UniqueFilePathSize, "%.2lu/%.2lu/%.10lu-%.10lu.cache", ((hash1 & 0xff) >> 4), ((hash2 & 0xff) >> 4), hash1, hash2);
-#endif
-}
-
--(void)_createLRUList:(id)arg
-{
-    SetThreadPriority(MinThreadPriority + 1); // make this a little higher priority than the syncRunLoop thread
-
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
-    BEGIN_EXCEPTION_HANDLER
-    
-    WebLRUFileList *fileList = WebLRUFileListCreate();
-    WebLRUFileListRebuildFileDataUsingRootDirectory(fileList, [path fileSystemRepresentation]);
-    lru = fileList;
-
-    END_EXCEPTION_HANDLER
-
-    LOG(FileDatabaseActivity, "lru list created");
-
-    [pool drain];
-}
-
--(void)_truncateToSizeLimit:(unsigned)size
-{
-    NSFileManager *defaultManager;
-    
-    if (!lru || size > [self usage]) {
-        return;
-    }
-
-    if (size == 0) {
-        [self removeAllObjects];
-    }
-    else {
-        defaultManager = [NSFileManager defaultManager];
-        [mutex lock];
-        while ([self usage] > size) {
-            char uniqueKey[UniqueFilePathSize];
-            if (!WebLRUFileListGetPathOfOldestFile(lru, uniqueKey, UniqueFilePathSize)) {
-                break;
-            }
-            NSString *filePath = [[NSString alloc] initWithFormat:@"%@/%s", path, uniqueKey];
-            [defaultManager _webkit_removeFileOnlyAtPath:filePath];
-            [filePath release];
-            WebLRUFileListRemoveOldestFileFromList(lru);
-        }
-        [mutex unlock];
-    }
-}
-
-@end
-
-
-// implementation WebFileDatabase -------------------------------------------------------------
-
-@implementation WebFileDatabase
-
-// creation functions ---------------------------------------------------------------------------
-#pragma mark creation functions
-
-+(void)_syncLoop:(id)arg
-{
-    SetThreadPriority(MinThreadPriority);
-
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSPort *placeholderPort;
-
-    BEGIN_EXCEPTION_HANDLER
-
-    syncRunLoop = [NSRunLoop currentRunLoop];
-
-    while (YES) {
-        BEGIN_EXCEPTION_HANDLER
-        // we specifically use an NSRunLoop here to get autorelease pool support
-        placeholderPort = [NSPort port];
-        [syncRunLoop addPort:placeholderPort forMode:NSDefaultRunLoopMode];
-        [syncRunLoop run];
-        [syncRunLoop removePort:placeholderPort forMode:NSDefaultRunLoopMode];
-        END_EXCEPTION_HANDLER
-    }
-
-    END_EXCEPTION_HANDLER
-
-    [pool drain];
-}
-
-static void databaseInit()
-{
-    // set file perms to owner read/write/execute only
-    WebFileDirectoryPOSIXPermissions = [[NSNumber numberWithInt:(WEB_UREAD | WEB_UWRITE | WEB_UEXEC)] retain];
-
-    // set file perms to owner read/write only
-    WebFilePOSIXPermissions = [[NSNumber numberWithInt:(WEB_UREAD | WEB_UWRITE)] retain];
-
-    [NSThread detachNewThreadSelector:@selector(_syncLoop:) toTarget:[WebFileDatabase class] withObject:nil];
-}
-
--(id)initWithPath:(NSString *)thePath
-{
-    pthread_once(&databaseInitControl, databaseInit);
-
-    if (!(self = [super init])) 
-        return nil;
-        
-    path = [[thePath stringByStandardizingPath] copy];
-    if (thePath == nil) {
-        [self release];
-        return nil;
-    }
-    
-    isOpen = NO;
-    sizeLimit = 0;
-    usage = 0;
-
-    ops = [[NSMutableArray alloc] init];
-    setCache = [[NSMutableDictionary alloc] init];
-    removeCache = [[NSMutableSet alloc] init];
-    timer = nil;
-    mutex = [[NSRecursiveLock alloc] init];
-    
-    return self;
-}
-
--(void)dealloc
-{
-    [path release];
-    [super dealloc];
-}
-
-
--(void)setTimer
-{
-    if (timer == nil) {
-        NSDate *fireDate = [[NSDate alloc] initWithTimeIntervalSinceNow:SYNC_IDLE_THRESHOLD];
-        timer = [[NSTimer alloc] initWithFireDate:fireDate interval:SYNC_IDLE_THRESHOLD target:self selector:@selector(lazySync:) userInfo:nil repeats:YES];
-        [fireDate release];
-        [syncRunLoop addTimer:timer forMode:NSDefaultRunLoopMode];
-    }
-}
-
-// database functions ---------------------------------------------------------------------------
-#pragma mark database functions
-
--(void)setObject:(id)object forKey:(id)key
-{
-    WebFileDatabaseOp *op;
-
-    ASSERT(object);
-    ASSERT(key);
-
-    touch = CFAbsoluteTimeGetCurrent();
-
-    LOG(FileDatabaseActivity, "%p - %@", object, key);
-    
-    [mutex lock];
-    
-    [setCache setObject:object forKey:key];
-    op = [[WebFileDatabaseOp alloc] initWithCode:WebFileDatabaseSetObjectOp key:key object:object];
-    [ops addObject:op];
-    [op release];
-    [self setTimer];
-    
-    [mutex unlock];
-}
-
--(void)removeObjectForKey:(id)key
-{
-    WebFileDatabaseOp *op;
-
-    ASSERT(key);
-
-    touch = CFAbsoluteTimeGetCurrent();
-    
-    [mutex lock];
-    
-    [removeCache addObject:key];
-    op = [[WebFileDatabaseOp alloc] initWithCode:WebFileDatabaseRemoveObjectOp key:key object:nil];
-    [ops addObject:op];
-    [op release];
-    [self setTimer];
-    
-    [mutex unlock];
-}
-
--(void)removeAllObjects
-{
-    touch = CFAbsoluteTimeGetCurrent();
-
-    [mutex lock];
-    [setCache removeAllObjects];
-    [removeCache removeAllObjects];
-    [ops removeAllObjects];
-    [self close];
-    [[NSFileManager defaultManager] _webkit_backgroundRemoveFileAtPath:path];
-    [self open];
-    [mutex unlock];
-
-    LOG(FileDatabaseActivity, "removeAllObjects");
-}
-
--(id)objectForKey:(id)key
-{
-    volatile id result;
-    
-    ASSERT(key);
-
-    touch = CFAbsoluteTimeGetCurrent();
-
-    // check caches
-    [mutex lock];
-    if ([removeCache containsObject:key]) {
-        [mutex unlock];
-        return nil;
-    }
-    if ((result = [setCache objectForKey:key])) {
-        [mutex unlock];
-        return result;
-    }
-    [mutex unlock];
-
-    // go to disk
-    char uniqueKey[UniqueFilePathSize];
-    UniqueFilePathForKey(key, uniqueKey);
-    NSString *filePath = [[NSString alloc] initWithFormat:@"%@/%s", path, uniqueKey];
-    NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
-    NSUnarchiver * volatile unarchiver = nil;
-
-    NS_DURING
-        if (data) {
-            unarchiver = [[NSUnarchiver alloc] initForReadingWithData:data];
-            if (unarchiver) {
-                id fileKey = [unarchiver decodeObject];
-                if ([fileKey isEqual:key]) {
-                    id object = [unarchiver decodeObject];
-                    if (object) {
-                        // Decoded objects go away when the unarchiver does, so we need to
-                        // retain this so we can return it to our caller.
-                        result = [[object retain] autorelease];
-                        if (lru) {
-                            // if we can't update the list yet, that's too bad
-                            // but not critically bad
-                            WebLRUFileListTouchFileWithPath(lru, uniqueKey);
-                        }
-                        LOG(FileDatabaseActivity, "read disk cache file - %@", key);
-                    }
-                }
-            }
-        }
-    NS_HANDLER
-        LOG(FileDatabaseActivity, "cannot unarchive cache file - %@", key);
-        result = nil;
-    NS_ENDHANDLER
-
-    [unarchiver release];
-    [data release];
-    [filePath release];
-
-    LOG(Timing, "getting value for %@ took %f", key, (CFAbsoluteTimeGetCurrent() - touch));
-    
-    return result;
-}
-
--(void)performSetObject:(id)object forKey:(id)key
-{
-    NSString *filePath;
-    NSMutableData *data;
-    NSDictionary *attributes;
-    NSDictionary *directoryAttributes;
-    NSArchiver *archiver;
-    NSFileManager *defaultManager;
-    char uniqueKey[UniqueFilePathSize];
-    BOOL result;
-
-    ASSERT(object);
-    ASSERT(key);
-
-    UniqueFilePathForKey(key, uniqueKey);
-
-    LOG(FileDatabaseActivity, "%@ - %s", key, uniqueKey);
-
-    data = [NSMutableData data];
-    archiver = [[NSArchiver alloc] initForWritingWithMutableData:data];
-    [archiver encodeObject:key];
-    [archiver encodeObject:object];
-    
-    attributes = [NSDictionary dictionaryWithObjectsAndKeys:
-        NSUserName(), NSFileOwnerAccountName,
-        WebFilePOSIXPermissions, NSFilePosixPermissions,
-        NULL
-    ];
-
-    directoryAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
-        NSUserName(), NSFileOwnerAccountName,
-        WebFileDirectoryPOSIXPermissions, NSFilePosixPermissions,
-        NULL
-    ];
-
-    defaultManager = [NSFileManager defaultManager];
-
-    filePath = [[NSString alloc] initWithFormat:@"%@/%s", path, uniqueKey];
-    attributes = [defaultManager fileAttributesAtPath:filePath traverseLink:YES];
-
-    // update usage and truncate before writing file
-    // this has the effect of _always_ keeping disk usage under sizeLimit by clearing away space in anticipation of the write.
-    WebLRUFileListSetFileData(lru, uniqueKey, [data length], CFAbsoluteTimeGetCurrent());
-    [self _truncateToSizeLimit:[self sizeLimit]];
-
-    result = [defaultManager _webkit_createFileAtPathWithIntermediateDirectories:filePath contents:data attributes:attributes directoryAttributes:directoryAttributes];
-
-    if (!result) {
-        WebLRUFileListRemoveFileWithPath(lru, uniqueKey);
-    }
-
-    [archiver release];
-    [filePath release];    
-}
-
--(void)performRemoveObjectForKey:(id)key
-{
-    NSString *filePath;
-    char uniqueKey[UniqueFilePathSize];
-    
-    ASSERT(key);
-
-    LOG(FileDatabaseActivity, "%@", key);
-
-    UniqueFilePathForKey(key, uniqueKey);
-    filePath = [[NSString alloc] initWithFormat:@"%@/%s", path, uniqueKey];
-    [[NSFileManager defaultManager] _webkit_removeFileOnlyAtPath:filePath];
-    WebLRUFileListRemoveFileWithPath(lru, uniqueKey);
-    [filePath release];
-}
-
-// database management functions ---------------------------------------------------------------------------
-#pragma mark database management functions
-
--(void)open
-{
-    NSFileManager *manager;
-    NSDictionary *attributes;
-    BOOL isDir;
-    
-    if (!isOpen) {
-        manager = [NSFileManager defaultManager];
-        if ([manager fileExistsAtPath:path isDirectory:&isDir]) {
-            if (isDir) {
-                isOpen = YES;
-            }
-        }
-        else {
-            attributes = [NSDictionary dictionaryWithObjectsAndKeys:
-                [NSDate date], @"NSFileModificationDate",
-                NSUserName(), @"NSFileOwnerAccountName",
-                WebFileDirectoryPOSIXPermissions, @"NSFilePosixPermissions",
-                NULL
-            ];
-            
-            isOpen = [manager _webkit_createDirectoryAtPathWithIntermediateDirectories:path attributes:attributes];
-        }
-
-        // remove any leftover turds
-        [manager _webkit_backgroundRemoveLeftoverFiles:path];
-        
-        if (isOpen) {
-            [NSThread detachNewThreadSelector:@selector(_createLRUList:) toTarget:self withObject:nil];
-        }
-    }
-}
-
--(void)close
-{
-    if (isOpen) {
-        isOpen = NO;
-        if (lru) {
-            WebLRUFileListRelease(lru);
-            lru = NULL;
-        }
-    }
-}
-
--(void)lazySync:(NSTimer *)theTimer
-{
-    if (!lru) {
-        // wait for lru to finish getting created        
-        return;
-    }
-
-#ifndef NDEBUG
-    CFTimeInterval mark = CFAbsoluteTimeGetCurrent();
-#endif
-
-    LOG(FileDatabaseActivity, ">>> BEFORE lazySync\n%@", WebLRUFileListDescription(lru));
-
-    WebFileDatabaseOp *op;
-
-    ASSERT(theTimer);
-
-    while (touch + SYNC_IDLE_THRESHOLD < CFAbsoluteTimeGetCurrent() && [ops count] > 0) {
-        [mutex lock];
-
-        if (timer) {
-            [timer invalidate];
-            [timer autorelease];
-            timer = nil;
-        }
-        
-        op = [ops lastObject];
-        if (op) {
-            [op retain];
-            [ops removeLastObject];
-            [op perform:self];
-            [setCache removeObjectForKey:[op key]];
-            [removeCache removeObject:[op key]];
-            [op release];
-        }
-
-        [mutex unlock];
-    }
-
-    // come back later to finish the work...
-    if ([ops count] > 0) {
-        [mutex lock];
-        [self setTimer];
-        [mutex unlock];
-    }
-
-#ifndef NDEBUG
-    if (lru)
-        LOG(FileDatabaseActivity, "<<< AFTER lazySync\n%@", WebLRUFileListDescription(lru));
-
-    CFTimeInterval now = CFAbsoluteTimeGetCurrent();
-    LOG(FileDatabaseActivity, "lazySync ran in %.3f secs.", now - mark);
-#endif
-}
-
--(void)sync
-{
-    NSArray *array;
-
-    if (!lru) {
-        // wait for lru to finish getting created        
-        return;
-    }
-
-    touch = CFAbsoluteTimeGetCurrent();
-
-    LOG(FileDatabaseActivity, ">>> BEFORE sync\n%@", WebLRUFileListDescription(lru));
-    
-    [mutex lock];
-    array = [ops copy];
-    [ops removeAllObjects];
-    [timer invalidate];
-    [timer autorelease];
-    timer = nil;
-    [setCache removeAllObjects];
-    [removeCache removeAllObjects];
-    [mutex unlock];
-
-    [array makeObjectsPerformSelector:@selector(perform:) withObject:self];
-    [array release];
-
-    LOG(FileDatabaseActivity, "<<< AFTER sync\n%@", WebLRUFileListDescription(lru));
-}
-
--(NSString *)path
-{
-    return path;
-}
-
--(BOOL)isOpen
-{
-    return isOpen;
-}
-
--(unsigned)sizeLimit
-{
-    return sizeLimit;
-}
-
--(unsigned)count
-{
-    if (lru)
-        return WebLRUFileListCountItems(lru);
-    
-    return 0;
-}
-
--(unsigned)usage
-{
-    if (lru)
-        return WebLRUFileListGetTotalSize(lru);
-    
-    return 0;
-}
-
--(void)setSizeLimit:(unsigned)limit
-{
-    sizeLimit = limit;
-    if (limit < [self usage]) {
-        [self _truncateToSizeLimit:limit];
-    }
-}
-
-
-
-@end
index 56467993c9d2b4f9577e4f9e8a5e4d44cbfa1fe5..730302b8b7e7f1d7780d2363763dc2566051d876 100644 (file)
@@ -28,7 +28,6 @@
 #import <WebKit/WebIconDatabase.h>
 
 #import <WebKit/WebIconDatabasePrivate.h>
-#import <WebKit/WebFileDatabase.h>
 #import <WebKit/WebKitLogging.h>
 #import <WebKit/WebKitNSStringExtras.h>
 #import <WebKit/WebNSURLExtras.h>
 NSString * const WebIconDatabaseVersionKey =    @"WebIconDatabaseVersion";
 NSString * const WebURLToIconURLKey =           @"WebSiteURLToIconURLKey";
 
-NSString * const ObsoleteIconsOnDiskKey =       @"WebIconsOnDisk";
-NSString * const ObsoleteIconURLToURLsKey =     @"WebIconURLToSiteURLs";
-
-static const int WebIconDatabaseCurrentVersion = 2;
-
 NSString *WebIconDatabaseDidAddIconNotification =          @"WebIconDatabaseDidAddIconNotification";
 NSString *WebIconNotificationUserInfoURLKey =              @"WebIconNotificationUserInfoURLKey";
 NSString *WebIconDatabaseDidRemoveAllIconsNotification =   @"WebIconDatabaseDidRemoveAllIconsNotification";
@@ -59,21 +53,15 @@ NSSize WebIconSmallSize = {16, 16};
 NSSize WebIconMediumSize = {32, 32};
 NSSize WebIconLargeSize = {128, 128};
 
-@interface NSMutableDictionary (WebIconDatabase)
-- (void)_web_setObjectUsingSetIfNecessary:(id)object forKey:(id)key;
-@end
+#define UniqueFilePathSize (34)
 
 @interface WebIconDatabase (WebInternal)
-- (void)_clearDictionaries;
-- (void)_createFileDatabase;
-- (void)_loadIconDictionaries;
 - (NSImage *)_iconForFileURL:(NSString *)fileURL withSize:(NSSize)size;
 - (void)_resetCachedWebPreferences:(NSNotification *)notification;
 - (NSImage *)_largestIconFromDictionary:(NSMutableDictionary *)icons;
 - (NSMutableDictionary *)_iconsBySplittingRepresentationsOfIcon:(NSImage *)icon;
 - (NSImage *)_iconFromDictionary:(NSMutableDictionary *)icons forSize:(NSSize)size cache:(BOOL)cache;
 - (void)_scaleIcon:(NSImage *)icon toSize:(NSSize)size;
-- (NSData *)_iconDataForIconURL:(NSString *)iconURLString;
 - (void)_convertToWebCoreFormat; 
 @end
 
@@ -82,66 +70,52 @@ NSSize WebIconLargeSize = {128, 128};
 + (WebIconDatabase *)sharedIconDatabase
 {
     static WebIconDatabase *database = nil;
-    
-    if (!database) {
-#if !LOG_DISABLED
-        double start = CFAbsoluteTimeGetCurrent();
-#endif
+    if (!database)
         database = [[WebIconDatabase alloc] init];
-#if !LOG_DISABLED
-        LOG(Timing, "initializing icon database with %d sites and %d icons took %f", 
-            [database->_private->pageURLToIconURL count], [database->_private->iconURLToPageURLs count], (CFAbsoluteTimeGetCurrent() - start));
-#endif
-    }
     return database;
 }
 
-
 - init
 {
     [super init];
     
     _private = [[WebIconDatabasePrivate alloc] init];
 
+    // Check the user defaults and see if the icon database should even be enabled if not, we can bail from init right here
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     NSDictionary *initialDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], WebIconDatabaseEnabledDefaultsKey, nil];
     [defaults registerDefaults:initialDefaults];
     [initialDefaults release];
     if (![defaults boolForKey:WebIconDatabaseEnabledDefaultsKey]) {
+        _private->databaseBridge = nil;
         return self;
     }
-    
-    [self _createFileDatabase];
-    
-    _private->iconURLToIcons = [[NSMutableDictionary alloc] init];
-    _private->iconURLToExtraRetainCount = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, NULL);
-    _private->pageURLToRetainCount = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, NULL);
-    _private->iconsToEraseWithURLs = [[NSMutableSet alloc] init];
-    _private->iconsToSaveWithURLs = [[NSMutableSet alloc] init];
-    _private->iconURLsWithNoIcons = [[NSMutableSet alloc] init];
-    _private->iconURLsBoundDuringPrivateBrowsing = [[NSMutableSet alloc] init];
-    _private->pageURLsBoundDuringPrivateBrowsing = [[NSMutableSet alloc] init];
-    _private->privateBrowsingEnabled = [[WebPreferences standardPreferences] privateBrowsingEnabled];
-    
-    [self _loadIconDictionaries];
-
-#ifdef ICONDEBUG
+        
+    // Get/create the shared database bridge - bail if we fail
     _private->databaseBridge = [WebIconDatabaseBridge sharedBridgeInstance];
-    if (_private->databaseBridge) {
-        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-        NSString *databaseDirectory = [defaults objectForKey:WebIconDatabaseDirectoryDefaultsKey];
-
-        if (!databaseDirectory) {
-            databaseDirectory = WebIconDatabasePath;
-            [defaults setObject:databaseDirectory forKey:WebIconDatabaseDirectoryDefaultsKey];
-        }
-        databaseDirectory = [databaseDirectory stringByExpandingTildeInPath];
-        [_private->databaseBridge openSharedDatabaseWithPath:databaseDirectory];
+    if (!_private->databaseBridge) {
+        LOG_ERROR("Unable to create IconDatabaseBridge");
+        return self;
     }
     
+    // Figure out the directory we should be using for the icon.db
+    NSString *databaseDirectory = [defaults objectForKey:WebIconDatabaseDirectoryDefaultsKey];
+    if (!databaseDirectory) {
+        databaseDirectory = WebIconDatabasePath;
+        [defaults setObject:databaseDirectory forKey:WebIconDatabaseDirectoryDefaultsKey];
+    }
+    databaseDirectory = [databaseDirectory stringByExpandingTildeInPath];
+    
+    // Open the WebCore icon database
+    [_private->databaseBridge openSharedDatabaseWithPath:databaseDirectory];
+    [_private->databaseBridge setPrivateBrowsingEnabled:[[WebPreferences standardPreferences] privateBrowsingEnabled]];
+    
+    // <rdar://problem/4674552> New IconDB: New Safari icon database needs to convert from the old icons on first load 
+    // We call this method on each load - it determines, on its own, whether or not we actually need to do the conversion and 
+    // returns early if the conversion is already done
     [self _convertToWebCoreFormat];
-#endif
     
+    // Register for important notifications
     [[NSNotificationCenter defaultCenter] addObserver:self
                                              selector:@selector(_applicationWillTerminate:)
                                                  name:NSApplicationWillTerminateNotification
@@ -149,10 +123,6 @@ NSSize WebIconLargeSize = {128, 128};
     [[NSNotificationCenter defaultCenter] 
             addObserver:self selector:@selector(_resetCachedWebPreferences:) 
                    name:WebPreferencesChangedNotification object:nil];
-                   
-    // FIXME - Once the new iconDB is the only game in town, we need to remove any of the WebFileDatabase code
-    // that is threaded and expects certain files to exist - certain files we rip right out from underneath it
-    // in the _convertToWebCoreFormat method
 
     return self;
 }
@@ -165,14 +135,12 @@ NSSize WebIconLargeSize = {128, 128};
     if (!URL || ![self _isEnabled])
         return [self defaultIconWithSize:size];
 
-    // <rdar://problem/4697934> - Move the handling of FileURLs to WebCore and implement in ObjC++
+    // FIXME - <rdar://problem/4697934> - Move the handling of FileURLs to WebCore and implement in ObjC++
     if ([URL _webkit_isFileURL])
         return [self _iconForFileURL:URL withSize:size];
-
-#ifdef ICONDEBUG        
+      
     NSImage* image = [_private->databaseBridge iconForPageURL:URL withSize:size];
     return image ? image : [self defaultIconWithSize:size];
-#endif
 }
 
 - (NSImage *)iconForURL:(NSString *)URL withSize:(NSSize)size
@@ -185,10 +153,8 @@ NSSize WebIconLargeSize = {128, 128};
     if (![self _isEnabled])
         return nil;
         
-#ifdef ICONDEBUG
     NSString* iconurl = [_private->databaseBridge iconURLForPageURL:URL];
     return iconurl;
-#endif
 }
 
 - (NSImage *)defaultIconWithSize:(NSSize)size
@@ -196,9 +162,7 @@ NSSize WebIconLargeSize = {128, 128};
     ASSERT(size.width);
     ASSERT(size.height);
     
-#ifdef ICONDEBUG
     return [_private->databaseBridge defaultIconWithSize:size];
-#endif
 }
 
 - (void)retainIconForURL:(NSString *)URL
@@ -207,10 +171,7 @@ NSSize WebIconLargeSize = {128, 128};
     if (![self _isEnabled])
         return;
 
-#ifdef ICONDEBUG
     [_private->databaseBridge retainIconForURL:URL];
-    return;
-#endif
 }
 
 - (void)releaseIconForURL:(NSString *)pageURL
@@ -219,10 +180,7 @@ NSSize WebIconLargeSize = {128, 128};
     if (![self _isEnabled])
         return;
 
-#ifdef ICONDEBUG
     [_private->databaseBridge releaseIconForURL:pageURL];
-    return;
-#endif
 }
 @end
 
@@ -246,7 +204,8 @@ NSSize WebIconLargeSize = {128, 128};
 
 - (BOOL)_isEnabled
 {
-    return (_private->fileDatabase != nil);
+    // If we weren't enabled on startup, we marked the databaseBridge as nil
+    return _private->databaseBridge != nil;
 }
 
 - (void)_setIconData:(NSData *)data forIconURL:(NSString *)iconURL
@@ -254,7 +213,7 @@ NSSize WebIconLargeSize = {128, 128};
     ASSERT(data);
     ASSERT(iconURL);
     ASSERT([self _isEnabled]);   
-    
+
     [_private->databaseBridge _setIconData:data forIconURL:iconURL];
 }
 
@@ -263,20 +222,15 @@ NSSize WebIconLargeSize = {128, 128};
     ASSERT(iconURL);
     ASSERT([self _isEnabled]);
 
-#ifdef ICONDEBUG
     [_private->databaseBridge _setHaveNoIconForIconURL:iconURL];
-    return;
-#endif
 }
 
-
 - (void)_setIconURL:(NSString *)iconURL forURL:(NSString *)URL
 {
     ASSERT(iconURL);
     ASSERT(URL);
     ASSERT([self _isEnabled]);
     
-#ifdef ICONDEBUG
     // FIXME - The following comment is a holdover from the old icon DB, which handled missing icons
     // differently than the new db.  It would return early if the icon is in the negative cache,
     // avoiding the notification.  We should explore and see if a similar optimization can take place-
@@ -293,17 +247,13 @@ NSSize WebIconLargeSize = {128, 128};
     
     [_private->databaseBridge _setIconURL:iconURL forPageURL:URL];
     [self _sendNotificationForURL:URL];
-    return;
-#endif
 }
 
 - (BOOL)_hasEntryForIconURL:(NSString *)iconURL;
 {
     ASSERT([self _isEnabled]);
 
-#ifdef ICONDEBUG
     return [_private->databaseBridge _hasEntryForIconURL:iconURL];
-#endif
 }
 
 - (void)_sendNotificationForURL:(NSString *)URL
@@ -326,115 +276,11 @@ NSSize WebIconLargeSize = {128, 128};
 
 @implementation WebIconDatabase (WebInternal)
 
-- (void)_createFileDatabase
-{
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-    NSString *databaseDirectory = [defaults objectForKey:WebIconDatabaseDirectoryDefaultsKey];
-
-    if (!databaseDirectory) {
-        databaseDirectory = WebIconDatabasePath;
-        [defaults setObject:databaseDirectory forKey:WebIconDatabaseDirectoryDefaultsKey];
-    }
-    databaseDirectory = [databaseDirectory stringByExpandingTildeInPath];
-    
-    _private->fileDatabase = [[WebFileDatabase alloc] initWithPath:databaseDirectory];
-    [_private->fileDatabase setSizeLimit:20000000];
-    [_private->fileDatabase open];
-}
-
-- (void)_clearDictionaries
-{
-    [_private->pageURLToIconURL release];
-    [_private->iconURLToPageURLs release];
-    [_private->iconsOnDiskWithURLs release];
-    [_private->originalIconsOnDiskWithURLs release];
-    [_private->iconURLsBoundDuringPrivateBrowsing release];
-    [_private->pageURLsBoundDuringPrivateBrowsing release];
-    _private->pageURLToIconURL = [[NSMutableDictionary alloc] init];
-    _private->iconURLToPageURLs = [[NSMutableDictionary alloc] init];
-    _private->iconsOnDiskWithURLs = [[NSMutableSet alloc] init];
-    _private->originalIconsOnDiskWithURLs = [[NSMutableSet alloc] init];
-    _private->iconURLsBoundDuringPrivateBrowsing = [[NSMutableSet alloc] init];
-    _private->pageURLsBoundDuringPrivateBrowsing = [[NSMutableSet alloc] init];
-}
-
-- (void)_loadIconDictionaries
-{
-    WebFileDatabase *fileDB = _private->fileDatabase;
-    
-    // fileDB should be non-nil here because it should have been created by _createFileDatabase 
-    if (!fileDB) {
-        LOG_ERROR("Couldn't load icon dictionaries because file database didn't exist");
-        return;
-    }
-    
-    NSNumber *version = [fileDB objectForKey:WebIconDatabaseVersionKey];
-    int v = 0;
-    // no version means first version
-    if (version == nil) {
-        v = 1;
-    } else if ([version isKindOfClass:[NSNumber class]]) {
-        v = [version intValue];
-    }
-    
-    // Get the site URL to icon URL dictionary from the file DB.
-    NSMutableDictionary *pageURLToIconURL = nil;
-    if (v <= WebIconDatabaseCurrentVersion) {
-        pageURLToIconURL = [fileDB objectForKey:WebURLToIconURLKey];
-        // Remove the old unnecessary mapping files.
-        if (v < WebIconDatabaseCurrentVersion) {
-            [fileDB removeObjectForKey:ObsoleteIconsOnDiskKey];
-            [fileDB removeObjectForKey:ObsoleteIconURLToURLsKey];
-        }        
-    }
-    
-    // Must double-check all values read from disk. If any are bogus, we just throw out the whole icon cache.
-    // We expect this to be nil if the icon cache has been cleared, so we shouldn't whine in that case.
-    if (![pageURLToIconURL isKindOfClass:[NSMutableDictionary class]]) {
-        if (pageURLToIconURL)
-            LOG_ERROR("Clearing icon cache because bad value %@ was found on disk, expected an NSMutableDictionary", pageURLToIconURL);
-        [self _clearDictionaries];
-        return;
-    }
-
-    // Keep a set of icon URLs on disk so we know what we need to write out or remove.
-    NSMutableSet *iconsOnDiskWithURLs = [NSMutableSet setWithArray:[pageURLToIconURL allValues]];
-
-    // Reverse pageURLToIconURL so we have an icon URL to page URLs dictionary. 
-    NSMutableDictionary *iconURLToPageURLs = [NSMutableDictionary dictionaryWithCapacity:[_private->iconsOnDiskWithURLs count]];
-    NSEnumerator *enumerator = [pageURLToIconURL keyEnumerator];
-    NSString *URL;
-    while ((URL = [enumerator nextObject])) {
-        NSString *iconURL = (NSString *)[pageURLToIconURL objectForKey:URL];
-        // Must double-check all values read from disk. If any are bogus, we just throw out the whole icon cache.
-        if (![URL isKindOfClass:[NSString class]] || ![iconURL isKindOfClass:[NSString class]]) {
-            LOG_ERROR("Clearing icon cache because either %@ or %@ was a bad value on disk, expected both to be NSStrings", URL, iconURL);
-            [self _clearDictionaries];
-            return;
-        }
-        [iconURLToPageURLs _web_setObjectUsingSetIfNecessary:URL forKey:iconURL];
-    }
-
-    ASSERT(!_private->pageURLToIconURL);
-    ASSERT(!_private->iconURLToPageURLs);
-    ASSERT(!_private->iconsOnDiskWithURLs);
-    ASSERT(!_private->originalIconsOnDiskWithURLs);
-    
-    _private->pageURLToIconURL = [pageURLToIconURL retain];
-    _private->iconURLToPageURLs = [iconURLToPageURLs retain];
-    _private->iconsOnDiskWithURLs = [iconsOnDiskWithURLs retain];
-    _private->originalIconsOnDiskWithURLs = [iconsOnDiskWithURLs copy];
-}
-
-
-
 - (void)_applicationWillTerminate:(NSNotification *)notification
 {
-#ifdef ICONDEBUG
     [_private->databaseBridge closeSharedDatabase];
     [_private->databaseBridge release];
     _private->databaseBridge = nil;
-#endif
 }
 
 
@@ -471,10 +317,7 @@ NSSize WebIconLargeSize = {128, 128};
 {
     BOOL privateBrowsingEnabledNow = [[WebPreferences standardPreferences] privateBrowsingEnabled];
 
-#ifdef ICONDEBUG
     [_private->databaseBridge setPrivateBrowsingEnabled:privateBrowsingEnabledNow];
-    return;
-#endif
 }
 
 - (NSImage *)_largestIconFromDictionary:(NSMutableDictionary *)icons
@@ -558,11 +401,91 @@ NSSize WebIconLargeSize = {128, 128};
 #endif
 }
 
-- (NSData *)_iconDataForIconURL:(NSString *)iconURLString
+// This hashing String->filename algorithm came from WebFileDatabase.m and is what was used in the 
+// WebKit Icon Database
+static void legacyIconDatabaseFilePathForKey(id key, char *buffer)
+{
+    const char *s;
+    UInt32 hash1;
+    UInt32 hash2;
+    CFIndex len;
+    CFIndex cnt;
+    
+    s = [[[[key description] lowercaseString] stringByStandardizingPath] UTF8String];
+    len = strlen(s);
+
+    // compute first hash    
+    hash1 = len;
+    for (cnt = 0; cnt < len; cnt++) {
+        hash1 += (hash1 << 8) + s[cnt];
+    }
+    hash1 += (hash1 << (len & 31));
+
+    // compute second hash    
+    hash2 = len;
+    for (cnt = 0; cnt < len; cnt++) {
+        hash2 = (37 * hash2) ^ s[cnt];
+    }
+
+#ifdef __LP64__
+    snprintf(buffer, UniqueFilePathSize, "%.2u/%.2u/%.10u-%.10u.cache", ((hash1 & 0xff) >> 4), ((hash2 & 0xff) >> 4), hash1, hash2);
+#else
+    snprintf(buffer, UniqueFilePathSize, "%.2lu/%.2lu/%.10lu-%.10lu.cache", ((hash1 & 0xff) >> 4), ((hash2 & 0xff) >> 4), hash1, hash2);
+#endif
+}
+
+// This method of getting an object from the filesystem is taken from the old 
+// WebKit Icon Database
+static id objectFromPathForKey(NSString *databasePath, id key)
+{
+    ASSERT(key);
+    id result = nil;
+
+    // Use the key->filename hashing the old WebKit IconDatabase used
+    char uniqueKey[UniqueFilePathSize];    
+    legacyIconDatabaseFilePathForKey(key, uniqueKey);
+    
+    // Get the data from this file and setup for the un-archiving
+    NSString *filePath = [[NSString alloc] initWithFormat:@"%@/%s", databasePath, uniqueKey];
+    NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
+    NSUnarchiver *unarchiver = nil;
+    
+    NS_DURING
+        if (data) {
+            unarchiver = [[NSUnarchiver alloc] initForReadingWithData:data];
+            if (unarchiver) {
+                id fileKey = [unarchiver decodeObject];
+                NSLog(@"%@", fileKey);
+                if ([fileKey isEqual:key]) {
+                    id object = [unarchiver decodeObject];
+                    NSLog(@"%@", object);
+                    if (object) {
+                        // Decoded objects go away when the unarchiver does, so we need to
+                        // retain this so we can return it to our caller.
+                        result = [[object retain] autorelease];
+                        LOG(IconDatabase, "read disk cache file - %@", key);
+                    }
+                }
+            }
+        }
+    NS_HANDLER
+        LOG(IconDatabase, "cannot unarchive cache file - %@", key);
+        result = nil;
+    NS_ENDHANDLER
+
+    [unarchiver release];
+    [data release];
+    [filePath release];
+    
+    return result;
+}
+
+static NSData* iconDataFromPathForIconURL(NSString *databasePath, NSString *iconURLString)
 {
     ASSERT(iconURLString);
+    ASSERT(databasePath);
     
-    NSData *iconData = [_private->fileDatabase objectForKey:iconURLString];
+    NSData *iconData = objectFromPathForKey(databasePath, iconURLString);
     
     if ((id)iconData == (id)[NSNull null]) 
         return nil;
@@ -575,28 +498,49 @@ NSSize WebIconLargeSize = {128, 128};
     ASSERT(_private);
     ASSERT(_private->databaseBridge);
     
+    
     // If the WebCore Icon Database is not empty, we assume that this conversion has already
     // taken place and skip the rest of the steps 
-    if (![_private->databaseBridge _isEmpty])
+    if (![_private->databaseBridge _isEmpty]) {
         return;
-                
-    NSEnumerator *enumerator = [_private->pageURLToIconURL keyEnumerator];
+    }
+
+    // Get the directory the old icon database *should* be in
+    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+    NSString *databaseDirectory = [defaults objectForKey:WebIconDatabaseDirectoryDefaultsKey];
+    if (!databaseDirectory) {
+        databaseDirectory = WebIconDatabasePath;
+        [defaults setObject:databaseDirectory forKey:WebIconDatabaseDirectoryDefaultsKey];
+    }
+    databaseDirectory = [databaseDirectory stringByExpandingTildeInPath];
+
+    // With this directory, get the PageURLToIconURL map that was saved to disk
+    NSMutableDictionary *pageURLToIconURL = objectFromPathForKey(databaseDirectory, WebURLToIconURLKey);
+
+    // If the retrieved object was not a valid NSMutableDictionary, then we have no valid
+    // icons to convert
+    if (![pageURLToIconURL isKindOfClass:[NSMutableDictionary class]])
+        pageURLToIconURL = nil;
+    
+    NSEnumerator *enumerator = [pageURLToIconURL keyEnumerator];
     NSString *url, *iconURL;
     
     // First, we'll iterate through the PageURL->IconURL map
     while ((url = [enumerator nextObject]) != nil) {
-        iconURL = [_private->pageURLToIconURL objectForKey:url];
+        iconURL = [pageURLToIconURL objectForKey:url];
         if (!iconURL)
             continue;
         [_private->databaseBridge _setIconURL:iconURL forPageURL:url];
     }    
-    
-    // Second, we'll iterate through the icon data we do have
-    enumerator = [_private->iconsOnDiskWithURLs objectEnumerator];
+
+    // Second, we'll get a list of the unique IconURLs we have
+    NSMutableSet *iconsOnDiskWithURLs = [NSMutableSet setWithArray:[pageURLToIconURL allValues]];
+    enumerator = [iconsOnDiskWithURLs objectEnumerator];
     NSData *iconData;
     
+    // And iterate through them, adding the icon data to the new icon database
     while ((url = [enumerator nextObject]) != nil) {
-        iconData = [self _iconDataForIconURL:url];
+        iconData = iconDataFromPathForIconURL(databaseDirectory, url);
         if (iconData)
             [_private->databaseBridge _setIconData:iconData forIconURL:url];
         else {
@@ -606,21 +550,11 @@ NSSize WebIconLargeSize = {128, 128};
             [_private->databaseBridge _setHaveNoIconForIconURL:url];
         }
     }
-    
-    // Finally, we'll iterate through the negative cache we have
-    enumerator = [_private->iconURLsWithNoIcons objectEnumerator];
-    while ((url = [enumerator nextObject]) != nil) 
-        [_private->databaseBridge _setHaveNoIconForIconURL:url];
-   
+
     // After we're done converting old style icons over to webcore icons, we delete the entire directory hierarchy 
-    // for the old icon DB
-    NSString *iconPath = [[NSUserDefaults standardUserDefaults] objectForKey:WebIconDatabaseDirectoryDefaultsKey];
-    if (!iconPath)
-        iconPath = WebIconDatabasePath;
-    
-    NSString *fullIconPath = [iconPath stringByExpandingTildeInPath];    
+    // for the old icon DB (skipping the new iconDB, which will likely be in the same directory)
     NSFileManager *fileManager = [NSFileManager defaultManager];
-    enumerator = [[fileManager directoryContentsAtPath:fullIconPath] objectEnumerator];
+    enumerator = [[fileManager directoryContentsAtPath:databaseDirectory] objectEnumerator];
     
     NSString *databaseFilename = [_private->databaseBridge defaultDatabaseFilename];
 
@@ -628,7 +562,7 @@ NSSize WebIconLargeSize = {128, 128};
     while ((file = [enumerator nextObject]) != nil) {
         if ([file isEqualTo:databaseFilename])
             continue;
-        NSString *filePath = [fullIconPath stringByAppendingPathComponent:file];
+        NSString *filePath = [databaseDirectory stringByAppendingPathComponent:file];
         if (![fileManager  removeFileAtPath:filePath handler:nil])
             LOG_ERROR("Failed to delete %@ from old icon directory", filePath);
     }
@@ -636,24 +570,7 @@ NSSize WebIconLargeSize = {128, 128};
 
 @end
 
+// This empty implementation must exist 
 @implementation WebIconDatabasePrivate
-
 @end
 
-@implementation NSMutableDictionary (WebIconDatabase)
-
-- (void)_web_setObjectUsingSetIfNecessary:(id)object forKey:(id)key
-{
-    id previousObject = [self objectForKey:key];
-    if (previousObject == nil) {
-        [self setObject:object forKey:key];
-    } else if ([previousObject isKindOfClass:[NSMutableSet class]]) {
-        [previousObject addObject:object];
-    } else {
-        NSMutableSet *objects = [[NSMutableSet alloc] initWithObjects:previousObject, object, nil];
-        [self setObject:objects forKey:key];
-        [objects release];
-    }
-}
-
-@end
index 3c8dd5e3efbe85e925a972f8927997da269fa069..4afe9ef895c49e3a0664b48af570a2bc31bf67f4 100644 (file)
 @interface WebIconDatabasePrivate : NSObject {
 
 @public
-    WebFileDatabase *fileDatabase;
     WebCoreIconDatabaseBridge *databaseBridge;
-
-    NSMutableDictionary *iconURLToIcons;
-    NSMutableDictionary *iconURLToPageURLs;
-    NSMutableDictionary *pageURLToIconURL;
-    CFMutableDictionaryRef pageURLToRetainCount;
-    CFMutableDictionaryRef iconURLToExtraRetainCount;
-    
-    NSMutableSet *iconsOnDiskWithURLs;
-    NSMutableSet *iconsToEraseWithURLs;
-    NSMutableSet *iconsToSaveWithURLs;
-    NSMutableSet *iconURLsWithNoIcons;
-    NSMutableSet *originalIconsOnDiskWithURLs;
-    NSMutableSet *pageURLsBoundDuringPrivateBrowsing;
-    NSMutableSet *iconURLsBoundDuringPrivateBrowsing;
     
-    int cleanupCount;
-
-    BOOL didCleanup;
-    BOOL waitingToCleanup;
-    BOOL privateBrowsingEnabled;
-
     NSMutableDictionary *htmlIcons;
     NSMutableDictionary *defaultIcons;
 }
diff --git a/WebKit/Misc/WebLRUFileList.h b/WebKit/Misc/WebLRUFileList.h
deleted file mode 100644 (file)
index 2926efa..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import <CoreFoundation/CoreFoundation.h>
-
-typedef struct WebLRUFileList WebLRUFileList;
-
-WebLRUFileList *WebLRUFileListCreate(void);
-void WebLRUFileListRelease(WebLRUFileList *list);
-
-int WebLRUFileListRebuildFileDataUsingRootDirectory(WebLRUFileList *list, const char *path);
-
-unsigned int WebLRUFileListRemoveFileWithPath(WebLRUFileList *list, const char *path);
-void WebLRUFileListTouchFileWithPath(WebLRUFileList *list, const char *path);
-void WebLRUFileListSetFileData(WebLRUFileList *list, const char *path, unsigned long fileSize, CFTimeInterval time);
-
-Boolean WebLRUFileListGetPathOfOldestFile(WebLRUFileList *list, char *buffer, unsigned int length);
-unsigned int WebLRUFileListRemoveOldestFileFromList(WebLRUFileList *list);
-
-Boolean WebLRUFileListContainsItem(WebLRUFileList *list, const char *path);
-unsigned int WebLRUFileListGetFileSize(WebLRUFileList *list, const char *path);
-unsigned int WebLRUFileListCountItems(WebLRUFileList *list);
-unsigned int WebLRUFileListGetTotalSize(WebLRUFileList *list);
-void WebLRUFileListRemoveAllFilesFromList(WebLRUFileList *list);
-
-NSString *WebLRUFileListDescription(WebLRUFileList *list);
diff --git a/WebKit/Misc/WebLRUFileList.m b/WebKit/Misc/WebLRUFileList.m
deleted file mode 100644 (file)
index b5d0220..0000000
+++ /dev/null
@@ -1,481 +0,0 @@
-/*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission. 
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#import <JavaScriptCore/Assertions.h>
-#import <WebKit/WebKitLogging.h>
-#import <WebKit/WebLRUFileList.h>
-
-#import <stdlib.h>
-#import <sys/types.h>
-#import <sys/stat.h>
-#import <fts.h>
-
-#define RemoveFromHeap (TRUE)
-#define DontRemoveFromHeap (FALSE)
-
-struct WebLRUFileList
-{
-    char *rootDirectory;
-    CFBinaryHeapRef heap;
-    CFMutableDictionaryRef dict;
-    unsigned int count;
-    unsigned int totalSize;
-};
-
-typedef struct NSLRUFileData NSLRUFileData;
-
-struct NSLRUFileData
-{
-    unsigned long fileSize;
-    CFTimeInterval heapTime;
-    CFTimeInterval updatedTime;
-    unsigned int markRemoved;
-    char path[1]; // variable size, big enough to hold path string and trailing nul
-};
-
-static CFComparisonResult compareTimes(const void *val1, const void *val2, void *context);
-static Boolean cStringEqual(const void *val1, const void *val2);
-static CFHashCode cStringHash(const void *val);
-static Boolean NSLRUFileDataEqual(const void *val1, const void *val2);
-
-static NSLRUFileData *WebLRUFileListGetOldestFileData(WebLRUFileList *list, Boolean removeFromHeap);
-
-static void NSLRUFileDataReleaseApplierFunction(const void *key, const void *value, void *context);
-static void NSLRUFileDataRelease(CFAllocatorRef allocator, const void *value);
-
-
-WebLRUFileList *WebLRUFileListCreate(void)
-{
-    CFBinaryHeapCallBacks heapCallbacks = {0, NULL, NULL, NULL, compareTimes};
-    CFBinaryHeapCompareContext heapCompareContext = {0, NULL, NULL, NULL, NULL}; 
-    CFDictionaryKeyCallBacks dictKeyCallbacks = {0, NULL, NULL, NULL, cStringEqual, cStringHash};    
-    CFDictionaryValueCallBacks dictValCallbacks = {0, NULL, NULL, NULL, NSLRUFileDataEqual};
-    
-    WebLRUFileList *list = malloc(sizeof(WebLRUFileList));
-    
-    list->rootDirectory = NULL;
-    list->heap = CFBinaryHeapCreate(NULL, 0, &heapCallbacks, &heapCompareContext);
-    list->dict = CFDictionaryCreateMutable(NULL, 0, &dictKeyCallbacks, &dictValCallbacks);    
-    list->count = 0;
-    list->totalSize = 0;
-    
-    return list;
-}
-
-void WebLRUFileListRelease(WebLRUFileList *list)
-{
-    ASSERT(list);
-    free(list->rootDirectory);
-    WebLRUFileListRemoveAllFilesFromList(list);
-    CFRelease(list->heap);
-    CFRelease(list->dict);
-    free(list);
-}
-
-int WebLRUFileListRebuildFileDataUsingRootDirectory(WebLRUFileList *list, const char *path)
-{
-    ASSERT(list);
-    ASSERT(path);
-
-    FTS *fts;
-    FTSENT *ent;
-    char *paths[2];
-    struct stat statInfo;
-    
-    if (stat(path, &statInfo) == -1) {
-        return errno;
-    }
-    if ((statInfo.st_mode & S_IFDIR) == 0) {
-        return ENOTDIR;
-    }
-
-    WebLRUFileListRemoveAllFilesFromList(list);
-    free(list->rootDirectory);
-    list->rootDirectory = strdup(path);
-    int pathLength = strlen(path);
-    
-    paths[0] = (char *)path;
-    paths[1] = NULL;
-    
-    fts = fts_open(paths, FTS_COMFOLLOW | FTS_LOGICAL, NULL);
-    
-    while ((ent = fts_read(fts))) {
-        if (ent->fts_statp->st_mode & S_IFREG) {
-            const char *filePath = ent->fts_accpath + pathLength + 1;
-            WebLRUFileListSetFileData(list, filePath, ent->fts_statp->st_size, ent->fts_statp->st_ctimespec.tv_sec - kCFAbsoluteTimeIntervalSince1970);
-        }
-    }
-
-    fts_close(fts);
-    
-    return 0;
-}
-
-unsigned int WebLRUFileListRemoveFileWithPath(WebLRUFileList *list, const char *path)
-{
-    ASSERT(list);
-    ASSERT(path);
-
-    unsigned int removedFileSize = 0;
-
-    NSLRUFileData *data = (NSLRUFileData *)CFDictionaryGetValue(list->dict, path);
-    if (data) {
-        CFDictionaryRemoveValue(list->dict, path);
-        data->markRemoved = 1;
-        removedFileSize = data->fileSize;
-        list->totalSize -= data->fileSize;
-        ASSERT(list->count > 0);
-        list->count--;
-    }
-    
-    return removedFileSize;
-}
-
-void WebLRUFileListTouchFileWithPath(WebLRUFileList *list, const char *path)
-{
-    ASSERT(list);
-    ASSERT(path);
-
-    NSLRUFileData *data = (NSLRUFileData *)CFDictionaryGetValue(list->dict, path);
-    if (data) {
-        // This is not the same as the "real" mod time of the file on disk
-        // but it is close enough for our purposes
-        data->updatedTime = CFAbsoluteTimeGetCurrent();
-    }
-}
-
-void WebLRUFileListSetFileData(WebLRUFileList *list, const char *path, unsigned long fileSize, CFTimeInterval time)
-{
-    ASSERT(list);
-    ASSERT(path);
-
-    NSLRUFileData *data = (NSLRUFileData *)CFDictionaryGetValue(list->dict, path);
-    if (data) {
-        // update existing data
-        list->totalSize -= data->fileSize;
-        list->totalSize += fileSize;
-        data->fileSize = fileSize;
-        data->updatedTime = time;
-    }
-    else {
-        // create new data object
-        // malloc a block that can accommodate the string
-        // account for the size of the string when
-        // allocating the correct size block.
-        size_t mallocSize = offsetof(NSLRUFileData, path) + strlen(path) + 1;
-        data = malloc(mallocSize);
-        data->fileSize = fileSize;
-        data->heapTime = data->updatedTime = time;
-        data->markRemoved = 0;
-        strcpy(data->path, path);
-        list->totalSize += fileSize;
-        list->count++;
-        CFBinaryHeapAddValue(list->heap, data);
-        CFDictionarySetValue(list->dict, data->path, data);
-    }
-}
-
-Boolean WebLRUFileListGetPathOfOldestFile(WebLRUFileList *list, char *buffer, unsigned int length)
-{
-    ASSERT(list);
-
-    NSLRUFileData *data = WebLRUFileListGetOldestFileData(list, DontRemoveFromHeap);
-
-    if (data) {
-        unsigned pathLength = strlen(data->path);
-        if (length - 1 >= pathLength) {
-            strcpy(buffer, data->path);
-            return TRUE;
-        }
-    }
-    
-    return FALSE;
-}
-
-unsigned int WebLRUFileListRemoveOldestFileFromList(WebLRUFileList *list)
-{
-    ASSERT(list);
-
-    if (list->count == 0) {
-        return 0;
-    }
-
-    NSLRUFileData *data = WebLRUFileListGetOldestFileData(list, RemoveFromHeap);
-
-    if (!data) {
-        LOG_ERROR("list->count > 0, but no data returned from WebLRUFileListGetOldestFileData");
-    }
-    
-    // no need to remove from heap explicitly
-    // WebLRUFileListGetOldestFileData with RemoveFromHeap call does that
-    CFDictionaryRemoveValue(list->dict, data->path);
-    ASSERT(list->count > 0);
-    list->count--;
-    unsigned int removedFileSize = data->fileSize;
-    list->totalSize -= removedFileSize;
-    LOG(FileDatabaseActivity, "\n\t%s : %ld : %.0f : %.0f\n", data->path, data->fileSize, data->heapTime, data->updatedTime);
-    NSLRUFileDataRelease(NULL, data);
-    return removedFileSize;
-}
-
-Boolean WebLRUFileListContainsItem(WebLRUFileList *list, const char *path)
-{
-    ASSERT(list);
-    ASSERT(path);
-
-    if (list->count == 0) {
-        return FALSE;
-    }
-    
-    NSLRUFileData *data = (NSLRUFileData *)CFDictionaryGetValue(list->dict, path);
-    if (!data) {
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-unsigned int WebLRUFileListGetFileSize(WebLRUFileList *list, const char *path)
-{
-    ASSERT(list);
-    ASSERT(path);
-
-    unsigned int result = 0;
-
-    if (list->count == 0) {
-        return result;
-    }
-    
-    NSLRUFileData *data = (NSLRUFileData *)CFDictionaryGetValue(list->dict, path);
-    if (!data) {
-        LOG_ERROR("list->count > 0, but no data returned from CFDictionaryGetValue with path: %s", path);
-    }
-
-    result = data->fileSize;
-    
-    return result;
-}
-
-unsigned int WebLRUFileListCountItems(WebLRUFileList *list)
-{
-    ASSERT(list);
-    return list->count;
-}
-
-unsigned int WebLRUFileListGetTotalSize(WebLRUFileList *list)
-{
-    ASSERT(list);
-    return list->totalSize;
-}
-
-void WebLRUFileListRemoveAllFilesFromList(WebLRUFileList *list)
-{
-    ASSERT(list);
-
-    // use dictionary applier function to free all NSLRUFileData objects
-    CFDictionaryApplyFunction(list->dict, NSLRUFileDataReleaseApplierFunction, NULL);
-    
-    CFDictionaryRemoveAllValues(list->dict);
-    CFBinaryHeapRemoveAllValues(list->heap);
-    list->count = 0;
-    list->totalSize = 0;
-}
-
-static CFComparisonResult compareTimes(const void *val1, const void *val2, void *context)
-{
-    ASSERT(val1);
-    ASSERT(val2);
-
-    CFTimeInterval t1 = ((NSLRUFileData *)val1)->heapTime;
-    CFTimeInterval t2 = ((NSLRUFileData *)val2)->heapTime;
-    
-    if (t1 > t2) return kCFCompareGreaterThan;
-    if (t1 < t2) return kCFCompareLessThan;
-    return kCFCompareEqualTo;
-}
-
-static Boolean cStringEqual(const void *val1, const void *val2)
-{
-    ASSERT(val1);
-    ASSERT(val2);
-
-    const char *s1 = (const char *)val1;
-    const char *s2 = (const char *)val2;
-    return strcmp(s1, s2) == 0;
-}
-
-// Golden ratio - arbitrary start value to avoid mapping all 0's to all 0's
-// or anything like that.
-static const unsigned PHI = 0x9e3779b9U;
-
-// This hash algorithm comes from:
-// http://burtleburtle.net/bob/hash/hashfaq.html
-// http://burtleburtle.net/bob/hash/doobs.html
-static CFHashCode cStringHash(const void *val)
-{
-    ASSERT(val);
-
-    const char *s = (const char *)val;
-    int length = strlen(s);
-    int prefixLength = length < 8 ? length : 8;
-    int suffixPosition = length < 16 ? 8 : length - 8;
-    int i;
-
-    unsigned h = PHI;
-    h += length;
-    h += (h << 10); 
-    h ^= (h << 6); 
-
-    for (i = 0; i < prefixLength; i++) {
-        h += (unsigned char)s[i];
-        h += (h << 10); 
-        h ^= (h << 6); 
-    }
-    for (i = suffixPosition; i < length; i++) {
-        h += (unsigned char)s[i];
-        h += (h << 10); 
-        h ^= (h << 6); 
-    }
-
-    h += (h << 3);
-    h ^= (h >> 11);
-    h += (h << 15);
-    return h;
-}
-
-static Boolean NSLRUFileDataEqual(const void *val1, const void *val2)
-{
-    ASSERT(val1);
-    ASSERT(val2);
-
-    NSLRUFileData *d1 = (NSLRUFileData *)val1;
-    NSLRUFileData *d2 = (NSLRUFileData *)val2;
-    return (d1->fileSize == d2->fileSize &&
-        d1->heapTime == d2->heapTime && 
-        d1->updatedTime == d2->updatedTime && 
-        d1->markRemoved == d2->markRemoved &&
-        strcmp(d1->path, d2->path) == 0);
-}
-
-static NSLRUFileData *WebLRUFileListGetOldestFileData(WebLRUFileList *list, Boolean removeFromHeap)
-{
-    ASSERT(list);
-
-    // Use the heap count directory to account for the need to do lazy removal of heap objects 
-    // that may have been left over by calls to WebLRUFileListRemoveFileWithPath
-    // since whenever WebLRUFileListRemoveFileWithPath is called, 
-    // list->count and the heap's count may no longer be equal
-    unsigned int heapCount = CFBinaryHeapGetCount(list->heap);
-    if (heapCount == 0) {
-        return NULL;
-    }
-
-    unsigned i;
-    NSLRUFileData *data;
-
-    for (i = 0; i < heapCount; i++) {
-        data = (NSLRUFileData *)CFBinaryHeapGetMinimum(list->heap);
-        if (data->markRemoved) {
-            // clean up this object that was marked for removal earlier
-            CFBinaryHeapRemoveMinimumValue(list->heap);
-            NSLRUFileDataRelease(NULL, data);        
-        }
-        else if (data->heapTime != data->updatedTime) {
-            // update this object
-            // reinsert into heap
-            CFBinaryHeapRemoveMinimumValue(list->heap);
-            data->heapTime = data->updatedTime;
-            CFBinaryHeapAddValue(list->heap, data);    
-        }
-        else {
-            // found an object that was neither updated nor marked for removal
-            // return it
-            if (removeFromHeap) {
-                CFBinaryHeapRemoveMinimumValue(list->heap);
-            }
-            return data;
-        }
-    }        
-    
-    // we "wrapped around"
-    // all nodes were touched after they were added, and we are back at the start
-    // just pop off the object that is on top now.
-    data = (NSLRUFileData *)CFBinaryHeapGetMinimum(list->heap);
-    if (data && removeFromHeap) {
-        ASSERT(data->heapTime == data->updatedTime);
-        CFBinaryHeapRemoveMinimumValue(list->heap);
-    }
-    return data;
-}
-
-static void NSLRUFileDataReleaseApplierFunction(const void *key, const void *value, void *context)
-{
-    ASSERT(value);
-    free((NSLRUFileData *)value);
-}
-
-static void NSLRUFileDataRelease(CFAllocatorRef allocator, const void *value)
-{
-    ASSERT(value);
-    free((NSLRUFileData *)value);
-}
-
-// -----------------------------------------------------
-// debugging
-
-static void NSLRUFileDataBinaryHeapDumpApplierFunction(const void *value, void *context)
-{
-    NSMutableString *string = (NSMutableString *)context;
-    NSLRUFileData *data = (NSLRUFileData *)value;
-    [string appendFormat:@"   %s : %6ld : %.0f : %.0f\n", data->path, data->fileSize, data->heapTime, data->updatedTime];
-}
-
-static void NSLRUFileDataDictDumpApplierFunction(const void *key, const void *value, void *context)
-{
-    NSMutableString *string = (NSMutableString *)context;
-    NSLRUFileData *data = (NSLRUFileData *)value;
-    [string appendFormat:@"   %s -> %6ld : %.0f : %.0f\n", (const char *)key, data->fileSize, data->heapTime, data->updatedTime];
-}
-
-NSString *WebLRUFileListDescription(WebLRUFileList *list)
-{
-    NSMutableString *string = [NSMutableString string];
-
-    [string appendFormat:@"\nList root path: %s\n", list->rootDirectory];
-    [string appendFormat:@"List count: %d items\n", list->count];
-    [string appendFormat:@"List total size: %d bytes\n", list->totalSize];
-
-    [string appendFormat:@"\nHeap data: %ld items\n", CFBinaryHeapGetCount(list->heap)];
-    CFBinaryHeapApplyFunction(list->heap, NSLRUFileDataBinaryHeapDumpApplierFunction, string);
-
-    [string appendFormat:@"\nDict data: %ld items\n", CFDictionaryGetCount(list->dict)];
-    CFDictionaryApplyFunction(list->dict, NSLRUFileDataDictDumpApplierFunction, string);
-    
-    return string;
-}
index 967ee45ccd4d124cc7b4dfa71da5d512c4dbfb11..98ff1e175487a309caa9a70b37d240d603610eed 100644 (file)
                939810770824BF01008DF038 /* WebDownload.h in Headers */ = {isa = PBXBuildFile; fileRef = 6578F5DE045F817400000128 /* WebDownload.h */; settings = {ATTRIBUTES = (Public, ); }; };
                939810790824BF01008DF038 /* WebLocalizableStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = BEE18F990472B73200CA289C /* WebLocalizableStrings.h */; settings = {ATTRIBUTES = (Private, ); }; };
                9398107A0824BF01008DF038 /* WebKitSystemBits.h in Headers */ = {isa = PBXBuildFile; fileRef = BEE52D4A0473032500CA289C /* WebKitSystemBits.h */; };
-               9398107C0824BF01008DF038 /* WebFileDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = BE07CEA9047538F000CA289C /* WebFileDatabase.h */; };
-               9398107D0824BF01008DF038 /* WebLRUFileList.h in Headers */ = {isa = PBXBuildFile; fileRef = BE07CEAB047538F000CA289C /* WebLRUFileList.h */; };
                9398107E0824BF01008DF038 /* WebNSURLExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = BE6DC39904C62C4E004D0EF6 /* WebNSURLExtras.h */; settings = {ATTRIBUTES = (Private, ); }; };
                9398107F0824BF01008DF038 /* WebDocumentInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = ED21B9810528F7AA003299AC /* WebDocumentInternal.h */; };
                939810800824BF01008DF038 /* WebDocumentPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 833987810543012D00EE146E /* WebDocumentPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
                9398110B0824BF01008DF038 /* WebDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 6578F5DF045F817400000128 /* WebDownload.m */; };
                9398110D0824BF01008DF038 /* WebLocalizableStrings.m in Sources */ = {isa = PBXBuildFile; fileRef = BEE18F9A0472B73200CA289C /* WebLocalizableStrings.m */; };
                9398110E0824BF01008DF038 /* WebKitSystemBits.m in Sources */ = {isa = PBXBuildFile; fileRef = BEE52D4B0473032500CA289C /* WebKitSystemBits.m */; };
-               939811100824BF01008DF038 /* WebFileDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = BE07CEAA047538F000CA289C /* WebFileDatabase.m */; };
-               939811110824BF01008DF038 /* WebLRUFileList.m in Sources */ = {isa = PBXBuildFile; fileRef = BE07CEAC047538F000CA289C /* WebLRUFileList.m */; };
                939811120824BF01008DF038 /* WebNSURLExtras.m in Sources */ = {isa = PBXBuildFile; fileRef = BE6DC39A04C62C4E004D0EF6 /* WebNSURLExtras.m */; };
                939811130824BF01008DF038 /* WebHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = 65DA2608052CC18700A97B31 /* WebHistory.m */; };
                939811150824BF01008DF038 /* WebNSDataExtras.m in Sources */ = {isa = PBXBuildFile; fileRef = BECD142A0565830A005BB09C /* WebNSDataExtras.m */; };
                9CE1F8A302A5C6F30ECA2ACD /* WebImageRendererFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = WebImageRendererFactory.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                9CF0E249021361B00ECA16EA /* WebFramePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebFramePrivate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                ABDDF20C08EB0DDC001E1241 /* WebDownloadInternal.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebDownloadInternal.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-               BE07CEA9047538F000CA289C /* WebFileDatabase.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebFileDatabase.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-               BE07CEAA047538F000CA289C /* WebFileDatabase.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = WebFileDatabase.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-               BE07CEAB047538F000CA289C /* WebLRUFileList.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebLRUFileList.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-               BE07CEAC047538F000CA289C /* WebLRUFileList.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = WebLRUFileList.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                BE4FBECB0653DF47005EDE15 /* WebEditingDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebEditingDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                BE6DC39904C62C4E004D0EF6 /* WebNSURLExtras.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebNSURLExtras.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                BE6DC39A04C62C4E004D0EF6 /* WebNSURLExtras.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = WebNSURLExtras.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                                F528E3E9031E91AD01CA2ACA /* WebIconDatabase.h */,
                                F528E3EA031E91AD01CA2ACA /* WebIconDatabase.m */,
                                F528E3EB031E91AD01CA2ACA /* WebIconDatabasePrivate.h */,
-                               BE07CEA9047538F000CA289C /* WebFileDatabase.h */,
-                               BE07CEAA047538F000CA289C /* WebFileDatabase.m */,
-                               BE07CEAB047538F000CA289C /* WebLRUFileList.h */,
-                               BE07CEAC047538F000CA289C /* WebLRUFileList.m */,
                                2568C72C0174912D0ECA149E /* WebKit.h */,
                                F5927D4E02D26C5E01CA2DBB /* WebKitErrors.h */,
                                83730F9803FB1E660004736E /* WebKitErrors.m */,
                                939810770824BF01008DF038 /* WebDownload.h in Headers */,
                                939810790824BF01008DF038 /* WebLocalizableStrings.h in Headers */,
                                9398107A0824BF01008DF038 /* WebKitSystemBits.h in Headers */,
-                               9398107C0824BF01008DF038 /* WebFileDatabase.h in Headers */,
-                               9398107D0824BF01008DF038 /* WebLRUFileList.h in Headers */,
                                9398107E0824BF01008DF038 /* WebNSURLExtras.h in Headers */,
                                9398107F0824BF01008DF038 /* WebDocumentInternal.h in Headers */,
                                939810800824BF01008DF038 /* WebDocumentPrivate.h in Headers */,
                                9398110B0824BF01008DF038 /* WebDownload.m in Sources */,
                                9398110D0824BF01008DF038 /* WebLocalizableStrings.m in Sources */,
                                9398110E0824BF01008DF038 /* WebKitSystemBits.m in Sources */,
-                               939811100824BF01008DF038 /* WebFileDatabase.m in Sources */,
-                               939811110824BF01008DF038 /* WebLRUFileList.m in Sources */,
                                939811120824BF01008DF038 /* WebNSURLExtras.m in Sources */,
                                939811130824BF01008DF038 /* WebHistory.m in Sources */,
                                939811150824BF01008DF038 /* WebNSDataExtras.m in Sources */,
index 57d4e3807f491308584613f797fe61a963eaba59..18c5f691043584034d0ec289aaab0349b75b1e8c 100644 (file)
@@ -25,7 +25,6 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-#define ICONDEBUG
 
 #ifdef __cplusplus
 #define NULL __null