aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy/gossip-chatroom-manager.c
diff options
context:
space:
mode:
authorXavier Claessens <xclaesse@gmail.com>2007-06-02 04:25:05 +0800
committerXavier Claessens <xclaesse@src.gnome.org>2007-06-02 04:25:05 +0800
commit9223336edde583afe690a3757d71188ed6ebf16d (patch)
tree1554ddeff64a9fcdb14978076ce6cb63a29d0aeb /libempathy/gossip-chatroom-manager.c
parent7a99a96e5b81b8d573104d1809364d5969b6b83d (diff)
downloadgsoc2013-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.c66
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);