diff options
author | Guillaume Desmottes <gdesmott@gnome.org> | 2008-02-16 23:55:03 +0800 |
---|---|---|
committer | Guillaume Desmottes <gdesmott@gnome.org> | 2008-02-16 23:55:03 +0800 |
commit | abb7c9a08ea73c9e845d1b22ac330241baa85c1d (patch) | |
tree | c44170784fe5ddec6488e10a0f95dfdf4f7d7f74 /libempathy/empathy-irc-network-manager.c | |
parent | 70cf9284ddcc32360ad6a67b684be18a8b853af7 (diff) | |
download | gsoc2013-empathy-abb7c9a08ea73c9e845d1b22ac330241baa85c1d.tar gsoc2013-empathy-abb7c9a08ea73c9e845d1b22ac330241baa85c1d.tar.gz gsoc2013-empathy-abb7c9a08ea73c9e845d1b22ac330241baa85c1d.tar.bz2 gsoc2013-empathy-abb7c9a08ea73c9e845d1b22ac330241baa85c1d.tar.lz gsoc2013-empathy-abb7c9a08ea73c9e845d1b22ac330241baa85c1d.tar.xz gsoc2013-empathy-abb7c9a08ea73c9e845d1b22ac330241baa85c1d.tar.zst gsoc2013-empathy-abb7c9a08ea73c9e845d1b22ac330241baa85c1d.zip |
automatically save networks when they are modified
Diffstat (limited to 'libempathy/empathy-irc-network-manager.c')
-rw-r--r-- | libempathy/empathy-irc-network-manager.c | 70 |
1 files changed, 66 insertions, 4 deletions
diff --git a/libempathy/empathy-irc-network-manager.c b/libempathy/empathy-irc-network-manager.c index 4ffd2ec12..c7f87347f 100644 --- a/libempathy/empathy-irc-network-manager.c +++ b/libempathy/empathy-irc-network-manager.c @@ -32,6 +32,7 @@ #define DEBUG_DOMAIN "IrcNetworkManager" #define IRC_NETWORKS_DTD_FILENAME "empathy-irc-networks.dtd" +#define SAVE_TIMER 4000 G_DEFINE_TYPE (EmpathyIrcNetworkManager, empathy_irc_network_manager, G_TYPE_OBJECT); @@ -52,8 +53,14 @@ struct _EmpathyIrcNetworkManagerPrivate { gchar *global_file; gchar *user_file; - gboolean modified; guint last_id; + + /* Do we have to save modifications to the user file ? */ + gboolean have_to_save; + /* Are we loading networks from XML files ? */ + gboolean loading; + /* source id of the autosave timer */ + gint save_timer_id; }; #define EMPATHY_IRC_NETWORK_MANAGER_GET_PRIVATE(obj)\ @@ -144,6 +151,16 @@ empathy_irc_network_manager_finalize (GObject *object) EmpathyIrcNetworkManagerPrivate *priv = EMPATHY_IRC_NETWORK_MANAGER_GET_PRIVATE (self); + if (priv->save_timer_id > 0) + { + g_source_remove (priv->save_timer_id); + } + + if (priv->have_to_save) + { + irc_network_manager_file_save (self); + } + g_free (priv->global_file); g_free (priv->user_file); @@ -164,6 +181,10 @@ empathy_irc_network_manager_init (EmpathyIrcNetworkManager *self) (GDestroyNotify) g_free, (GDestroyNotify) g_object_unref); priv->last_id = 0; + + priv->have_to_save = FALSE; + priv->loading = FALSE; + priv->save_timer_id = 0; } static void @@ -222,11 +243,47 @@ empathy_irc_network_manager_new (const gchar *global_file, return manager; } +static gboolean +save_timeout (EmpathyIrcNetworkManager *self) +{ + EmpathyIrcNetworkManagerPrivate *priv = + EMPATHY_IRC_NETWORK_MANAGER_GET_PRIVATE (self); + + priv->save_timer_id = 0; + irc_network_manager_file_save (self); + + return FALSE; +} + +static void +reset_save_timeout (EmpathyIrcNetworkManager *self) +{ + EmpathyIrcNetworkManagerPrivate *priv = + EMPATHY_IRC_NETWORK_MANAGER_GET_PRIVATE (self); + + if (priv->save_timer_id > 0) + { + g_source_remove (priv->save_timer_id); + } + + priv->save_timer_id = g_timeout_add (SAVE_TIMER, (GSourceFunc) save_timeout, + self); +} + static void network_modified (EmpathyIrcNetwork *network, EmpathyIrcNetworkManager *self) { + EmpathyIrcNetworkManagerPrivate *priv = + EMPATHY_IRC_NETWORK_MANAGER_GET_PRIVATE (self); + network->user_defined = TRUE; + + if (!priv->loading) + { + priv->have_to_save = TRUE; + reset_save_timeout (self); + } } static void @@ -324,8 +381,6 @@ empathy_irc_network_manager_store (EmpathyIrcNetworkManager *self) { g_return_val_if_fail (EMPATHY_IS_IRC_NETWORK_MANAGER (self), FALSE); - empathy_debug (DEBUG_DOMAIN, "Saving IRC networks"); - return irc_network_manager_file_save (self); } @@ -377,10 +432,13 @@ irc_network_manager_load_servers (EmpathyIrcNetworkManager *self) EmpathyIrcNetworkManagerPrivate *priv = EMPATHY_IRC_NETWORK_MANAGER_GET_PRIVATE (self); + priv->loading = TRUE; + load_global_file (self); load_user_file (self); - priv->modified = FALSE; + priv->loading = FALSE; + priv->have_to_save = FALSE; } static void @@ -633,6 +691,8 @@ irc_network_manager_file_save (EmpathyIrcNetworkManager *self) return FALSE; } + empathy_debug (DEBUG_DOMAIN, "Saving IRC networks"); + doc = xmlNewDoc ("1.0"); root = xmlNewNode (NULL, "networks"); xmlDocSetRootElement (doc, root); @@ -648,6 +708,8 @@ irc_network_manager_file_save (EmpathyIrcNetworkManager *self) xmlCleanupParser (); xmlMemoryDump (); + priv->have_to_save = FALSE; + return TRUE; } |