summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2014-03-18 19:07:55 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2014-03-27 15:59:19 +0000
commit0d9b654b34ba66ccfb0ff500d65620a7d9f39e3d (patch)
tree32c61585a69f3973670e2c18d710783a19f90417
parent977aa041b3a64b94799781483c45e5cd94ea2a82 (diff)
GabbleMucFactory: find IM channels by asking the IM factory, not dbus-glib
-rw-r--r--src/connection.c1
-rw-r--r--src/im-factory.c18
-rw-r--r--src/im-factory.h3
-rw-r--r--src/muc-factory.c49
4 files changed, 52 insertions, 19 deletions
diff --git a/src/connection.c b/src/connection.c
index 4823c7ace..88202bbaa 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -332,6 +332,7 @@ _gabble_connection_create_channel_managers (TpBaseConnection *conn)
self->muc_factory = g_object_new (GABBLE_TYPE_MUC_FACTORY,
"connection", self,
+ "im-factory", self->priv->im_factory,
NULL);
g_ptr_array_add (channel_managers, self->muc_factory);
diff --git a/src/im-factory.c b/src/im-factory.c
index 4b581e339..b4b631569 100644
--- a/src/im-factory.c
+++ b/src/im-factory.c
@@ -815,3 +815,21 @@ caps_channel_manager_iface_init (gpointer g_iface,
iface->get_contact_caps = gabble_im_factory_get_contact_caps;
}
+
+GabbleIMChannel *
+gabble_im_factory_dup_channel (GabbleImFactory *self,
+ const gchar *path)
+{
+ GHashTableIter iter;
+ gpointer v;
+
+ g_hash_table_iter_init (&iter, self->priv->channels);
+
+ while (g_hash_table_iter_next (&iter, NULL, &v))
+ {
+ if (!tp_strdiff (tp_base_channel_get_object_path (v), path))
+ return GABBLE_IM_CHANNEL (g_object_ref (v));
+ }
+
+ return NULL;
+}
diff --git a/src/im-factory.h b/src/im-factory.h
index ea2110086..442d8952e 100644
--- a/src/im-factory.h
+++ b/src/im-factory.h
@@ -41,6 +41,9 @@ struct _GabbleImFactory {
GType gabble_im_factory_get_type (void);
+GabbleIMChannel *gabble_im_factory_dup_channel (GabbleImFactory *self,
+ const gchar *path);
+
/* TYPE MACROS */
#define GABBLE_TYPE_IM_FACTORY \
(gabble_im_factory_get_type ())
diff --git a/src/muc-factory.c b/src/muc-factory.c
index 2636d8ffa..bce98d577 100644
--- a/src/muc-factory.c
+++ b/src/muc-factory.c
@@ -36,6 +36,7 @@
#include "debug.h"
#include "disco.h"
#include "im-channel.h"
+#include "im-factory.h"
#ifdef ENABLE_VOIP
#include "media-factory.h"
#endif
@@ -61,6 +62,7 @@ G_DEFINE_TYPE_WITH_CODE (GabbleMucFactory, gabble_muc_factory, G_TYPE_OBJECT,
enum
{
PROP_CONNECTION = 1,
+ PROP_IM_FACTORY,
LAST_PROPERTY
};
@@ -74,6 +76,9 @@ struct _GabbleMucFactoryPrivate
GabbleConnection *conn;
gulong status_changed_id;
+ /* (transfer full) */
+ GabbleImFactory *im_factory;
+
guint message_cb_id;
/* GUINT_TO_POINTER(room_handle) => (GabbleMucChannel *) */
GHashTable *text_channels;
@@ -148,6 +153,7 @@ gabble_muc_factory_dispose (GObject *object)
priv->dispose_has_run = TRUE;
gabble_muc_factory_close_all (fac);
+ g_assert (priv->im_factory == NULL);
g_assert (priv->text_channels == NULL);
g_assert (priv->text_needed_for_tube == NULL);
g_assert (priv->queued_requests == NULL);
@@ -173,6 +179,9 @@ gabble_muc_factory_get_property (GObject *object,
case PROP_CONNECTION:
g_value_set_object (value, priv->conn);
break;
+ case PROP_IM_FACTORY:
+ g_value_set_object (value, priv->im_factory);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -192,6 +201,9 @@ gabble_muc_factory_set_property (GObject *object,
case PROP_CONNECTION:
priv->conn = g_value_get_object (value);
break;
+ case PROP_IM_FACTORY:
+ priv->im_factory = g_value_dup_object (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -218,6 +230,12 @@ gabble_muc_factory_class_init (GabbleMucFactoryClass *gabble_muc_factory_class)
GABBLE_TYPE_CONNECTION,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_CONNECTION, param_spec);
+
+ param_spec = g_param_spec_object ("im-factory", "GabbleImFactory object",
+ "IM channel factory",
+ GABBLE_TYPE_IM_FACTORY,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_IM_FACTORY, param_spec);
}
/**
@@ -877,6 +895,8 @@ gabble_muc_factory_close_all (GabbleMucFactory *self)
DEBUG ("closing channels");
+ g_clear_object (&self->priv->im_factory);
+
if (priv->status_changed_id != 0)
{
g_signal_handler_disconnect (priv->conn,
@@ -1220,41 +1240,32 @@ handle_text_channel_request (GabbleMucFactory *self,
/* look at the list of initial channels, build a set of handles to invite */
if (initial_channels != NULL)
{
- TpDBusDaemon *dbus_daemon = tp_base_connection_get_dbus_daemon (conn);
- DBusGConnection *bus = tp_proxy_get_dbus_connection (dbus_daemon);
-
for (i = 0; i < initial_channels->len; i++)
{
const char *object_path = g_ptr_array_index (initial_channels, i);
- GObject *object;
+ GabbleIMChannel *channel;
TpHandle handle;
- TpBaseConnection *connection;
-
- object = dbus_g_connection_lookup_g_object (bus, object_path);
-
- if (!GABBLE_IS_IM_CHANNEL (object))
- {
- DEBUG ("Channel %s is not an ImChannel, ignoring",
- object_path);
- continue;
- }
- connection = tp_base_channel_get_connection (
- TP_BASE_CHANNEL (object));
+ /* FIXME: this is O(number of channels * number of paths) but
+ * neither is likely to be very large so it'll do for now */
+ channel = gabble_im_factory_dup_channel (priv->im_factory,
+ object_path);
- if ((GabbleConnection *) connection != priv->conn)
+ if (channel == NULL)
{
- DEBUG ("Channel %s is from a different Connection, ignoring",
+ /* FIXME: shouldn't this raise an error? */
+ DEBUG ("Channel %s does not exist on this connection, ignoring",
object_path);
continue;
}
handle = tp_base_channel_get_target_handle (
- TP_BASE_CHANNEL (object));
+ TP_BASE_CHANNEL (channel));
tp_handle_set_add (handles, handle);
tp_intset_add (continue_handles, handle);
g_hash_table_insert (final_channels, (char *) object_path, NULL);
+ g_object_unref (channel);
}
}