diff options
Diffstat (limited to 'embed')
-rw-r--r-- | embed/ephy-history.c | 165 | ||||
-rw-r--r-- | embed/ephy-history.h | 7 |
2 files changed, 143 insertions, 29 deletions
diff --git a/embed/ephy-history.c b/embed/ephy-history.c index 8aae3eaf0..aa931c03f 100644 --- a/embed/ephy-history.c +++ b/embed/ephy-history.c @@ -27,6 +27,8 @@ #include "ephy-debug.h" #include "ephy-node-db.h" #include "ephy-node-common.h" +#include "eel-gconf-extensions.h" +#include "ephy-prefs.h" #include <time.h> #include <string.h> @@ -56,34 +58,37 @@ struct EphyHistoryPrivate int autosave_timeout; guint update_hosts_idle; gboolean dirty; + gboolean enabled; + guint disable_history_notifier_id; +}; + +enum +{ + PROP_0, + PROP_ENABLED }; enum { - ADD, - UPDATE, - REMOVE, VISITED, + CLEARED, LAST_SIGNAL }; -static void -ephy_history_class_init (EphyHistoryClass *klass); -static void -ephy_history_init (EphyHistory *tab); -static void -ephy_history_finalize (GObject *object); +static guint signals[LAST_SIGNAL] = { 0 }; -static GObjectClass *parent_class = NULL; +static void ephy_history_class_init (EphyHistoryClass *klass); +static void ephy_history_init (EphyHistory *history); +static void ephy_history_finalize (GObject *object); -static guint ephy_history_signals[LAST_SIGNAL] = { 0 }; +static GObjectClass *parent_class = NULL; GType ephy_history_get_type (void) { - static GType ephy_history_type = 0; + static GType type = 0; - if (ephy_history_type == 0) + if (type == 0) { static const GTypeInfo our_info = { @@ -98,12 +103,58 @@ ephy_history_get_type (void) (GInstanceInitFunc) ephy_history_init }; - ephy_history_type = g_type_register_static (G_TYPE_OBJECT, - "EphyHistory", - &our_info, 0); + type = g_type_register_static (G_TYPE_OBJECT, + "EphyHistory", + &our_info, 0); } - return ephy_history_type; + return type; +} + +static void +ephy_history_set_enabled (EphyHistory *history, + gboolean enabled) +{ + LOG ("ephy_history_set_enabled %d", enabled) + + ephy_node_db_set_immutable (history->priv->db, !enabled); + + if (enabled == FALSE) + { + ephy_history_clear (history); + } +} + +static void +ephy_history_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + EphyHistory *history = EPHY_HISTORY (history); + + switch (prop_id) + { + case PROP_ENABLED: + ephy_history_set_enabled (history, g_value_get_boolean (value)); + break; + } +} + +static void +ephy_history_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EphyHistory *history = EPHY_HISTORY (history); + + switch (prop_id) + { + case PROP_ENABLED: + g_value_set_boolean (value, history->priv->enabled); + break; + } } static void @@ -114,8 +165,18 @@ ephy_history_class_init (EphyHistoryClass *klass) parent_class = g_type_class_peek_parent (klass); object_class->finalize = ephy_history_finalize; - - ephy_history_signals[VISITED] = + object_class->get_property = ephy_history_get_property; + object_class->set_property = ephy_history_set_property; + + g_object_class_install_property (object_class, + PROP_ENABLED, + g_param_spec_boolean ("enabled", + "Enabled", + "Enabled", + TRUE, + G_PARAM_READWRITE)); + + signals[VISITED] = g_signal_new ("visited", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, @@ -126,6 +187,16 @@ ephy_history_class_init (EphyHistoryClass *klass) 1, G_TYPE_STRING); + signals[CLEARED] = + g_signal_new ("cleared", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (EphyHistoryClass, cleared), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + g_type_class_add_private (object_class, sizeof(EphyHistoryPrivate)); } @@ -353,7 +424,7 @@ page_removed_from_host_cb (EphyNode *node, guint old_index, EphyHistory *eb) { - if (!eb->priv->update_hosts_idle) + if (eb->priv->update_hosts_idle == 0) { eb->priv->update_hosts_idle = g_idle_add ((GSourceFunc)update_hosts, eb); @@ -374,6 +445,16 @@ connect_page_removed_from_host (char *url, } static void +disable_history_notifier (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + EphyHistory *history) +{ + ephy_history_set_enabled + (history, !eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_HISTORY)); +} + +static void ephy_history_init (EphyHistory *eb) { GValue value = { 0, }; @@ -459,6 +540,11 @@ ephy_history_init (EphyHistory *eb) g_timeout_add (HISTORY_SAVE_INTERVAL, (GSourceFunc)periodic_save_cb, eb); + + disable_history_notifier (NULL, 0, NULL, eb); + eb->priv->disable_history_notifier_id = eel_gconf_notification_add + (CONF_LOCKDOWN_DISABLE_HISTORY, + (GConfClientNotifyFunc) disable_history_notifier, eb); } static void @@ -483,6 +569,8 @@ ephy_history_finalize (GObject *object) g_source_remove (eb->priv->autosave_timeout); + eel_gconf_notification_remove (eb->priv->disable_history_notifier_id); + LOG ("Global history finalized"); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -491,11 +579,7 @@ ephy_history_finalize (GObject *object) EphyHistory * ephy_history_new () { - EphyHistory *eh; - - eh = EPHY_HISTORY (g_object_new (EPHY_TYPE_HISTORY, NULL)); - - return eh; + return EPHY_HISTORY (g_object_new (EPHY_TYPE_HISTORY, NULL)); } static void @@ -550,6 +634,11 @@ ephy_history_get_host (EphyHistory *eh, const char *url) g_return_val_if_fail (url != NULL, NULL); + if (eh->priv->enabled == FALSE) + { + return NULL; + } + now = time (NULL); vfs_uri = gnome_vfs_uri_new (url); @@ -696,7 +785,7 @@ ephy_history_visited (EphyHistory *eh, EphyNode *node) eh->priv->last_page = node; - g_signal_emit (G_OBJECT (eh), ephy_history_signals[VISITED], 0, url); + g_signal_emit (G_OBJECT (eh), signals[VISITED], 0, url); } int @@ -724,6 +813,11 @@ ephy_history_add_page (EphyHistory *eb, EphyNode *bm, *node, *host; GValue value = { 0, }; + if (eb->priv->enabled == FALSE) + { + return; + } + node = ephy_history_get_page (eb, url); if (node) { @@ -786,7 +880,7 @@ ephy_history_set_page_title (EphyHistory *gh, if (title == NULL || title[0] == '\0') return; node = ephy_history_get_page (gh, url); - if (!node) return; + if (node == NULL) return; g_value_init (&value, G_TYPE_STRING); g_value_set_string (&value, title); @@ -842,12 +936,19 @@ ephy_history_clear (EphyHistory *gh) { EphyNode *node; + LOG ("clearing history") + + ephy_node_db_set_immutable (gh->priv->db, FALSE); + while ((node = ephy_node_get_nth_child (gh->priv->pages, 0)) != NULL) { ephy_node_unref (node); } - ephy_history_save (gh); + + ephy_node_db_set_immutable (gh->priv->db, !gh->priv->enabled); + + g_signal_emit (gh, signals[CLEARED], 0); } EphyNode * @@ -870,3 +971,11 @@ ephy_history_get_last_page (EphyHistory *gh) return ephy_node_get_property_string (gh->priv->last_page, EPHY_NODE_PAGE_PROP_LOCATION); } + +gboolean +ephy_history_is_enabled (EphyHistory *history) +{ + g_return_val_if_fail (EPHY_IS_HISTORY (history), FALSE); + + return history->priv->enabled; +} diff --git a/embed/ephy-history.h b/embed/ephy-history.h index e3184156f..5a3ac1de3 100644 --- a/embed/ephy-history.h +++ b/embed/ephy-history.h @@ -63,7 +63,10 @@ struct EphyHistoryClass { GObjectClass parent_class; - void (* visited) (const char *url); + /* Signals */ + void (* visited) (EphyHistory *history, + const char *url); + void (* cleared) (EphyHistory *history); }; GType ephy_history_get_type (void); @@ -103,6 +106,8 @@ const char *ephy_history_get_icon (EphyHistory *gh, void ephy_history_clear (EphyHistory *gh); +gboolean ephy_history_is_enabled (EphyHistory *history); + G_END_DECLS #endif |