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