f2651a1bf1a627a7f1539d3ca550892b3a90b13c
[WebKit-https.git] / WebKit / efl / ewk / ewk_settings.cpp
1 /*
2     Copyright (C) 2009-2010 ProFUSION embedded systems
3     Copyright (C) 2009-2010 Samsung Electronics
4
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14
15     You should have received a copy of the GNU Library General Public License
16     along with this library; see the file COPYING.LIB.  If not, write to
17     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18     Boston, MA 02110-1301, USA.
19 */
20
21 #include "config.h"
22 #include "ewk_settings.h"
23
24 #include "EWebKit.h"
25 #if ENABLE(DATABASE)
26 #include "DatabaseTracker.h"
27 #endif
28 #include "IconDatabase.h"
29 #include "Image.h"
30 #include "IntSize.h"
31 #include "KURL.h"
32 #include "ewk_private.h"
33 #include <wtf/text/CString.h>
34
35 #include <eina_safety_checks.h>
36 #include <errno.h>
37 #include <string.h>
38 #include <sys/stat.h>
39 #include <sys/types.h>
40 #include <unistd.h>
41
42 #if USE(SOUP)
43 #include "ResourceHandle.h"
44 #include <libsoup/soup.h>
45 #endif
46
47 static const char* _ewk_default_web_database_path = 0;
48 static const char* _ewk_icon_database_path = 0;
49 static uint64_t _ewk_default_web_database_quota = 1 * 1024 * 1024;
50
51 /**
52  * Returns the default quota for Web Database databases. By default
53  * this value is 1MB.
54  *
55  * @return the current default database quota in bytes
56  **/
57 uint64_t ewk_settings_web_database_default_quota_get()
58 {
59     return _ewk_default_web_database_quota;
60 }
61
62 /**
63  * Sets the current path to the directory WebKit will write Web
64  * Database databases.
65  *
66  * @path: the new database directory path
67  *
68  */
69 void ewk_settings_web_database_path_set(const char *path)
70 {
71 #if ENABLE(DATABASE)
72     WTF::String corePath = WTF::String::fromUTF8(path);
73     WebCore::DatabaseTracker::tracker().setDatabaseDirectoryPath(corePath);
74     if (!_ewk_default_web_database_path)
75         _ewk_default_web_database_path = eina_stringshare_add(corePath.utf8().data());
76     else
77         eina_stringshare_replace(&_ewk_default_web_database_path, corePath.utf8().data());
78
79 #endif
80 }
81
82 /**
83  * Return directory path where web database is stored.
84  *
85  * @return database path or NULL if none or web database is not supported.
86  *         This is guaranteed to be eina_stringshare, so whenever possible
87  *         save yourself some cpu cycles and use
88  *         eina_stringshare_ref() instead of eina_stringshare_add() or
89  *         strdup().
90  */
91 const char *ewk_settings_web_database_path_get()
92 {
93 #if ENABLE(DATABASE)
94     return _ewk_default_web_database_path;
95 #else
96     return 0;
97 #endif
98 }
99
100 /**
101  * Sets directory where to store icon database, opening database.
102  *
103  * @param directory where to store icon database, must be
104  *        write-able. If @c NULL is given, then database is closed.
105  *
106  * @return @c EINA_TRUE on success, @c EINA_FALSE on errors.
107  */
108 Eina_Bool ewk_settings_icon_database_path_set(const char *directory)
109 {
110     WebCore::iconDatabase()->delayDatabaseCleanup();
111
112     if (directory) {
113         struct stat st;
114
115         if (stat(directory, &st)) {
116             ERR("could not stat(%s): %s", directory, strerror(errno));
117             return EINA_FALSE;
118         }
119
120         if (!S_ISDIR(st.st_mode)) {
121             ERR("not a directory: %s", directory);
122             return EINA_FALSE;
123         }
124
125         if (access(directory, R_OK | W_OK)) {
126             ERR("could not access directory '%s' for read and write: %s",
127                 directory, strerror(errno));
128             return EINA_FALSE;
129         }
130
131         WebCore::iconDatabase()->setEnabled(true);
132         WebCore::iconDatabase()->open(WTF::String::fromUTF8(directory));
133         if (!_ewk_icon_database_path)
134             _ewk_icon_database_path = eina_stringshare_add(directory);
135         else
136             eina_stringshare_replace(&_ewk_icon_database_path, directory);
137     } else {
138         WebCore::iconDatabase()->setEnabled(false);
139         WebCore::iconDatabase()->close();
140         if (_ewk_icon_database_path) {
141             eina_stringshare_del(_ewk_icon_database_path);
142             _ewk_icon_database_path = 0;
143         }
144     }
145     return EINA_TRUE;
146 }
147
148 /**
149  * Return directory path where icon database is stored.
150  *
151  * @return database path or @c NULL if none is set or database is closed.
152  *         This is guaranteed to be eina_stringshare, so whenever possible
153  *         save yourself some cpu cycles and use
154  *         eina_stringshare_ref() instead of eina_stringshare_add() or
155  *         strdup().
156  */
157 const char* ewk_settings_icon_database_path_get(void)
158 {
159     if (!WebCore::iconDatabase()->isEnabled())
160         return 0;
161     if (!WebCore::iconDatabase()->isOpen())
162         return 0;
163
164     return _ewk_icon_database_path;
165 }
166
167 /**
168  * Remove all known icons from database.
169  *
170  * Database must be opened with ewk_settings_icon_database_path_set()
171  * in order to work.
172  *
173  * @return @c EINA_TRUE on success or @c EINA_FALSE otherwise, like
174  *         closed database.
175  */
176 Eina_Bool ewk_settings_icon_database_clear(void)
177 {
178     if (!WebCore::iconDatabase()->isEnabled())
179         return EINA_FALSE;
180     if (!WebCore::iconDatabase()->isOpen())
181         return EINA_FALSE;
182
183     WebCore::iconDatabase()->removeAllIcons();
184     return EINA_TRUE;
185 }
186
187 /**
188  * Query icon for given URL, returning associated cairo surface.
189  *
190  * @note in order to have this working, one must open icon database
191  *       with ewk_settings_icon_database_path_set().
192  *
193  * @param url which url to query icon.
194  *
195  * @return cairo surface if any, or NULL on failure.
196  */
197 cairo_surface_t* ewk_settings_icon_database_icon_surface_get(const char *url)
198 {
199     EINA_SAFETY_ON_NULL_RETURN_VAL(url, 0);
200
201     WebCore::KURL kurl(WebCore::KURL(), WTF::String::fromUTF8(url));
202     WebCore::Image *icon = WebCore::iconDatabase()->iconForPageURL(kurl.string(), WebCore::IntSize(16, 16));
203
204     if (!icon) {
205         ERR("no icon for url %s", url);
206         return 0;
207     }
208
209     return icon->nativeImageForCurrentFrame();
210 }
211
212 /**
213  * Create Evas_Object of type image representing the given URL.
214  *
215  * This is an utility function that creates an Evas_Object of type
216  * image set to have fill always match object size
217  * (evas_object_image_filled_add()), saving some code to use it from Evas.
218  *
219  * @note in order to have this working, one must open icon database
220  *       with ewk_settings_icon_database_path_set().
221  *
222  * @param url which url to query icon.
223  * @param canvas evas instance where to add resulting object.
224  *
225  * @return newly allocated Evas_Object instance or @c NULL on
226  *         errors. Delete the object with evas_object_del().
227  */
228 Evas_Object* ewk_settings_icon_database_icon_object_add(const char* url, Evas* canvas)
229 {
230     EINA_SAFETY_ON_NULL_RETURN_VAL(url, 0);
231     EINA_SAFETY_ON_NULL_RETURN_VAL(canvas, 0);
232
233     WebCore::KURL kurl(WebCore::KURL(), WTF::String::fromUTF8(url));
234     WebCore::Image* icon = WebCore::iconDatabase()->iconForPageURL(kurl.string(), WebCore::IntSize(16, 16));
235     cairo_surface_t* surface;
236
237     if (!icon) {
238         ERR("no icon for url %s", url);
239         return 0;
240     }
241
242     surface = icon->nativeImageForCurrentFrame();
243     return ewk_util_image_from_cairo_surface_add(canvas, surface);
244 }
245
246 /**
247  * Sets the given proxy URI to network backend.
248  *
249  * @param proxy URI.
250  */
251 void ewk_settings_proxy_uri_set(const char* proxy)
252 {
253 #if USE(SOUP)
254     SoupURI* uri = soup_uri_new(proxy);
255     EINA_SAFETY_ON_NULL_RETURN(uri);
256
257     SoupSession* session = WebCore::ResourceHandle::defaultSession();
258     g_object_set(session, SOUP_SESSION_PROXY_URI, uri, NULL);
259     soup_uri_free(uri);
260 #elif USE(CURL)
261     EINA_SAFETY_ON_TRUE_RETURN(1);
262 #endif
263 }