diff options
author | Xavier Claessens <xclaesse@gmail.com> | 2007-06-02 04:25:05 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@src.gnome.org> | 2007-06-02 04:25:05 +0800 |
commit | 9223336edde583afe690a3757d71188ed6ebf16d (patch) | |
tree | 1554ddeff64a9fcdb14978076ce6cb63a29d0aeb /libempathy/gossip-chatroom-manager.c | |
parent | 7a99a96e5b81b8d573104d1809364d5969b6b83d (diff) | |
download | gsoc2013-empathy-9223336edde583afe690a3757d71188ed6ebf16d.tar gsoc2013-empathy-9223336edde583afe690a3757d71188ed6ebf16d.tar.gz gsoc2013-empathy-9223336edde583afe690a3757d71188ed6ebf16d.tar.bz2 gsoc2013-empathy-9223336edde583afe690a3757d71188ed6ebf16d.tar.lz gsoc2013-empathy-9223336edde583afe690a3757d71188ed6ebf16d.tar.xz gsoc2013-empathy-9223336edde583afe690a3757d71188ed6ebf16d.tar.zst gsoc2013-empathy-9223336edde583afe690a3757d71188ed6ebf16d.zip |
Monitor changes on chatrooms.xml file and relead it when it's modified.
2007-06-01 Xavier Claessens <xclaesse@gmail.com>
* libempathy-gtk/gossip-chatrooms-window.c:
* libempathy-gtk/gossip-chat-window.c:
* libempathy/gossip-chatroom.c:
* libempathy/gossip-chatroom-manager.c:
* configure.ac: Monitor changes on chatrooms.xml file and relead it
when it's modified. connect chatroom-added/removed in some places where
needed.
svn path=/trunk/; revision=111
Diffstat (limited to 'libempathy/gossip-chatroom-manager.c')
-rw-r--r-- | libempathy/gossip-chatroom-manager.c | 66 |
1 files changed, 59 insertions, 7 deletions
diff --git a/libempathy/gossip-chatroom-manager.c b/libempathy/gossip-chatroom-manager.c index ade0b0ba0..45b787df5 100644 --- a/libempathy/gossip-chatroom-manager.c +++ b/libempathy/gossip-chatroom-manager.c @@ -31,6 +31,8 @@ #include <libxml/parser.h> #include <libxml/tree.h> +#include <libgnomevfs/gnome-vfs.h> + #include "gossip-debug.h" #include "gossip-chatroom-manager.h" #include "gossip-utils.h" @@ -43,13 +45,19 @@ #define CHATROOMS_DTD_FILENAME "gossip-chatroom-manager.dtd" struct _GossipChatroomManagerPriv { - GList *chatrooms; + GList *chatrooms; + GHashTable *monitors; }; static void gossip_chatroom_manager_class_init (GossipChatroomManagerClass *klass); static void gossip_chatroom_manager_init (GossipChatroomManager *manager); static void chatroom_manager_finalize (GObject *object); static gboolean chatroom_manager_get_all (GossipChatroomManager *manager); +static void chatroom_manager_file_changed_cb (GnomeVFSMonitorHandle *handle, + const gchar *monitor_uri, + const gchar *info_uri, + GnomeVFSMonitorEventType event_type, + GossipChatroomManager *manager); static gboolean chatroom_manager_file_parse (GossipChatroomManager *manager, const gchar *filename); static void chatroom_manager_parse_chatroom (GossipChatroomManager *manager, @@ -99,6 +107,14 @@ gossip_chatroom_manager_class_init (GossipChatroomManagerClass *klass) static void gossip_chatroom_manager_init (GossipChatroomManager *manager) { + GossipChatroomManagerPriv *priv; + + priv = GET_PRIV (manager); + + priv->monitors = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) gnome_vfs_monitor_cancel); } static void @@ -110,6 +126,7 @@ chatroom_manager_finalize (GObject *object) g_list_foreach (priv->chatrooms, (GFunc) g_object_unref, NULL); g_list_free (priv->chatrooms); + g_hash_table_destroy (priv->monitors); (G_OBJECT_CLASS (gossip_chatroom_manager_parent_class)->finalize) (object); } @@ -149,7 +166,7 @@ gossip_chatroom_manager_add (GossipChatroomManager *manager, if (!gossip_chatroom_manager_find (manager, gossip_chatroom_get_account (chatroom), gossip_chatroom_get_room (chatroom))) { - priv->chatrooms = g_list_append (priv->chatrooms, g_object_ref (chatroom)); + priv->chatrooms = g_list_prepend (priv->chatrooms, g_object_ref (chatroom)); chatroom_manager_file_save (manager); g_signal_emit (manager, signals[CHATROOM_ADDED], 0, chatroom); @@ -322,6 +339,31 @@ chatroom_manager_get_all (GossipChatroomManager *manager) return TRUE; } +static void +chatroom_manager_file_changed_cb (GnomeVFSMonitorHandle *handle, + const gchar *monitor_uri, + const gchar *info_uri, + GnomeVFSMonitorEventType event_type, + GossipChatroomManager *manager) +{ + GossipChatroomManagerPriv *priv; + GList *l; + + priv = GET_PRIV (manager); + + gossip_debug (DEBUG_DOMAIN, "Reload file: %s", monitor_uri); + + /* FIXME: This is not optimised */ + for (l = priv->chatrooms; l; l = l->next) { + g_signal_emit (manager, signals[CHATROOM_REMOVED], 0, l->data); + g_object_unref (l->data); + } + g_list_free (priv->chatrooms); + priv->chatrooms = NULL; + + chatroom_manager_get_all (manager); +} + static gboolean chatroom_manager_file_parse (GossipChatroomManager *manager, const gchar *filename) @@ -334,6 +376,19 @@ chatroom_manager_file_parse (GossipChatroomManager *manager, priv = GET_PRIV (manager); + /* Do not monitor this file twice if it's already monitored */ + if (!g_hash_table_lookup (priv->monitors, filename)) { + GnomeVFSMonitorHandle *handle; + + gnome_vfs_monitor_add (&handle, + filename, + GNOME_VFS_MONITOR_FILE, + (GnomeVFSMonitorCallback) chatroom_manager_file_changed_cb, + manager); + + g_hash_table_insert (priv->monitors, g_strdup (filename), handle); + } + gossip_debug (DEBUG_DOMAIN, "Attempting to parse file:'%s'...", filename); ctxt = xmlNewParserCtxt (); @@ -432,12 +487,9 @@ chatroom_manager_parse_chatroom (GossipChatroomManager *manager, return; } - chatroom = gossip_chatroom_new_full (account, - room, - name, - auto_connect); - + chatroom = gossip_chatroom_new_full (account, room, name, auto_connect); priv->chatrooms = g_list_prepend (priv->chatrooms, chatroom); + g_signal_emit (manager, signals[CHATROOM_ADDED], 0, chatroom); g_object_unref (account); g_free (name); |