WebCore:
[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 "Logging.h"
30 #import "IconDatabase.h"
31 #import "Image.h"
32 #import "PlatformString.h"
33
34 using namespace WebCore;
35
36 namespace WebCore {
37
38 void IconDatabase::loadIconFromURL(const String& url)
39 {
40     if (url.isEmpty())
41         return;
42     [[WebCoreIconDatabaseBridge sharedInstance] loadIconFromURL:(NSString *)url];
43 }
44
45 }
46
47 @implementation WebCoreIconDatabaseBridge
48
49 - (BOOL)openSharedDatabaseWithPath:(NSString *)path
50 {
51     assert(path);
52     
53     _iconDB = IconDatabase::sharedIconDatabase();
54     if (_iconDB) {
55         _iconDB->open((String([path stringByStandardizingPath])));
56         if (!_iconDB->isOpen()) {
57             [self closeSharedDatabase];
58             NSLog(@"Unable to open icon database at %@ - Check your write permissions at that path.  Icon database will be disabled for this browsing session", path);
59             return NO;
60         }
61         return YES;
62     }
63     return NO;
64 }
65
66 - (void)closeSharedDatabase
67 {
68     delete _iconDB;
69     _iconDB = 0;
70 }
71
72 - (BOOL)isOpen
73 {
74     return _iconDB != 0;
75 }
76
77 - (void)removeAllIcons
78 {
79     if (_iconDB)
80         _iconDB->removeAllIcons();
81 }
82
83 - (BOOL)_isEmpty
84 {
85     return _iconDB ? _iconDB->isEmpty() : NO;
86 }
87
88 - (BOOL)isIconExpiredForIconURL:(NSString *)iconURL
89 {
90     return _iconDB ? _iconDB->isIconExpiredForIconURL(iconURL) : NO;
91 }
92
93 - (void)setPrivateBrowsingEnabled:(BOOL)flag
94 {
95     if (_iconDB)
96         _iconDB->setPrivateBrowsingEnabled(flag);
97 }
98
99 - (BOOL)privateBrowsingEnabled
100 {
101     if (_iconDB)
102         return _iconDB->getPrivateBrowsingEnabled();
103     return false;
104 }
105
106 - (NSImage *)iconForPageURL:(NSString *)url withSize:(NSSize)size
107 {
108     if (!_iconDB)
109         return nil;
110         
111     ASSERT(url);
112     ASSERT(size.width);
113     ASSERT(size.height);
114
115     // FIXME - We're doing the resize here for now because WebCore::Image doesn't yet support resizing/multiple representations
116     // 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
117     // to WebCore::Image and WebCore::IconDatabase asap
118     Image* image = _iconDB->iconForPageURL(String(url), IntSize(size));
119     if (image) {
120         NSImage* nsImage = image->getNSImage();
121         if (!nsImage) {
122             LOG(IconDatabase, "image didn't return a valid NSImage for URL %@", url);
123             return nil;
124         }
125         LOG(IconDatabase, "Found %i representations in the NSImage", [[nsImage representations] count]);
126         
127         if (!NSEqualSizes([nsImage size], size)) {
128             [nsImage setScalesWhenResized:YES];
129             [nsImage setSize:size];
130         }
131         return nsImage;
132     }
133     return nil;
134 }
135
136 - (NSString *)iconURLForPageURL:(NSString *)url
137 {
138     if (!_iconDB)
139         return nil;
140     ASSERT(url);
141     
142     String iconURL = _iconDB->iconURLForPageURL(String(url));
143     return (NSString*)iconURL;
144 }
145
146 - (NSImage *)defaultIconWithSize:(NSSize)size
147 {
148     if (!_iconDB)
149         return nil;
150     ASSERT(size.width);
151     ASSERT(size.height);
152     
153     Image* image = _iconDB->defaultIcon(IntSize(size));
154     if (image)
155         return image->getNSImage();
156     return nil;
157 }
158
159 - (void)retainIconForURL:(NSString *)url
160 {
161     if (!_iconDB)
162         return;
163     ASSERT(url);
164     _iconDB->retainIconForPageURL(String(url));
165 }
166
167 - (void)releaseIconForURL:(NSString *)url
168 {
169     if (!_iconDB)
170         return;
171     ASSERT(url);
172     _iconDB->releaseIconForPageURL(String(url));
173 }
174
175 - (void)_setIconData:(NSData *)data forIconURL:(NSString *)iconURL
176 {
177     if (!_iconDB)
178         return;
179     ASSERT(data);
180     ASSERT(iconURL);
181     
182     _iconDB->setIconDataForIconURL([data bytes], [data length], String(iconURL));
183 }
184
185 - (void)_setHaveNoIconForIconURL:(NSString *)iconURL
186 {
187     if (!_iconDB)
188         return;
189     ASSERT(iconURL);
190     
191     _iconDB->setHaveNoIconForIconURL(String(iconURL));
192 }
193
194 - (BOOL)_setIconURL:(NSString *)iconURL forPageURL:(NSString *)pageURL
195 {
196     if (!_iconDB)
197         return NO;
198     ASSERT(iconURL);
199     ASSERT(pageURL);
200     
201     return _iconDB->setIconURLForPageURL(String(iconURL), String(pageURL));
202 }
203
204 - (BOOL)_hasEntryForIconURL:(NSString *)iconURL
205 {
206     if (!_iconDB)
207         return NO;
208     ASSERT(iconURL);
209     
210     return _iconDB->hasEntryForIconURL(iconURL);
211 }
212
213 - (NSString *)defaultDatabaseFilename
214 {
215     return IconDatabase::defaultDatabaseFilename();
216 }
217
218 @end