summaryrefslogtreecommitdiff
path: root/src/muc-channel.c
diff options
context:
space:
mode:
authorJonny Lamb <jonny.lamb@collabora.co.uk>2012-06-06 12:04:27 +0100
committerJonny Lamb <jonny.lamb@collabora.co.uk>2012-06-06 12:04:27 +0100
commitef939874f0b344eec7b792b76b583066817b3ca8 (patch)
tree5f148d7411e393af0a4deb4eb360b1cb73298f79 /src/muc-channel.c
parenta58250aa6e3686de8fdab854ca13bd7279435e61 (diff)
downloadtelepathy-salut-ef939874f0b344eec7b792b76b583066817b3ca8.tar.gz
muc-manager: only expose the text MUC channel when necessary
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
Diffstat (limited to 'src/muc-channel.c')
-rw-r--r--src/muc-channel.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/muc-channel.c b/src/muc-channel.c
index 2abc5907..eff9f72e 100644
--- a/src/muc-channel.c
+++ b/src/muc-channel.c
@@ -77,6 +77,7 @@ enum
READY,
JOIN_ERROR,
NEW_TUBE,
+ APPEARED,
LAST_SIGNAL
};
@@ -103,6 +104,8 @@ struct _SalutMucChannelPrivate
/* (gchar *) -> (SalutContact *) */
GHashTable *senders;
+ gboolean autoclose;
+
GHashTable *tubes;
};
@@ -713,6 +716,15 @@ salut_muc_channel_class_init (SalutMucChannelClass *salut_muc_channel_class)
* wants a value type, not an interface. */
G_TYPE_NONE, 1, TP_TYPE_BASE_CHANNEL);
+ signals[APPEARED] = g_signal_new (
+ "appeared",
+ G_OBJECT_CLASS_TYPE (salut_muc_channel_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
tp_group_mixin_class_init (object_class,
G_STRUCT_OFFSET(SalutMucChannelClass, group_class),
salut_muc_channel_add_member, NULL);
@@ -1257,6 +1269,17 @@ salut_muc_channel_received_stanza (GibberMucConnection *conn,
return;
}
+ /* are we actually hidden? */
+ if (!tp_base_channel_is_registered (base_chan))
+ {
+ DEBUG ("making MUC channel reappear!");
+ tp_base_channel_reopened_with_requested (base_chan, FALSE, from_handle);
+ g_signal_emit (self, signals[APPEARED], 0);
+ }
+
+ /* let's not autoclose now */
+ priv->autoclose = FALSE;
+
#ifdef ENABLE_OLPC
if (salut_connection_olpc_observe_muc_stanza (
SALUT_CONNECTION (base_connection),
@@ -1364,11 +1387,43 @@ salut_muc_channel_disconnected (GibberTransport *transport, gpointer user_data)
tp_base_channel_destroyed (TP_BASE_CHANNEL (self));
}
+gboolean
+salut_muc_channel_can_be_closed (SalutMucChannel *self)
+{
+ if (self->priv->tubes == NULL)
+ return TRUE;
+
+ return (g_hash_table_size (self->priv->tubes) == 0);
+}
+
+gboolean
+salut_muc_channel_get_autoclose (SalutMucChannel *self)
+{
+ return self->priv->autoclose;
+}
+
+void
+salut_muc_channel_set_autoclose (SalutMucChannel *self,
+ gboolean autoclose)
+{
+ self->priv->autoclose = autoclose;
+}
+
static void
salut_muc_channel_close (TpBaseChannel *base)
{
SalutMucChannel *self = SALUT_MUC_CHANNEL (base);
+ /* if we have some tubes around then don't close yet and just
+ * disappear from the bus, faking having closed, otherwise
+ * cheerio! */
+ if (!salut_muc_channel_can_be_closed (self))
+ {
+ self->priv->autoclose = TRUE;
+ tp_base_channel_disappear (base);
+ return;
+ }
+
salut_muc_channel_leave (self, TP_CHANNEL_GROUP_CHANGE_REASON_NONE, "");
tp_base_channel_destroyed (base);