Reviewed by Darin.
[WebKit-https.git] / WebCore / bridge / mac / WebCoreIconDatabaseBridge.mm
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "config.h"
27 #import "WebCoreIconDatabaseBridge.h"
28
29 #import "IconDatabase.h"
30 #import "Image.h"
31 #import "Logging.h"
32 #import "PlatformString.h"
33 #import "RetainPtr.h"
34
35 using namespace WebCore;
36
37 @implementation WebCoreIconDatabaseBridge
38
39 - (BOOL)openSharedDatabaseWithPath:(NSString *)path
40 {
41     ASSERT(path);
42     
43     IconDatabase* iconDB = IconDatabase::sharedIconDatabase();
44     
45     iconDB->open((String([path stringByStandardizingPath])));
46     if (!iconDB->isOpen()) {
47         [self closeSharedDatabase];
48         NSLog(@"Unable to open icon database at %@ - Check your write permissions at that path.  Icon database will be disabled for this browsing session", path);
49         return NO;
50     }
51     return YES;
52 }
53
54 - (void)closeSharedDatabase
55 {
56     IconDatabase::sharedIconDatabase()->close();
57 }
58
59 - (BOOL)isOpen
60 {
61     return IconDatabase::sharedIconDatabase()->isOpen();
62 }
63
64 - (void)removeAllIcons
65 {
66     IconDatabase::sharedIconDatabase()->removeAllIcons();
67 }
68
69 - (BOOL)_isEmpty
70 {
71     return IconDatabase::sharedIconDatabase()->isEmpty();
72 }
73
74 - (BOOL)isIconExpiredForIconURL:(NSString *)iconURL
75 {
76     return IconDatabase::sharedIconDatabase()->isIconExpiredForIconURL(iconURL);
77 }
78
79 - (void)setPrivateBrowsingEnabled:(BOOL)flag
80 {
81     IconDatabase::sharedIconDatabase()->setPrivateBrowsingEnabled(flag);
82 }
83
84 - (BOOL)privateBrowsingEnabled
85 {
86     return IconDatabase::sharedIconDatabase()->getPrivateBrowsingEnabled();
87 }
88
89 - (NSImage *)iconForPageURL:(NSString *)url withSize:(NSSize)size
90 {
91     ASSERT(url);
92     ASSERT(size.width);
93     ASSERT(size.height);
94
95     // FIXME - We're doing the resize here for now because WebCore::Image doesn't yet support resizing/multiple representations
96     // This makes it so there's effectively only one size of a particular icon in the system at a time.  We really need to move this
97     // to WebCore::Image and WebCore::IconDatabase asap
98     Image* image = IconDatabase::sharedIconDatabase()->iconForPageURL(String(url), IntSize(size));
99     if (image) {
100         NSImage* nsImage = image->getNSImage();
101         if (!nsImage) {
102             LOG(IconDatabase, "image didn't return a valid NSImage for URL %@", url);
103             return nil;
104         }
105         LOG(IconDatabase, "Found %i representations in the NSImage", [[nsImage representations] count]);
106         
107         if (!NSEqualSizes([nsImage size], size)) {
108             [nsImage setScalesWhenResized:YES];
109             [nsImage setSize:size];
110         }
111         return nsImage;
112     }
113     return nil;
114 }
115
116 - (NSString *)iconURLForPageURL:(NSString *)url
117 {
118     ASSERT(url);
119     
120     String iconURL = IconDatabase::sharedIconDatabase()->iconURLForPageURL(String(url));
121     return (NSString*)iconURL;
122 }
123
124 - (NSImage *)defaultIconWithSize:(NSSize)size
125 {
126     ASSERT(size.width);
127     ASSERT(size.height);
128     
129     Image* image = IconDatabase::sharedIconDatabase()->defaultIcon(IntSize(size));
130     if (image)
131         return image->getNSImage();
132     return nil;
133 }
134
135 - (void)retainIconForURL:(NSString *)url
136 {
137     ASSERT(url);
138     
139     IconDatabase::sharedIconDatabase()->retainIconForPageURL(String(url));
140 }
141
142 - (void)releaseIconForURL:(NSString *)url
143 {
144     ASSERT(url);
145     
146     IconDatabase::sharedIconDatabase()->releaseIconForPageURL(String(url));
147 }
148
149 - (void)_setIconData:(NSData *)data forIconURL:(NSString *)iconURL
150 {
151     ASSERT(data);
152     ASSERT(iconURL);
153     
154     IconDatabase::sharedIconDatabase()->setIconDataForIconURL([data bytes], [data length], String(iconURL));
155 }
156
157 - (void)_setHaveNoIconForIconURL:(NSString *)iconURL
158 {
159     ASSERT(iconURL);
160     
161     IconDatabase::sharedIconDatabase()->setHaveNoIconForIconURL(String(iconURL));
162 }
163
164 - (BOOL)_setIconURL:(NSString *)iconURL forPageURL:(NSString *)pageURL
165 {
166     ASSERT(iconURL);
167     ASSERT(pageURL);
168     
169     return IconDatabase::sharedIconDatabase()->setIconURLForPageURL(String(iconURL), String(pageURL));
170 }
171
172 - (BOOL)_hasEntryForIconURL:(NSString *)iconURL
173 {    
174     return IconDatabase::sharedIconDatabase()->hasEntryForIconURL(iconURL);
175 }
176
177 - (NSString *)defaultDatabaseFilename
178 {
179     return IconDatabase::defaultDatabaseFilename();
180 }
181
182 - (void)_setEnabled:(BOOL)enabled
183 {
184     IconDatabase::sharedIconDatabase()->setEnabled(enabled);
185 }
186
187 - (BOOL)_isEnabled
188 {
189     return IconDatabase::sharedIconDatabase()->enabled();
190 }
191
192 + (WebCoreIconDatabaseBridge *)sharedInstance
193 {
194     static RetainPtr<WebCoreIconDatabaseBridge> bridge;
195     if (!bridge)
196         bridge = [self createInstance];
197     return bridge.get();
198 }
199
200 @end