9f5c2fb5bb90741446807bc28af6f19b4eb5527e
[WebKit-https.git] / WebCore / loader / icon / IconDatabase.h
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 #ifndef ICONDATABASE_H
27 #define ICONDATABASE_H
28
29 #include "config.h"
30
31 #include "IntSize.h"
32 #include "PlatformString.h"
33 #include "SQLDatabase.h"
34 #include "StringHash.h"
35 #include "Timer.h"
36
37 #include <wtf/HashMap.h>
38 #include <wtf/HashSet.h>
39
40 namespace WTF {
41
42     template<> struct IntHash<WebCore::IntSize> {
43         static unsigned hash(const WebCore::IntSize& key) { return intHash((static_cast<uint64_t>(key.width()) << 32 | key.height())); }
44         static bool equal(const WebCore::IntSize& a, const WebCore::IntSize& b) { return a == b; }
45     };
46     template<> struct DefaultHash<WebCore::IntSize> { typedef IntHash<WebCore::IntSize> Hash; };
47
48 } // namespace WTF
49
50 namespace WebCore { 
51
52 class Image;
53 class IconDataCache;
54 class SQLTransaction;
55 class SQLStatement;
56
57 class IconDatabase
58 {
59 //TODO - SiteIcon is never to be used outside of IconDatabase, so make it an internal and remove the friendness
60 friend class SiteIcon;
61 public:
62     static IconDatabase* sharedIconDatabase();
63     
64     bool open(const String& path);
65     bool isOpen() { return m_mainDB.isOpen() && m_privateBrowsingDB.isOpen(); }
66     void close();
67     
68     bool isEmpty();
69  
70     Image* iconForPageURL(const String&, const IntSize&, bool cache = true);
71     Image* iconForIconURL(const String&, const IntSize&, bool cache = true);
72     String iconURLForPageURL(const String&);
73     Image* defaultIcon(const IntSize&);
74
75     void retainIconForPageURL(const String&);
76     void releaseIconForPageURL(const String&);
77     
78     void setPrivateBrowsingEnabled(bool flag);
79     bool getPrivateBrowsingEnabled() { return m_privateBrowsingEnabled; }
80
81     bool hasEntryForIconURL(const String&);
82
83     bool isIconExpiredForIconURL(const String&);
84     
85     void setIconDataForIconURL(const void* data, int size, const String&);
86     void setHaveNoIconForIconURL(const String&);
87     
88     // Returns true if the set actually took place, false if the mapping already existed
89     bool setIconURLForPageURL(const String& iconURL, const String& pageURL);
90
91     static const String& defaultDatabaseFilename();
92     
93     static const int currentDatabaseVersion;    
94     static const int iconExpirationTime;
95     static const int missingIconExpirationTime;
96     static const int updateTimerDelay;
97 private:
98     IconDatabase();
99     ~IconDatabase();
100     
101     // This tries to get the iconID for the IconURL and, if it doesn't exist and createIfNecessary is true,
102     // it will create the entry and return the new iconID
103     int64_t establishIconIDForIconURL(SQLDatabase&, const String&, bool createIfNecessary = true);
104     
105     // This method returns the SiteIcon for the given IconURL and, if it doesn't exist it creates it first
106     IconDataCache* getOrCreateIconDataCache(const String& iconURL);
107
108     // Remove traces of the given pageURL
109     void forgetPageURL(const String& pageURL);
110     
111     // Remove the current database entry for this IconURL
112     void forgetIconForIconURLFromDatabase(const String&);
113     
114     void setIconURLForPageURLInDatabase(const String&, const String&);
115     
116     // Wipe all icons from the DB
117     void removeAllIcons();
118     
119     // Called by the startup timer, this method removes all icons that are unretained
120     // after initial retains are complete, and pageURLs that are dangling
121     void pruneUnretainedIconsOnStartup(Timer<IconDatabase>*);
122     
123     // Called by the prune timer, this method periodically removes all the icons in the pending-deletion
124     // queue
125     void updateDatabase(Timer<IconDatabase>*);
126     
127     // This is called by updateDatabase and when private browsing shifts, and when the DB is closed down
128     void syncDatabase();
129     
130     // Determine if an IconURL is still retained by anyone
131     bool isIconURLRetained(const String&);
132     
133     // Do a quick check to make sure the database tables are in place and the db version is current
134     bool isValidDatabase(SQLDatabase&);
135     
136     // Delete all tables from the given database
137     void clearDatabaseTables(SQLDatabase&);
138     
139     // Create the tables and triggers for the given database.
140     void createDatabaseTables(SQLDatabase&);
141     
142     // Returns the image data for the given IconURL, checking both databases if necessary
143     void imageDataForIconURL(const String& iconURL, Vector<unsigned char>&);
144     
145     // Retains an iconURL, bringing it back from the brink if it was pending deletion
146     void retainIconURL(const String& iconURL);
147     
148     // Releases an iconURL, putting it on the pending delete queue if it's totally released
149     void releaseIconURL(const String& iconURL);
150     
151     // Query - Checks for at least 1 entry in the PageURL table
152     bool pageURLTableIsEmptyQuery(SQLDatabase&);
153     
154     // Query - Returns the time stamp for an Icon entry
155     int timeStampForIconURLQuery(SQLDatabase&, const String& iconURL);    
156     SQLStatement *m_timeStampForIconURLStatement;
157     
158     // Query - Returns the IconURL for a PageURL
159     String iconURLForPageURLQuery(SQLDatabase&, const String& pageURL);    
160     SQLStatement *m_iconURLForPageURLStatement;
161     
162     // Query - Checks for the existence of the given IconURL in the Icon table
163     bool hasIconForIconURLQuery(SQLDatabase& db, const String& iconURL);
164     SQLStatement *m_hasIconForIconURLStatement;
165     
166     // Query - Deletes a PageURL from the PageURL table
167     void forgetPageURLQuery(SQLDatabase& db, const String& pageURL);
168     SQLStatement *m_forgetPageURLStatement;
169     
170     // Query - Sets the Icon.iconID for a PageURL in the PageURL table
171     void setIconIDForPageURLQuery(SQLDatabase& db, int64_t, const String&);
172     SQLStatement *m_setIconIDForPageURLStatement;
173     
174     // Query - Returns the iconID for the given IconURL
175     int64_t getIconIDForIconURLQuery(SQLDatabase& db, const String& iconURL);
176     SQLStatement *m_getIconIDForIconURLStatement;
177     
178     // Query - Creates the Icon entry for the given IconURL and returns the resulting iconID
179     int64_t addIconForIconURLQuery(SQLDatabase& db, const String& iconURL);
180     SQLStatement *m_addIconForIconURLStatement;
181     
182     // Query - Returns the image data from the given database for the given IconURL
183     void imageDataForIconURLQuery(SQLDatabase& db, const String& iconURL, Vector<unsigned char>& result);
184     SQLStatement *m_imageDataForIconURLStatement;
185
186
187     // FIXME: This method is currently implemented in WebCoreIconDatabaseBridge so we can be in ObjC++ and fire off a loader in Webkit
188     // Once all of the loader logic is sufficiently moved into WebCore we need to move this implementation to IconDatabase.cpp
189     // using WebCore-style loaders
190     void loadIconFromURL(const String&);
191     
192     static IconDatabase* m_sharedInstance;
193         
194     SQLDatabase m_mainDB;
195     SQLDatabase m_privateBrowsingDB;
196     SQLDatabase* m_currentDB;
197     
198     IconDataCache* m_defaultIconDataCache;
199     
200     bool m_privateBrowsingEnabled;
201     
202     Timer<IconDatabase> m_startupTimer;
203     Timer<IconDatabase> m_updateTimer;
204     
205     bool m_initialPruningComplete;
206     SQLTransaction* m_initialPruningTransaction;
207     SQLStatement* m_preparedPageRetainInsertStatement;
208     
209     HashMap<String, IconDataCache*> m_iconURLToIconDataCacheMap;
210     HashSet<IconDataCache*> m_iconDataCachesPendingUpdate;
211     
212     HashMap<String, String> m_pageURLToIconURLMap;
213     HashSet<String> m_pageURLsPendingAddition;
214
215     // This will keep track of the retaincount for each pageURL
216     HashMap<String, int> m_pageURLToRetainCount;
217     // This will keep track of the retaincount for each iconURL (ie - the number of pageURLs retaining this icon)
218     HashMap<String, int> m_iconURLToRetainCount;
219
220     HashSet<String> m_pageURLsPendingDeletion;
221     HashSet<String> m_iconURLsPendingDeletion;
222 };
223
224 } //namespace WebCore
225
226 #endif