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