aboutsummaryrefslogtreecommitdiffstats
path: root/embed
diff options
context:
space:
mode:
Diffstat (limited to 'embed')
-rw-r--r--embed/ephy-favicon-cache.c63
-rw-r--r--embed/ephy-history.c4
2 files changed, 57 insertions, 10 deletions
diff --git a/embed/ephy-favicon-cache.c b/embed/ephy-favicon-cache.c
index f73b1251c..306bc1f55 100644
--- a/embed/ephy-favicon-cache.c
+++ b/embed/ephy-favicon-cache.c
@@ -44,6 +44,9 @@
#define EPHY_FAVICON_CACHE_OBSOLETE_DAYS 30
+/* how often to save the cache, in milliseconds */
+#define CACHE_SAVE_INTERVAL 10 * 60 * 1000 /* ms */
+
/* this is very generous, most files are 4k */
#define EPHY_FAVICON_MAX_SIZE 64 * 1024 /* byte */
@@ -62,6 +65,8 @@ struct _EphyFaviconCachePrivate
EphyNode *icons;
GHashTable *icons_hash;
GHashTable *downloads_hash;
+ guint autosave_timeout;
+ guint dirty : 1;
};
enum
@@ -231,11 +236,42 @@ prepare_close_cb (EphyEmbedShell *shell,
}
static void
+ephy_favicon_cache_save (EphyFaviconCache *cache)
+{
+ EphyFaviconCachePrivate *priv = cache->priv;
+ int ret;
+
+ if (priv->dirty)
+ {
+ LOG ("Saving favicon cache\n");
+
+ ret = ephy_node_db_write_to_xml_safe
+ (cache->priv->db, (const xmlChar *) priv->xml_file,
+ EPHY_FAVICON_CACHE_XML_ROOT,
+ EPHY_FAVICON_CACHE_XML_VERSION,
+ NULL,
+ priv->icons, NULL, NULL,
+ NULL);
+
+ /* still dirty if save failed */
+ priv->dirty = ret < 0;
+ }
+}
+
+static gboolean
+periodic_save_cb (EphyFaviconCache *cache)
+{
+ ephy_favicon_cache_save (cache);
+ return TRUE;
+}
+
+static void
ephy_favicon_cache_init (EphyFaviconCache *cache)
{
+ EphyFaviconCachePrivate *priv;
EphyNodeDb *db;
- cache->priv = EPHY_FAVICON_CACHE_GET_PRIVATE (cache);
+ priv = cache->priv = EPHY_FAVICON_CACHE_GET_PRIVATE (cache);
db = ephy_node_db_new (EPHY_NODE_DB_SITEICONS);
cache->priv->db = db;
@@ -281,6 +317,10 @@ ephy_favicon_cache_init (EphyFaviconCache *cache)
/* listen to prepare-close on the shell */
g_signal_connect_object (embed_shell, "prepare-close",
G_CALLBACK (prepare_close_cb), cache, 0);
+
+ priv->autosave_timeout = g_timeout_add (CACHE_SAVE_INTERVAL,
+ (GSourceFunc) periodic_save_cb,
+ cache);
}
static gboolean
@@ -309,6 +349,7 @@ static void
ephy_favicon_cache_finalize (GObject *object)
{
EphyFaviconCache *cache = EPHY_FAVICON_CACHE (object);
+ EphyFaviconCachePrivate *priv = cache->priv;
LOG ("EphyFaviconCache finalising");
@@ -316,13 +357,12 @@ ephy_favicon_cache_finalize (GObject *object)
(GHRFunc) kill_download, cache);
remove_obsolete_icons (cache);
- ephy_node_db_write_to_xml_safe
- (cache->priv->db, (const xmlChar *)cache->priv->xml_file,
- EPHY_FAVICON_CACHE_XML_ROOT,
- EPHY_FAVICON_CACHE_XML_VERSION,
- NULL,
- cache->priv->icons, NULL, NULL,
- NULL);
+ if (priv->autosave_timeout != 0)
+ {
+ g_source_remove (priv->autosave_timeout);
+ }
+
+ ephy_favicon_cache_save (cache);
g_free (cache->priv->xml_file);
g_free (cache->priv->directory);
@@ -350,6 +390,8 @@ favicon_download_completed_cb (EphyEmbedPersist *persist,
g_signal_emit (G_OBJECT (cache), signals[CHANGED], 0, url);
g_object_unref (persist);
+
+ cache->priv->dirty = TRUE;
}
static void
@@ -372,6 +414,8 @@ favicon_download_cancelled_cb (EphyEmbedPersist *persist,
/* FIXME: re-schedule to try again after n days? */
g_object_unref (persist);
+
+ cache->priv->dirty = TRUE;
}
static void
@@ -416,6 +460,7 @@ GdkPixbuf *
ephy_favicon_cache_get (EphyFaviconCache *cache,
const char *url)
{
+ EphyFaviconCachePrivate *priv = cache->priv;
GTime now;
EphyNode *icon;
GValue value = { 0, };
@@ -468,6 +513,8 @@ ephy_favicon_cache_get (EphyFaviconCache *cache,
&value);
g_value_unset (&value);
+ priv->dirty = TRUE;
+
if (g_hash_table_lookup (cache->priv->downloads_hash, url) != NULL)
{
/* still downloading, return NULL */
diff --git a/embed/ephy-history.c b/embed/ephy-history.c
index 27faad9e9..f35b0f87a 100644
--- a/embed/ephy-history.c
+++ b/embed/ephy-history.c
@@ -54,11 +54,11 @@ struct _EphyHistoryPrivate
EphyNode *last_page;
GHashTable *hosts_hash;
GHashTable *pages_hash;
- int autosave_timeout;
+ guint autosave_timeout;
guint update_hosts_idle;
+ guint disable_history_notifier_id;
gboolean dirty;
gboolean enabled;
- guint disable_history_notifier_id;
};
enum