*/
#include "config.h"
+#include "empathy-chatroom-manager.h"
-#include <string.h>
-#include <sys/types.h>
#include <sys/stat.h>
+#include <tp-account-widgets/tpaw-utils.h>
+#include <telepathy-glib/telepathy-glib-dbus.h>
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-
-#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"
-#include "empathy-chatroom-manager.h"
-#include "empathy-channel-factory.h"
+#include "empathy-client-factory.h"
#include "empathy-utils.h"
#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
#include "empathy-debug.h"
#define CHATROOMS_XML_FILENAME "chatrooms.xml"
-#define CHATROOMS_DTD_FILENAME "empathy-chatroom-manager.dtd"
+#define CHATROOMS_DTD_RESOURCENAME "/org/gnome/Empathy/empathy-chatroom-manager.dtd"
#define SAVE_TIMER 4
static EmpathyChatroomManager *chatroom_manager_singleton = NULL;
G_CALLBACK (chatroom_changed_cb), self);
g_signal_connect (chatroom, "notify::always_urgent",
G_CALLBACK (chatroom_changed_cb), self);
+ g_signal_connect (chatroom, "notify::favorite",
+ G_CALLBACK (chatroom_changed_cb), self);
}
static void
chatroom_manager_parse_chatroom (EmpathyChatroomManager *manager,
xmlNodePtr node)
{
- EmpathyChatroomManagerPriv *priv;
- EmpathyChatroom *chatroom;
+ EmpathyChatroom *chatroom = NULL;
TpAccount *account;
xmlNodePtr child;
gchar *str;
gchar *account_id;
gboolean auto_connect;
gboolean always_urgent;
-
- priv = GET_PRIV (manager);
+ EmpathyClientFactory *factory;
+ GError *error = NULL;
/* default values. */
name = NULL;
xmlFree (str);
}
- account = tp_account_manager_ensure_account (priv->account_manager,
- account_id);
+ /* account has to be a valid Account object path */
+ if (!tp_dbus_check_valid_object_path (account_id, NULL) ||
+ !g_str_has_prefix (account_id, TP_ACCOUNT_OBJECT_PATH_BASE))
+ goto out;
+
+ factory = empathy_client_factory_dup ();
+
+ account = tp_simple_client_factory_ensure_account (
+ TP_SIMPLE_CLIENT_FACTORY (factory), account_id, NULL, &error);
+ g_object_unref (factory);
+
if (account == NULL)
{
+ DEBUG ("Failed to create account: %s", error->message);
+ g_error_free (error);
+
g_free (name);
g_free (room);
g_free (account_id);
add_chatroom (manager, chatroom);
g_signal_emit (manager, signals[CHATROOM_ADDED], 0, chatroom);
+out:
g_free (name);
g_free (room);
g_free (account_id);
- g_object_unref (chatroom);
+ tp_clear_object (&chatroom);
}
static gboolean
return FALSE;
}
- if (!empathy_xml_validate (doc, CHATROOMS_DTD_FILENAME))
+ if (!tpaw_xml_validate_from_resource (doc, CHATROOMS_DTD_RESOURCENAME))
{
g_warning ("Failed to validate file:'%s'", filename);
xmlFreeDoc (doc);
clear_chatrooms (EmpathyChatroomManager *self)
{
EmpathyChatroomManagerPriv *priv = GET_PRIV (self);
- GList *l;
+ GList *l, *tmp;
+
+ tmp = priv->chatrooms;
+
+ /* Unreffing the chatroom may result in destroying the underlying
+ * EmpathyTpChat which will fire the invalidated signal and so make us
+ * re-call this function. We already set priv->chatrooms to NULL so we won't
+ * try to destroy twice the same objects. */
+ priv->chatrooms = NULL;
- for (l = priv->chatrooms; l != NULL; l = g_list_next (l))
+ for (l = tmp; l != NULL; l = g_list_next (l))
{
EmpathyChatroom *chatroom = l->data;
g_object_unref (chatroom);
}
- g_list_free (priv->chatrooms);
- priv->chatrooms = NULL;
+ g_list_free (tmp);
}
static void
GError *error = NULL;
GFile *file = NULL;
- if (!tp_account_manager_prepare_finish (manager, result, &error))
+ if (!tp_proxy_prepare_finish (manager, result, &error))
{
DEBUG ("Failed to prepare account manager: %s", error->message);
g_error_free (error);
EmpathyChatroomManager *self;
EmpathyChatroomManagerPriv *priv;
GError *error = NULL;
- TpDBusDaemon *dbus;
- EmpathyChannelFactory *factory;
if (chatroom_manager_singleton != NULL)
return g_object_ref (chatroom_manager_singleton);
priv->account_manager = tp_account_manager_dup ();
- tp_account_manager_prepare_async (priv->account_manager, NULL,
+ tp_proxy_prepare_async (priv->account_manager, NULL,
account_manager_ready_cb, g_object_ref (self));
if (priv->file == NULL)
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,
+ priv->observer = tp_simple_observer_new_with_am (priv->account_manager, 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_HANDLE_TYPE_ROOM,
NULL));
- tp_base_client_add_connection_features_varargs (priv->observer,
- TP_CONNECTION_FEATURE_CAPABILITIES, NULL);
-
- factory = empathy_channel_factory_dup ();
-
- tp_base_client_set_channel_factory (priv->observer,
- TP_CLIENT_CHANNEL_FACTORY (factory));
-
if (!tp_base_client_register (priv->observer, &error))
{
g_critical ("Failed to register Observer: %s", error->message);
g_error_free (error);
}
- g_object_unref (factory);
return obj;
}
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
+ g_cclosure_marshal_generic,
G_TYPE_NONE,
1, EMPATHY_TYPE_CHATROOM);
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
+ g_cclosure_marshal_generic,
G_TYPE_NONE,
1, EMPATHY_TYPE_CHATROOM);