diff options
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | help/hu/hu.po | 4 | ||||
-rw-r--r-- | libempathy-gtk/empathy-account-widget.c | 13 | ||||
-rw-r--r-- | libempathy-gtk/empathy-ui-utils.c | 2 | ||||
-rw-r--r-- | libempathy/empathy-chatroom-manager.c | 729 | ||||
-rw-r--r-- | libempathy/empathy-chatroom-manager.h | 60 | ||||
-rw-r--r-- | libempathy/empathy-tp-contact-factory.c | 1 | ||||
-rw-r--r-- | src/empathy-chat-manager.c | 18 |
8 files changed, 468 insertions, 361 deletions
@@ -3,5 +3,5 @@ Things you can do if you want to help: See http://live.gnome.org/Empathy/Roadmap If you want to contribute you can ask for information at - - #telepathy on freenode + - #empathy on irc.gimp.org - Telepathy's mailing list: telepathy@lists.freedesktop.org diff --git a/help/hu/hu.po b/help/hu/hu.po index 10f34868f..9f4c8633b 100644 --- a/help/hu/hu.po +++ b/help/hu/hu.po @@ -2617,7 +2617,7 @@ msgid "" "status messages</link> to provide more information about your availability " "to your contacts." msgstr "" -"A beépített állapotok listájával és jelentésével kapcsolatban lásd a <link " +"A beépített állapotok listájával és jelentésével kapcsolatban lásd az <link " "xref=\"status-icons\"/> oldalt. Felvehet <link xref=\"set-custom-message" "\">egyéni állapotüzeneteket</link> további információk közléséhez " "partnereivel az elérhetőségéről." @@ -3200,7 +3200,7 @@ msgid "" "your nickname." msgstr "" "Beceneve az Ön egyedi neve az IRC-hálózaton. A hálózaton csak egy személy " -"rendelkezhet egy adott becenévvel. Ha a <link xref=\"prob-conn-name\" role=" +"rendelkezhet egy adott becenévvel. Ha az <link xref=\"prob-conn-name\" role=" "\"error-msg\"/> hibaüzenetet kapja, akkor módosítania kell becenevét." #: C/account-irc.page:60(gui) diff --git a/libempathy-gtk/empathy-account-widget.c b/libempathy-gtk/empathy-account-widget.c index 4645040a2..b6a308aff 100644 --- a/libempathy-gtk/empathy-account-widget.c +++ b/libempathy-gtk/empathy-account-widget.c @@ -183,8 +183,17 @@ account_widget_set_control_buttons_sensitivity (EmpathyAccountWidget *self, if (sensitive) { - gtk_widget_set_can_default (priv->apply_button, TRUE); - gtk_widget_grab_default (priv->apply_button); + /* We can't grab default if the widget hasn't be packed in a + * window */ + GtkWidget *window; + + window = gtk_widget_get_toplevel (priv->apply_button); + if (window != NULL && + gtk_widget_is_toplevel (window)) + { + gtk_widget_set_can_default (priv->apply_button, TRUE); + gtk_widget_grab_default (priv->apply_button); + } } } } diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c index 5761308fa..4c1287424 100644 --- a/libempathy-gtk/empathy-ui-utils.c +++ b/libempathy-gtk/empathy-ui-utils.c @@ -1564,7 +1564,7 @@ empathy_window_iconify (GtkWindow *window, GtkStatusIcon *status_icon) gtk_status_icon_get_geometry (status_icon, NULL, &icon_location, NULL); gdk_window = gtk_widget_get_window (GTK_WIDGET (window)); - dpy = gdk_x11_drawable_get_xdisplay (gdk_window); + dpy = GDK_WINDOW_XDISPLAY (gdk_window); data[0] = icon_location.x; data[1] = icon_location.y; diff --git a/libempathy/empathy-chatroom-manager.c b/libempathy/empathy-chatroom-manager.c index 1107c4fa2..10b74d22a 100644 --- a/libempathy/empathy-chatroom-manager.c +++ b/libempathy/empathy-chatroom-manager.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2004-2007 Imendio AB - * Copyright (C) 2007-2009 Collabora Ltd. + * Copyright (C) 2007-2010 Collabora Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -32,6 +32,7 @@ #include <telepathy-glib/account-manager.h> #include <telepathy-glib/interfaces.h> +#include <telepathy-glib/simple-observer.h> #include <telepathy-glib/util.h> #include "empathy-tp-chat.h" @@ -47,6 +48,15 @@ static EmpathyChatroomManager *chatroom_manager_singleton = NULL; +static void observe_channels_cb (TpSimpleObserver *observer, + TpAccount *account, + TpConnection *connection, + GList *channels, + TpChannelDispatchOperation *dispatch_operation, + GList *requests, + TpObserveChannelsContext *context, + gpointer user_data); + #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyChatroomManager) typedef struct { @@ -57,6 +67,10 @@ typedef struct /* source id of the autosave timer */ gint save_timer_id; gboolean ready; + GFileMonitor *monitor; + gboolean writing; + + TpBaseClient *observer; } EmpathyChatroomManagerPriv; enum { @@ -84,56 +98,59 @@ G_DEFINE_TYPE (EmpathyChatroomManager, empathy_chatroom_manager, G_TYPE_OBJECT); static gboolean chatroom_manager_file_save (EmpathyChatroomManager *manager) { - EmpathyChatroomManagerPriv *priv; - xmlDocPtr doc; - xmlNodePtr root; - GList *l; - - priv = GET_PRIV (manager); - - doc = xmlNewDoc ((const xmlChar *) "1.0"); - root = xmlNewNode (NULL, (const xmlChar *) "chatrooms"); - xmlDocSetRootElement (doc, root); - - for (l = priv->chatrooms; l; l = l->next) { - EmpathyChatroom *chatroom; - xmlNodePtr node; - const gchar *account_id; - - chatroom = l->data; - - if (!empathy_chatroom_is_favorite (chatroom)) { - continue; - } - - account_id = tp_proxy_get_object_path ( - empathy_chatroom_get_account (chatroom)); - - node = xmlNewChild (root, NULL, (const xmlChar *) "chatroom", NULL); - xmlNewTextChild (node, NULL, (const xmlChar *) "name", - (const xmlChar *) empathy_chatroom_get_name (chatroom)); - xmlNewTextChild (node, NULL, (const xmlChar *) "room", - (const xmlChar *) empathy_chatroom_get_room (chatroom)); - xmlNewTextChild (node, NULL, (const xmlChar *) "account", - (const xmlChar *) account_id); - xmlNewTextChild (node, NULL, (const xmlChar *) "auto_connect", - empathy_chatroom_get_auto_connect (chatroom) ? - (const xmlChar *) "yes" : (const xmlChar *) "no"); - xmlNewTextChild (node, NULL, (const xmlChar *) "always_urgent", - empathy_chatroom_is_always_urgent (chatroom) ? - (const xmlChar *) "yes" : (const xmlChar *) "no"); - } - - /* Make sure the XML is indented properly */ - xmlIndentTreeOutput = 1; - - DEBUG ("Saving file:'%s'", priv->file); - xmlSaveFormatFileEnc (priv->file, doc, "utf-8", 1); - xmlFreeDoc (doc); - - xmlMemoryDump (); - - return TRUE; + EmpathyChatroomManagerPriv *priv; + xmlDocPtr doc; + xmlNodePtr root; + GList *l; + + priv = GET_PRIV (manager); + + priv->writing = TRUE; + + doc = xmlNewDoc ((const xmlChar *) "1.0"); + root = xmlNewNode (NULL, (const xmlChar *) "chatrooms"); + xmlDocSetRootElement (doc, root); + + for (l = priv->chatrooms; l; l = l->next) + { + EmpathyChatroom *chatroom; + xmlNodePtr node; + const gchar *account_id; + + chatroom = l->data; + + if (!empathy_chatroom_is_favorite (chatroom)) + continue; + + account_id = tp_proxy_get_object_path (empathy_chatroom_get_account ( + chatroom)); + + node = xmlNewChild (root, NULL, (const xmlChar *) "chatroom", NULL); + xmlNewTextChild (node, NULL, (const xmlChar *) "name", + (const xmlChar *) empathy_chatroom_get_name (chatroom)); + xmlNewTextChild (node, NULL, (const xmlChar *) "room", + (const xmlChar *) empathy_chatroom_get_room (chatroom)); + xmlNewTextChild (node, NULL, (const xmlChar *) "account", + (const xmlChar *) account_id); + xmlNewTextChild (node, NULL, (const xmlChar *) "auto_connect", + empathy_chatroom_get_auto_connect (chatroom) ? + (const xmlChar *) "yes" : (const xmlChar *) "no"); + xmlNewTextChild (node, NULL, (const xmlChar *) "always_urgent", + empathy_chatroom_is_always_urgent (chatroom) ? + (const xmlChar *) "yes" : (const xmlChar *) "no"); + } + + /* Make sure the XML is indented properly */ + xmlIndentTreeOutput = 1; + + DEBUG ("Saving file:'%s'", priv->file); + xmlSaveFormatFileEnc (priv->file, doc, "utf-8", 1); + xmlFreeDoc (doc); + + xmlMemoryDump (); + + priv->writing = FALSE; + return TRUE; } static gboolean @@ -153,9 +170,7 @@ reset_save_timeout (EmpathyChatroomManager *self) EmpathyChatroomManagerPriv *priv = GET_PRIV (self); if (priv->save_timer_id > 0) - { - g_source_remove (priv->save_timer_id); - } + g_source_remove (priv->save_timer_id); priv->save_timer_id = g_timeout_add_seconds (SAVE_TIMER, (GSourceFunc) save_timeout, self); @@ -163,15 +178,15 @@ reset_save_timeout (EmpathyChatroomManager *self) static void chatroom_changed_cb (EmpathyChatroom *chatroom, - GParamSpec *spec, - EmpathyChatroomManager *self) + GParamSpec *spec, + EmpathyChatroomManager *self) { reset_save_timeout (self); } static void add_chatroom (EmpathyChatroomManager *self, - EmpathyChatroom *chatroom) + EmpathyChatroom *chatroom) { EmpathyChatroomManagerPriv *priv = GET_PRIV (self); @@ -183,157 +198,165 @@ add_chatroom (EmpathyChatroomManager *self, static void chatroom_manager_parse_chatroom (EmpathyChatroomManager *manager, - xmlNodePtr node) + xmlNodePtr node) { - EmpathyChatroomManagerPriv *priv; - EmpathyChatroom *chatroom; - TpAccount *account; - xmlNodePtr child; - gchar *str; - gchar *name; - gchar *room; - gchar *account_id; - gboolean auto_connect; - gboolean always_urgent; - - priv = GET_PRIV (manager); - - /* default values. */ - name = NULL; - room = NULL; - auto_connect = TRUE; - always_urgent = FALSE; - account_id = NULL; - - for (child = node->children; child; child = child->next) { - gchar *tag; - - if (xmlNodeIsText (child)) { - continue; - } - - tag = (gchar *) child->name; - str = (gchar *) xmlNodeGetContent (child); - - if (strcmp (tag, "name") == 0) { - name = g_strdup (str); - } - else if (strcmp (tag, "room") == 0) { - room = g_strdup (str); - } - else if (strcmp (tag, "auto_connect") == 0) { - if (strcmp (str, "yes") == 0) { - auto_connect = TRUE; - } else { - auto_connect = FALSE; - } - } - else if (!tp_strdiff (tag, "always_urgent")) { - if (strcmp (str, "yes") == 0) { - always_urgent = TRUE; - } else { - always_urgent = FALSE; - } - } - else if (strcmp (tag, "account") == 0) { - account_id = g_strdup (str); - } - - xmlFree (str); - } - - account = tp_account_manager_ensure_account (priv->account_manager, - account_id); - if (!account) { - g_free (name); - g_free (room); - g_free (account_id); - return; - } - - chatroom = empathy_chatroom_new_full (account, room, name, auto_connect); - empathy_chatroom_set_favorite (chatroom, TRUE); - empathy_chatroom_set_always_urgent (chatroom, always_urgent); - add_chatroom (manager, chatroom); - g_signal_emit (manager, signals[CHATROOM_ADDED], 0, chatroom); - - g_free (name); - g_free (room); - g_free (account_id); + EmpathyChatroomManagerPriv *priv; + EmpathyChatroom *chatroom; + TpAccount *account; + xmlNodePtr child; + gchar *str; + gchar *name; + gchar *room; + gchar *account_id; + gboolean auto_connect; + gboolean always_urgent; + + priv = GET_PRIV (manager); + + /* default values. */ + name = NULL; + room = NULL; + auto_connect = TRUE; + always_urgent = FALSE; + account_id = NULL; + + for (child = node->children; child; child = child->next) + { + gchar *tag; + + if (xmlNodeIsText (child)) + continue; + + tag = (gchar *) child->name; + str = (gchar *) xmlNodeGetContent (child); + + if (strcmp (tag, "name") == 0) + { + name = g_strdup (str); + } + else if (strcmp (tag, "room") == 0) + { + room = g_strdup (str); + } + else if (strcmp (tag, "auto_connect") == 0) + { + if (strcmp (str, "yes") == 0) + auto_connect = TRUE; + else + auto_connect = FALSE; + } + else if (!tp_strdiff (tag, "always_urgent")) + { + if (strcmp (str, "yes") == 0) + always_urgent = TRUE; + else + always_urgent = FALSE; + } + else if (strcmp (tag, "account") == 0) + { + account_id = g_strdup (str); + } + + xmlFree (str); + } + + account = tp_account_manager_ensure_account (priv->account_manager, + account_id); + if (account == NULL) + { + g_free (name); + g_free (room); + g_free (account_id); + return; + } + + chatroom = empathy_chatroom_new_full (account, room, name, auto_connect); + empathy_chatroom_set_favorite (chatroom, TRUE); + empathy_chatroom_set_always_urgent (chatroom, always_urgent); + add_chatroom (manager, chatroom); + g_signal_emit (manager, signals[CHATROOM_ADDED], 0, chatroom); + + g_free (name); + g_free (room); + g_free (account_id); } static gboolean chatroom_manager_file_parse (EmpathyChatroomManager *manager, - const gchar *filename) + const gchar *filename) { - EmpathyChatroomManagerPriv *priv; - xmlParserCtxtPtr ctxt; - xmlDocPtr doc; - xmlNodePtr chatrooms; - xmlNodePtr node; + EmpathyChatroomManagerPriv *priv; + xmlParserCtxtPtr ctxt; + xmlDocPtr doc; + xmlNodePtr chatrooms; + xmlNodePtr node; - priv = GET_PRIV (manager); + priv = GET_PRIV (manager); - DEBUG ("Attempting to parse file:'%s'...", filename); + DEBUG ("Attempting to parse file:'%s'...", filename); - ctxt = xmlNewParserCtxt (); + ctxt = xmlNewParserCtxt (); - /* Parse and validate the file. */ - doc = xmlCtxtReadFile (ctxt, filename, NULL, 0); - if (!doc) { - g_warning ("Failed to parse file:'%s'", filename); - xmlFreeParserCtxt (ctxt); - return FALSE; - } + /* Parse and validate the file. */ + doc = xmlCtxtReadFile (ctxt, filename, NULL, 0); + if (doc == NULL) + { + g_warning ("Failed to parse file:'%s'", filename); + xmlFreeParserCtxt (ctxt); + return FALSE; + } - if (!empathy_xml_validate (doc, CHATROOMS_DTD_FILENAME)) { - g_warning ("Failed to validate file:'%s'", filename); - xmlFreeDoc (doc); - xmlFreeParserCtxt (ctxt); - return FALSE; - } + if (!empathy_xml_validate (doc, CHATROOMS_DTD_FILENAME)) + { + g_warning ("Failed to validate file:'%s'", filename); + xmlFreeDoc (doc); + xmlFreeParserCtxt (ctxt); + return FALSE; + } - /* The root node, chatrooms. */ - chatrooms = xmlDocGetRootElement (doc); + /* The root node, chatrooms. */ + chatrooms = xmlDocGetRootElement (doc); - for (node = chatrooms->children; node; node = node->next) { - if (strcmp ((gchar *) node->name, "chatroom") == 0) { - chatroom_manager_parse_chatroom (manager, node); - } - } + for (node = chatrooms->children; node; node = node->next) + { + if (strcmp ((gchar *) node->name, "chatroom") == 0) + chatroom_manager_parse_chatroom (manager, node); + } - DEBUG ("Parsed %d chatrooms", g_list_length (priv->chatrooms)); + DEBUG ("Parsed %d chatrooms", g_list_length (priv->chatrooms)); - xmlFreeDoc (doc); - xmlFreeParserCtxt (ctxt); + xmlFreeDoc (doc); + xmlFreeParserCtxt (ctxt); - return TRUE; + return TRUE; } static gboolean chatroom_manager_get_all (EmpathyChatroomManager *manager) { - EmpathyChatroomManagerPriv *priv; + EmpathyChatroomManagerPriv *priv; - priv = GET_PRIV (manager); + priv = GET_PRIV (manager); - /* read file in */ - if (g_file_test (priv->file, G_FILE_TEST_EXISTS) && - !chatroom_manager_file_parse (manager, priv->file)) { - return FALSE; - } + /* read file in */ + if (g_file_test (priv->file, G_FILE_TEST_EXISTS) && + !chatroom_manager_file_parse (manager, priv->file)) + return FALSE; - priv->ready = TRUE; - g_object_notify (G_OBJECT (manager), "ready"); + if (!priv->ready) + { + priv->ready = TRUE; + g_object_notify (G_OBJECT (manager), "ready"); + } - return TRUE; + return TRUE; } static void empathy_chatroom_manager_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) + guint property_id, + GValue *value, + GParamSpec *pspec) { EmpathyChatroomManager *self = EMPATHY_CHATROOM_MANAGER (object); EmpathyChatroomManagerPriv *priv = GET_PRIV (self); @@ -354,9 +377,9 @@ empathy_chatroom_manager_get_property (GObject *object, static void empathy_chatroom_manager_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) + guint property_id, + const GValue *value, + GParamSpec *pspec) { EmpathyChatroomManager *self = EMPATHY_CHATROOM_MANAGER (object); EmpathyChatroomManagerPriv *priv = GET_PRIV (self); @@ -374,23 +397,23 @@ empathy_chatroom_manager_set_property (GObject *object, } static void -chatroom_manager_finalize (GObject *object) +chatroom_manager_dispose (GObject *object) { - EmpathyChatroomManager *self = EMPATHY_CHATROOM_MANAGER (object); EmpathyChatroomManagerPriv *priv; - GList *l; priv = GET_PRIV (object); - g_object_unref (priv->account_manager); + tp_clear_object (&priv->observer); + tp_clear_object (&priv->monitor); - if (priv->save_timer_id > 0) - { - /* have to save before destroy the object */ - g_source_remove (priv->save_timer_id); - priv->save_timer_id = 0; - chatroom_manager_file_save (self); - } + (G_OBJECT_CLASS (empathy_chatroom_manager_parent_class)->dispose) (object); +} + +static void +clear_chatrooms (EmpathyChatroomManager *self) +{ + EmpathyChatroomManagerPriv *priv = GET_PRIV (self); + GList *l; for (l = priv->chatrooms; l != NULL; l = g_list_next (l)) { @@ -398,24 +421,72 @@ chatroom_manager_finalize (GObject *object) g_signal_handlers_disconnect_by_func (chatroom, chatroom_changed_cb, self); + g_signal_emit (self, signals[CHATROOM_REMOVED], 0, chatroom); g_object_unref (chatroom); } g_list_free (priv->chatrooms); + priv->chatrooms = NULL; +} + +static void +chatroom_manager_finalize (GObject *object) +{ + EmpathyChatroomManager *self = EMPATHY_CHATROOM_MANAGER (object); + EmpathyChatroomManagerPriv *priv; + + priv = GET_PRIV (object); + + g_object_unref (priv->account_manager); + + if (priv->save_timer_id > 0) + { + /* have to save before destroy the object */ + g_source_remove (priv->save_timer_id); + priv->save_timer_id = 0; + chatroom_manager_file_save (self); + } + + clear_chatrooms (self); + g_free (priv->file); (G_OBJECT_CLASS (empathy_chatroom_manager_parent_class)->finalize) (object); } static void +file_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + EmpathyChatroomManager *self = user_data; + EmpathyChatroomManagerPriv *priv = GET_PRIV (self); + + if (event_type != G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT) + return; + + if (priv->writing) + return; + + DEBUG ("chatrooms file changed; reloading list"); + + clear_chatrooms (self); + chatroom_manager_get_all (self); +} + +static void account_manager_ready_cb (GObject *source_object, - GAsyncResult *result, - gpointer user_data) + GAsyncResult *result, + gpointer user_data) { EmpathyChatroomManager *self = EMPATHY_CHATROOM_MANAGER (user_data); + EmpathyChatroomManagerPriv *priv = GET_PRIV (self); TpAccountManager *manager = TP_ACCOUNT_MANAGER (source_object); GError *error = NULL; + GFile *file = NULL; if (!tp_account_manager_prepare_finish (manager, result, &error)) { @@ -426,18 +497,37 @@ account_manager_ready_cb (GObject *source_object, chatroom_manager_get_all (self); + /* Set up file monitor */ + file = g_file_new_for_path (priv->file); + + priv->monitor = g_file_monitor (file, 0, NULL, &error); + if (priv->monitor == NULL) + { + DEBUG ("Failed to create file monitor on %s: %s", priv->file, + error->message); + + g_error_free (error); + goto out; + } + + g_signal_connect (priv->monitor, "changed", G_CALLBACK (file_changed_cb), + self); + out: + tp_clear_object (&file); g_object_unref (self); } static GObject * empathy_chatroom_manager_constructor (GType type, - guint n_props, - GObjectConstructParam *props) + guint n_props, + GObjectConstructParam *props) { GObject *obj; EmpathyChatroomManager *self; EmpathyChatroomManagerPriv *priv; + GError *error = NULL; + TpDBusDaemon *dbus; if (chatroom_manager_singleton != NULL) return g_object_ref (chatroom_manager_singleton); @@ -472,6 +562,38 @@ empathy_chatroom_manager_constructor (GType type, g_free (dir); } + dbus = tp_dbus_daemon_dup (&error); + if (dbus == NULL) + { + g_warning ("Failed to get TpDBusDaemon: %s", error->message); + + g_error_free (error); + return obj; + } + + /* Setup a room observer */ + priv->observer = tp_simple_observer_new (dbus, TRUE, + "Empathy.ChatroomManager", TRUE, observe_channels_cb, self, NULL); + + g_object_unref (dbus); + + tp_base_client_take_observer_filter (priv->observer, tp_asv_new ( + TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING, + TP_IFACE_CHANNEL_TYPE_TEXT, + TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT, + TP_HANDLE_TYPE_ROOM, + NULL)); + + tp_base_client_add_connection_features_varargs (priv->observer, + TP_CONNECTION_FEATURE_CAPABILITIES, NULL); + + if (!tp_base_client_register (priv->observer, &error)) + { + g_critical ("Failed to register Observer: %s", error->message); + + g_error_free (error); + } + return obj; } @@ -484,7 +606,8 @@ empathy_chatroom_manager_class_init (EmpathyChatroomManagerClass *klass) object_class->constructor = empathy_chatroom_manager_constructor; object_class->get_property = empathy_chatroom_manager_get_property; object_class->set_property = empathy_chatroom_manager_set_property; - object_class->finalize = chatroom_manager_finalize; + object_class->dispose = chatroom_manager_dispose; + object_class->finalize = chatroom_manager_finalize; param_spec = g_param_spec_string ( "file", @@ -543,7 +666,7 @@ empathy_chatroom_manager_dup_singleton (const gchar *file) gboolean empathy_chatroom_manager_add (EmpathyChatroomManager *manager, - EmpathyChatroom *chatroom) + EmpathyChatroom *chatroom) { EmpathyChatroomManagerPriv *priv; @@ -571,7 +694,7 @@ empathy_chatroom_manager_add (EmpathyChatroomManager *manager, static void chatroom_manager_remove_link (EmpathyChatroomManager *manager, - GList *l) + GList *l) { EmpathyChatroomManagerPriv *priv; EmpathyChatroom *chatroom; @@ -593,7 +716,7 @@ chatroom_manager_remove_link (EmpathyChatroomManager *manager, void empathy_chatroom_manager_remove (EmpathyChatroomManager *manager, - EmpathyChatroom *chatroom) + EmpathyChatroom *chatroom) { EmpathyChatroomManagerPriv *priv; GList *l; @@ -620,113 +743,86 @@ empathy_chatroom_manager_remove (EmpathyChatroomManager *manager, EmpathyChatroom * empathy_chatroom_manager_find (EmpathyChatroomManager *manager, - TpAccount *account, - const gchar *room) + TpAccount *account, + const gchar *room) { - EmpathyChatroomManagerPriv *priv; - GList *l; + EmpathyChatroomManagerPriv *priv; + GList *l; - g_return_val_if_fail (EMPATHY_IS_CHATROOM_MANAGER (manager), NULL); - g_return_val_if_fail (room != NULL, NULL); + g_return_val_if_fail (EMPATHY_IS_CHATROOM_MANAGER (manager), NULL); + g_return_val_if_fail (room != NULL, NULL); - priv = GET_PRIV (manager); + priv = GET_PRIV (manager); - for (l = priv->chatrooms; l; l = l->next) { - EmpathyChatroom *chatroom; - TpAccount *this_account; - const gchar *this_room; + for (l = priv->chatrooms; l; l = l->next) + { + EmpathyChatroom *chatroom; + TpAccount *this_account; + const gchar *this_room; - chatroom = l->data; - this_account = empathy_chatroom_get_account (chatroom); - this_room = empathy_chatroom_get_room (chatroom); + chatroom = l->data; + this_account = empathy_chatroom_get_account (chatroom); + this_room = empathy_chatroom_get_room (chatroom); - if (this_account && this_room && account == this_account - && strcmp (this_room, room) == 0) { - return chatroom; - } - } + if (this_account && this_room && account == this_account + && strcmp (this_room, room) == 0) + return chatroom; + } - return NULL; + return NULL; } EmpathyChatroom * empathy_chatroom_manager_ensure_chatroom (EmpathyChatroomManager *manager, - TpAccount *account, - const gchar *room, - const gchar *name) -{ - EmpathyChatroom *chatroom; - - chatroom = empathy_chatroom_manager_find (manager, account, room); - - if (chatroom) { - return g_object_ref (chatroom); - } else { - chatroom = empathy_chatroom_new_full (account, - room, - name, - FALSE); - empathy_chatroom_manager_add (manager, chatroom); - return chatroom; - } -} - -GList * -empathy_chatroom_manager_get_chatrooms (EmpathyChatroomManager *manager, - TpAccount *account) + TpAccount *account, + const gchar *room, + const gchar *name) { - EmpathyChatroomManagerPriv *priv; - GList *chatrooms, *l; - - g_return_val_if_fail (EMPATHY_IS_CHATROOM_MANAGER (manager), NULL); - - priv = GET_PRIV (manager); - - if (!account) { - return g_list_copy (priv->chatrooms); - } - - chatrooms = NULL; - for (l = priv->chatrooms; l; l = l->next) { - EmpathyChatroom *chatroom; - - chatroom = l->data; + EmpathyChatroom *chatroom; - if (account == empathy_chatroom_get_account (chatroom)) { - chatrooms = g_list_append (chatrooms, chatroom); - } - } + chatroom = empathy_chatroom_manager_find (manager, account, room); - return chatrooms; + if (chatroom) + { + return g_object_ref (chatroom); + } + else + { + chatroom = empathy_chatroom_new_full (account, + room, + name, + FALSE); + empathy_chatroom_manager_add (manager, chatroom); + return chatroom; + } } -guint -empathy_chatroom_manager_get_count (EmpathyChatroomManager *manager, - TpAccount *account) +GList * +empathy_chatroom_manager_get_chatrooms (EmpathyChatroomManager *manager, + TpAccount *account) { - EmpathyChatroomManagerPriv *priv; - GList *l; - guint count = 0; + EmpathyChatroomManagerPriv *priv; + GList *chatrooms, *l; - g_return_val_if_fail (EMPATHY_IS_CHATROOM_MANAGER (manager), 0); + g_return_val_if_fail (EMPATHY_IS_CHATROOM_MANAGER (manager), NULL); - priv = GET_PRIV (manager); + priv = GET_PRIV (manager); - if (!account) { - return g_list_length (priv->chatrooms); - } + if (!account) + return g_list_copy (priv->chatrooms); - for (l = priv->chatrooms; l; l = l->next) { - EmpathyChatroom *chatroom; + chatrooms = NULL; + for (l = priv->chatrooms; l; l = l->next) + { + EmpathyChatroom *chatroom; - chatroom = l->data; + chatroom = l->data; - if (account == empathy_chatroom_get_account (chatroom)) { - count++; - } - } + if (account == empathy_chatroom_get_account (chatroom)) + chatrooms = g_list_append (chatrooms, chatroom); + } - return count; + return chatrooms; } static void @@ -757,35 +853,50 @@ chatroom_manager_chat_destroyed_cb (EmpathyTpChat *chat, } } -/* Called by EmpathyChatManager when we are handling a new group chat */ -void -empathy_chatroom_manager_chat_handled (EmpathyChatroomManager *self, - EmpathyTpChat *chat, - TpAccount *account) +static void +observe_channels_cb (TpSimpleObserver *observer, + TpAccount *account, + TpConnection *connection, + GList *channels, + TpChannelDispatchOperation *dispatch_operation, + GList *requests, + TpObserveChannelsContext *context, + gpointer user_data) { - EmpathyChatroom *chatroom; - const gchar *roomname; + EmpathyChatroomManager *self = user_data; + GList *l; - roomname = empathy_tp_chat_get_id (chat); + for (l = channels; l != NULL; l = g_list_next (l)) + { + TpChannel *channel = l->data; + EmpathyTpChat *tp_chat; + const gchar *roomname; + EmpathyChatroom *chatroom; - chatroom = empathy_chatroom_manager_find (self, account, roomname); + if (tp_proxy_get_invalidated (channel) != NULL) + continue; - if (chatroom == NULL) - { - chatroom = empathy_chatroom_new_full (account, roomname, roomname, - FALSE); - empathy_chatroom_set_tp_chat (chatroom, chat); - empathy_chatroom_manager_add (self, chatroom); - g_object_unref (chatroom); - } - else - { - empathy_chatroom_set_tp_chat (chatroom, chat); + tp_chat = empathy_tp_chat_new (account, channel); + roomname = empathy_tp_chat_get_id (tp_chat); + chatroom = empathy_chatroom_manager_find (self, account, roomname); + + if (chatroom == NULL) + { + chatroom = empathy_chatroom_new_full (account, roomname, roomname, + FALSE); + empathy_chatroom_manager_add (self, chatroom); + g_object_unref (chatroom); + } + + empathy_chatroom_set_tp_chat (chatroom, tp_chat); + g_object_unref (tp_chat); + + /* A TpChat is always destroyed as it only gets unreffed after the channel + * has been invalidated in the dispatcher.. */ + g_signal_connect (tp_chat, "destroy", + G_CALLBACK (chatroom_manager_chat_destroyed_cb), + self); } - /* A TpChat is always destroyed as it only gets unreffed after the channel - * has been invalidated in the dispatcher.. */ - g_signal_connect (chat, "destroy", - G_CALLBACK (chatroom_manager_chat_destroyed_cb), - self); + tp_observe_channels_context_accept (context); } diff --git a/libempathy/empathy-chatroom-manager.h b/libempathy/empathy-chatroom-manager.h index 692a8e4c7..5afb2b474 100644 --- a/libempathy/empathy-chatroom-manager.h +++ b/libempathy/empathy-chatroom-manager.h @@ -1,7 +1,6 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Copyright (C) 2004-2007 Imendio AB - * Copyright (C) 2007-2008 Collabora Ltd. + * Copyright (C) 2007-2010 Collabora Ltd. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -44,36 +43,41 @@ G_BEGIN_DECLS typedef struct _EmpathyChatroomManager EmpathyChatroomManager; typedef struct _EmpathyChatroomManagerClass EmpathyChatroomManagerClass; -struct _EmpathyChatroomManager { - GObject parent; - gpointer priv; +struct _EmpathyChatroomManager +{ + GObject parent; + gpointer priv; }; -struct _EmpathyChatroomManagerClass { - GObjectClass parent_class; +struct _EmpathyChatroomManagerClass +{ + GObjectClass parent_class; }; -GType empathy_chatroom_manager_get_type (void) G_GNUC_CONST; -EmpathyChatroomManager *empathy_chatroom_manager_dup_singleton (const gchar *file); -gboolean empathy_chatroom_manager_add (EmpathyChatroomManager *manager, - EmpathyChatroom *chatroom); -void empathy_chatroom_manager_remove (EmpathyChatroomManager *manager, - EmpathyChatroom *chatroom); -EmpathyChatroom * empathy_chatroom_manager_find (EmpathyChatroomManager *manager, - TpAccount *account, - const gchar *room); -EmpathyChatroom * empathy_chatroom_manager_ensure_chatroom (EmpathyChatroomManager *manager, - TpAccount *account, - const gchar *room, - const gchar *name); -GList * empathy_chatroom_manager_get_chatrooms (EmpathyChatroomManager *manager, - TpAccount *account); -guint empathy_chatroom_manager_get_count (EmpathyChatroomManager *manager, - TpAccount *account); - -void empathy_chatroom_manager_chat_handled (EmpathyChatroomManager *self, - EmpathyTpChat *chat, - TpAccount *account); +GType empathy_chatroom_manager_get_type (void) G_GNUC_CONST; + +EmpathyChatroomManager * empathy_chatroom_manager_dup_singleton ( + const gchar *file); + +gboolean empathy_chatroom_manager_add (EmpathyChatroomManager *manager, + EmpathyChatroom *chatroom); + +void empathy_chatroom_manager_remove (EmpathyChatroomManager *manager, + EmpathyChatroom *chatroom); + +EmpathyChatroom * empathy_chatroom_manager_find ( + EmpathyChatroomManager *manager, + TpAccount *account, + const gchar *room); + +EmpathyChatroom * empathy_chatroom_manager_ensure_chatroom ( + EmpathyChatroomManager *manager, + TpAccount *account, + const gchar *room, + const gchar *name); + +GList * empathy_chatroom_manager_get_chatrooms (EmpathyChatroomManager *manager, + TpAccount *account); G_END_DECLS diff --git a/libempathy/empathy-tp-contact-factory.c b/libempathy/empathy-tp-contact-factory.c index 87c65385e..681c882ee 100644 --- a/libempathy/empathy-tp-contact-factory.c +++ b/libempathy/empathy-tp-contact-factory.c @@ -28,6 +28,7 @@ static TpContactFeature contact_features[] = { TP_CONTACT_FEATURE_ALIAS, + TP_CONTACT_FEATURE_AVATAR_DATA, TP_CONTACT_FEATURE_PRESENCE, TP_CONTACT_FEATURE_LOCATION, TP_CONTACT_FEATURE_CAPABILITIES, diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c index 946aecb97..38c91fa4d 100644 --- a/src/empathy-chat-manager.c +++ b/src/empathy-chat-manager.c @@ -100,22 +100,6 @@ chat_data_free (ChatData *data) } static void -tell_chatroom_manager_if_needed (EmpathyChatManager *self, - TpAccount *account, - EmpathyTpChat *chat) -{ - EmpathyChatManagerPriv *priv = GET_PRIV (self); - TpHandleType type; - - tp_channel_get_handle (empathy_tp_chat_get_channel (chat), &type); - - if (type == TP_HANDLE_TYPE_ROOM) - { - empathy_chatroom_manager_chat_handled (priv->chatroom_mgr, chat, account); - } -} - -static void process_tp_chat (EmpathyChatManager *self, EmpathyTpChat *tp_chat, TpAccount *account, @@ -124,8 +108,6 @@ process_tp_chat (EmpathyChatManager *self, EmpathyChat *chat = NULL; const gchar *id; - tell_chatroom_manager_if_needed (self, account, tp_chat); - id = empathy_tp_chat_get_id (tp_chat); if (!tp_str_empty (id)) { |