aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy/empathy-tp-chat.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c
index 767aec113..8265339ac 100644
--- a/libempathy/empathy-tp-chat.c
+++ b/libempathy/empathy-tp-chat.c
@@ -54,6 +54,7 @@ struct _EmpathyTpChatPriv {
gboolean had_properties_list;
GPtrArray *properties;
gboolean ready;
+ guint nb_members;
};
typedef struct {
@@ -121,6 +122,27 @@ tp_chat_member_added_cb (EmpathyTpGroup *group,
const gchar *message,
EmpathyTpChat *chat)
{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ priv->nb_members++;
+ if (priv->nb_members > 2 && priv->remote_contact) {
+ /* We now have more than 2 members, this is not a p2p chat
+ * anymore. Remove the remote-contact as it makes no sense, the
+ * EmpathyContactList interface must be used now. */
+ g_object_unref (priv->remote_contact);
+ priv->remote_contact = NULL;
+ g_object_notify (G_OBJECT (chat), "remote-contact");
+ }
+ if (priv->nb_members <= 2 && !priv->remote_contact &&
+ !empathy_contact_is_user (contact)) {
+ /* This is a p2p chat, if it's not ourself that means this is
+ * the remote contact with who we are chatting. This is to
+ * avoid forcing the usage of the EmpathyContactList interface
+ * for p2p chats. */
+ priv->remote_contact = g_object_ref (contact);
+ g_object_notify (G_OBJECT (chat), "remote-contact");
+ }
+
g_signal_emit_by_name (chat, "members-changed",
contact, actor, reason, message,
TRUE);
@@ -134,6 +156,25 @@ tp_chat_member_removed_cb (EmpathyTpGroup *group,
const gchar *message,
EmpathyTpChat *chat)
{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ priv->nb_members--;
+ if (priv->nb_members <= 2 && !priv->remote_contact) {
+ GList *members, *l;
+
+ /* We are not a MUC anymore, get the remote contact back */
+ members = empathy_tp_group_get_members (group);
+ for (l = members; l; l = l->next) {
+ if (!empathy_contact_is_user (l->data)) {
+ priv->remote_contact = g_object_ref (l->data);
+ g_object_notify (G_OBJECT (chat), "remote-contact");
+ break;
+ }
+ }
+ g_list_foreach (members, (GFunc) g_object_unref, NULL);
+ g_list_free (members);
+ }
+
g_signal_emit_by_name (chat, "members-changed",
contact, actor, reason, message,
FALSE);