webkiticondatabase.cpp [plain text]
#include "config.h"
#include "webkiticondatabase.h"
#include "FileSystem.h"
#include "IconDatabase.h"
#include "Image.h"
#include "IntSize.h"
#include "webkitglobalsprivate.h"
#include "webkitmarshal.h"
#include "webkitsecurityoriginprivate.h"
#include "webkitwebframe.h"
#include <glib/gi18n-lib.h>
#include <wtf/gobject/GOwnPtr.h>
#include <wtf/text/CString.h>
using namespace WebKit;
enum {
PROP_0,
PROP_PATH,
};
enum {
ICON_LOADED,
LAST_SIGNAL
};
static guint webkit_icon_database_signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE(WebKitIconDatabase, webkit_icon_database, G_TYPE_OBJECT);
struct _WebKitIconDatabasePrivate {
GOwnPtr<gchar> path;
};
static void webkit_icon_database_finalize(GObject* object)
{
WEBKIT_ICON_DATABASE(object)->priv->~WebKitIconDatabasePrivate();
G_OBJECT_CLASS(webkit_icon_database_parent_class)->finalize(object);
}
static void webkit_icon_database_dispose(GObject* object)
{
G_OBJECT_CLASS(webkit_icon_database_parent_class)->dispose(object);
}
static void webkit_icon_database_set_property(GObject* object, guint propId, const GValue* value, GParamSpec* pspec)
{
WebKitIconDatabase* database = WEBKIT_ICON_DATABASE(object);
switch (propId) {
case PROP_PATH:
webkit_icon_database_set_path(database, g_value_get_string(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, pspec);
break;
}
}
static void webkit_icon_database_get_property(GObject* object, guint propId, GValue* value, GParamSpec* pspec)
{
WebKitIconDatabase* database = WEBKIT_ICON_DATABASE(object);
switch (propId) {
case PROP_PATH:
g_value_set_string(value, webkit_icon_database_get_path(database));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, pspec);
break;
}
}
static void webkit_icon_database_class_init(WebKitIconDatabaseClass* klass)
{
webkitInit();
GObjectClass* gobjectClass = G_OBJECT_CLASS(klass);
gobjectClass->dispose = webkit_icon_database_dispose;
gobjectClass->finalize = webkit_icon_database_finalize;
gobjectClass->set_property = webkit_icon_database_set_property;
gobjectClass->get_property = webkit_icon_database_get_property;
g_object_class_install_property(gobjectClass, PROP_PATH,
g_param_spec_string("path",
_("Path"),
_("The absolute path of the icon database folder"),
NULL,
WEBKIT_PARAM_READWRITE));
webkit_icon_database_signals[ICON_LOADED] = g_signal_new("icon-loaded",
G_TYPE_FROM_CLASS(klass),
(GSignalFlags)G_SIGNAL_RUN_LAST,
0,
NULL,
NULL,
webkit_marshal_VOID__OBJECT_STRING,
G_TYPE_NONE, 2,
WEBKIT_TYPE_WEB_FRAME,
G_TYPE_STRING);
g_type_class_add_private(klass, sizeof(WebKitIconDatabasePrivate));
}
static void webkit_icon_database_init(WebKitIconDatabase* database)
{
database->priv = G_TYPE_INSTANCE_GET_PRIVATE(database, WEBKIT_TYPE_ICON_DATABASE, WebKitIconDatabasePrivate);
new (database->priv) WebKitIconDatabasePrivate();
}
const gchar* webkit_icon_database_get_path(WebKitIconDatabase* database)
{
g_return_val_if_fail(WEBKIT_IS_ICON_DATABASE(database), 0);
return database->priv->path.get();
}
static void closeIconDatabaseOnExit()
{
if (WebCore::iconDatabase().isEnabled()) {
WebCore::iconDatabase().setEnabled(false);
WebCore::iconDatabase().close();
}
}
void webkit_icon_database_set_path(WebKitIconDatabase* database, const gchar* path)
{
g_return_if_fail(WEBKIT_IS_ICON_DATABASE(database));
if (database->priv->path.get())
WebCore::iconDatabase().close();
if (!(path && path[0])) {
database->priv->path.set(0);
WebCore::iconDatabase().setEnabled(false);
return;
}
database->priv->path.set(g_strdup(path));
WebCore::iconDatabase().setEnabled(true);
WebCore::iconDatabase().open(WebCore::filenameToString(database->priv->path.get()), WebCore::IconDatabase::defaultDatabaseFilename());
static bool initialized = false;
if (!initialized) {
atexit(closeIconDatabaseOnExit);
initialized = true;
}
}
gchar* webkit_icon_database_get_icon_uri(WebKitIconDatabase* database, const gchar* pageURI)
{
g_return_val_if_fail(WEBKIT_IS_ICON_DATABASE(database), 0);
g_return_val_if_fail(pageURI, 0);
String pageURL = String::fromUTF8(pageURI);
return g_strdup(WebCore::iconDatabase().synchronousIconURLForPageURL(pageURL).utf8().data());
}
GdkPixbuf* webkit_icon_database_get_icon_pixbuf(WebKitIconDatabase* database, const gchar* pageURI)
{
g_return_val_if_fail(WEBKIT_IS_ICON_DATABASE(database), 0);
g_return_val_if_fail(pageURI, 0);
String pageURL = String::fromUTF8(pageURI);
WebCore::Image* icon = WebCore::iconDatabase().synchronousIconForPageURL(pageURL, WebCore::IntSize(16, 16));
if (!icon)
return 0;
GdkPixbuf* pixbuf = icon->getGdkPixbuf();
if (!pixbuf)
return 0;
return static_cast<GdkPixbuf*>(g_object_ref(pixbuf));
}
void webkit_icon_database_clear(WebKitIconDatabase* database)
{
g_return_if_fail(WEBKIT_IS_ICON_DATABASE(database));
WebCore::iconDatabase().removeAllIcons();
}