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