]> git.0d.be Git - empathy.git/commitdiff
Refactor MUC upgrading to be a feature of TpChat->add()
authorDanielle Madeley <danielle.madeley@collabora.co.uk>
Mon, 21 Dec 2009 01:51:02 +0000 (12:51 +1100)
committerDanielle Madeley <danielle.madeley@collabora.co.uk>
Mon, 21 Dec 2009 09:55:03 +0000 (20:55 +1100)
Add a method to be able to tell whether a given TpChat supports you calling
add() on it.

libempathy/empathy-tp-chat.c
libempathy/empathy-tp-chat.h
src/empathy-chat-window.c

index e53caefec5ff5cf500ba0ac3d7290a277f2ca7eb..381095efc3c004bb3389bc01a16573f379c24446 100644 (file)
 
 #include <string.h>
 
-#include <telepathy-glib/channel.h>
-#include <telepathy-glib/dbus.h>
-#include <telepathy-glib/util.h>
-#include <telepathy-glib/interfaces.h>
+#include <telepathy-glib/telepathy-glib.h>
+
+#include <extensions/extensions.h>
 
 #include "empathy-tp-chat.h"
 #include "empathy-tp-contact-factory.h"
 #include "empathy-contact-monitor.h"
 #include "empathy-contact-list.h"
+#include "empathy-dispatcher.h"
 #include "empathy-marshal.h"
 #include "empathy-time.h"
 #include "empathy-utils.h"
@@ -60,6 +60,7 @@ typedef struct {
         * (channel doesn't implement the Password interface) */
        gboolean               got_password_flags;
        gboolean               ready;
+       gboolean               can_upgrade_to_muc;
 } EmpathyTpChatPriv;
 
 static void tp_chat_iface_init         (EmpathyContactListIface *iface);
@@ -117,17 +118,54 @@ tp_chat_add (EmpathyContactList *list,
             const gchar        *message)
 {
        EmpathyTpChatPriv *priv = GET_PRIV (list);
-       TpHandle           handle;
-       GArray             handles = {(gchar *) &handle, 1};
 
-       g_return_if_fail (EMPATHY_IS_TP_CHAT (list));
-       g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+       if (tp_proxy_has_interface_by_id (priv->channel,
+               TP_IFACE_QUARK_CHANNEL_INTERFACE_GROUP)) {
+               TpHandle           handle;
+               GArray             handles = {(gchar *) &handle, 1};
 
-       handle = empathy_contact_get_handle (contact);
-       tp_cli_channel_interface_group_call_add_members (priv->channel, -1,
-                                                        &handles, NULL,
-                                                        NULL, NULL, NULL,
-                                                        NULL);
+               g_return_if_fail (EMPATHY_IS_TP_CHAT (list));
+               g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+
+               handle = empathy_contact_get_handle (contact);
+               tp_cli_channel_interface_group_call_add_members (priv->channel,
+                       -1, &handles, NULL, NULL, NULL, NULL, NULL);
+       } else if (priv->can_upgrade_to_muc) {
+               EmpathyDispatcher *dispatcher;
+               TpConnection      *connection;
+               GHashTable        *props;
+               const char        *object_path;
+               GPtrArray          channels = { (gpointer *) &object_path, 1 };
+               const char        *invitees[2] = { NULL, };
+
+               dispatcher = empathy_dispatcher_dup_singleton ();
+               connection = tp_channel_borrow_connection (priv->channel);
+
+               invitees[0] = empathy_contact_get_id (contact);
+               object_path = tp_proxy_get_object_path (priv->channel);
+
+               props = tp_asv_new (
+                   TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING,
+                       TP_IFACE_CHANNEL_TYPE_TEXT,
+                   TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_UINT,
+                       TP_HANDLE_TYPE_NONE,
+                   EMP_IFACE_CHANNEL_INTERFACE_CONFERENCE ".InitialChannels",
+                       TP_ARRAY_TYPE_OBJECT_PATH_LIST, &channels,
+                   EMP_IFACE_CHANNEL_INTERFACE_CONFERENCE ".InitialInviteeIDs",
+                       G_TYPE_STRV, invitees,
+                   /* FIXME: InvitationMessage ? */
+                   NULL);
+
+               /* Although this is a MUC, it's anonymous, so CreateChannel is
+                * valid.
+                * props now belongs to EmpathyDispatcher, don't free it */
+               empathy_dispatcher_create_channel (dispatcher, connection,
+                               props, NULL, NULL);
+
+               g_object_unref (dispatcher);
+       } else {
+               g_warning ("Cannot add to this channel");
+       }
 }
 
 static void
@@ -1219,9 +1257,14 @@ tp_chat_constructor (GType                  type,
                        handles->len, (TpHandle *) handles->data,
                        tp_chat_got_added_contacts_cb, NULL, NULL, chat);
 
+               priv->can_upgrade_to_muc = FALSE;
+
                g_signal_connect (priv->channel, "group-members-changed",
                        G_CALLBACK (tp_chat_group_members_changed_cb), chat);
        } else {
+               EmpathyDispatcher *dispatcher = empathy_dispatcher_dup_singleton ();
+               GList *list, *ptr;
+
                /* Get the self contact from the connection's self handle */
                handle = tp_connection_get_self_handle (connection);
                empathy_tp_contact_factory_get_from_handle (priv->factory,
@@ -1233,6 +1276,25 @@ tp_chat_constructor (GType                  type,
                empathy_tp_contact_factory_get_from_handle (priv->factory,
                        handle, tp_chat_got_remote_contact_cb,
                        NULL, NULL, chat);
+
+               list = empathy_dispatcher_find_requestable_channel_classes (
+                       dispatcher, connection,
+                       tp_channel_get_channel_type (priv->channel),
+                       TP_HANDLE_TYPE_ROOM, NULL);
+
+               for (ptr = list; ptr; ptr = ptr->next) {
+                       GValueArray *array = ptr->data;
+                       const char **oprops = g_value_get_boxed (
+                               g_value_array_get_nth (array, 1));
+
+                       if (tp_strv_contains (oprops, EMP_IFACE_CHANNEL_INTERFACE_CONFERENCE ".InitialChannels")) {
+                               priv->can_upgrade_to_muc = TRUE;
+                               break;
+                       }
+               }
+
+               g_list_free (list);
+               g_object_unref (dispatcher);
        }
 
        if (tp_proxy_has_interface_by_id (priv->channel,
@@ -1714,3 +1776,24 @@ empathy_tp_chat_provide_password_finish (EmpathyTpChat *self,
 
        return TRUE;
 }
+
+/**
+ * empathy_tp_chat_can_add_contact:
+ *
+ * Returns: %TRUE if empathy_contact_list_add() will work for this channel.
+ * That is if this chat is a 1-to-1 channel that can be upgraded to
+ * a MUC using the Conference interface or if the channel is a MUC.
+ */
+gboolean
+empathy_tp_chat_can_add_contact (EmpathyTpChat *self)
+{
+       EmpathyTpChatPriv *priv;
+
+       g_return_val_if_fail (EMPATHY_IS_TP_CHAT (self), FALSE);
+
+       priv = GET_PRIV (self);
+
+       return priv->can_upgrade_to_muc ||
+               tp_proxy_has_interface_by_id (priv->channel,
+                       TP_IFACE_QUARK_CHANNEL_INTERFACE_GROUP);;
+}
index 940c360957952cdbe398022e07d4499db6c869f3..6b5fc8d0b1eab6c703298c01c9d66a57cc835d57 100644 (file)
@@ -96,6 +96,7 @@ void           empathy_tp_chat_provide_password_async (EmpathyTpChat *chat,
 gboolean       empathy_tp_chat_provide_password_finish (EmpathyTpChat *chat,
                                                        GAsyncResult *result,
                                                        GError **error);
+gboolean       empathy_tp_chat_can_add_contact (EmpathyTpChat *self);
 
 G_END_DECLS
 
index 5e0ad049c3f1fa856c8a952618edaf4fa135d761..67bf7d9e7bae30775c4f2c619349256584454c83 100644 (file)
@@ -39,7 +39,6 @@
 
 #include <libempathy/empathy-contact.h>
 #include <libempathy/empathy-message.h>
-#include <libempathy/empathy-dispatcher.h>
 #include <libempathy/empathy-chatroom-manager.h>
 #include <libempathy/empathy-utils.h>
 #include <libempathy/empathy-tp-contact-factory.h>
@@ -55,8 +54,6 @@
 #include <libempathy-gtk/empathy-ui-utils.h>
 #include <libempathy-gtk/empathy-notify-manager.h>
 
-#include <extensions/extensions.h>
-
 #include "empathy-chat-window.h"
 #include "empathy-about-dialog.h"
 #include "empathy-invite-participant-dialog.h"
@@ -822,51 +819,6 @@ chat_window_contacts_toggled_cb (GtkToggleAction   *toggle_action,
        empathy_chat_set_show_contacts (priv->current_chat, active);
 }
 
-static void
-chat_window_upgrade_to_muc (EmpathyChat *chat,
-                            const char  *id)
-{
-       EmpathyDispatcher     *dispatcher = empathy_dispatcher_dup_singleton ();
-       EmpathyTpChat         *tp_chat;
-       TpConnection          *connection;
-       TpChannel             *channel;
-       GHashTable            *props;
-       GPtrArray             *channels;
-       char                  *invitees[3] = { NULL, };
-
-       tp_chat = empathy_chat_get_tp_chat (chat);
-       connection = empathy_tp_chat_get_connection (tp_chat);
-       channel = empathy_tp_chat_get_channel (tp_chat);
-
-       /* Ensure a MUC channel */
-       channels = g_ptr_array_sized_new (1);
-       g_ptr_array_add (channels, (char *) tp_proxy_get_object_path (channel));
-
-       invitees[0] = (char *) tp_channel_get_identifier (channel);
-       invitees[1] = (char *) id;
-
-       props = tp_asv_new (
-           TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING,
-               TP_IFACE_CHANNEL_TYPE_TEXT,
-           TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_UINT,
-               TP_HANDLE_TYPE_NONE,
-           EMP_IFACE_CHANNEL_INTERFACE_CONFERENCE ".InitialChannels",
-               TP_ARRAY_TYPE_OBJECT_PATH_LIST, channels,
-           EMP_IFACE_CHANNEL_INTERFACE_CONFERENCE ".InitialInviteeIDs",
-               G_TYPE_STRV, invitees,
-           /* FIXME: InvitationMessage ? */
-           NULL);
-
-       /* Although this is a MUC, it's anonymous, so CreateChannel is valid */
-       /* props now belongs to EmpathyDispatcher, don't free it */
-       empathy_dispatcher_create_channel (dispatcher, connection,
-                       props, NULL, NULL);
-
-       g_ptr_array_free (channels, TRUE);
-
-       g_object_unref (dispatcher);
-}
-
 static void
 got_contact_cb (EmpathyTpContactFactory *factory,
                 EmpathyContact          *contact,
@@ -876,13 +828,10 @@ got_contact_cb (EmpathyTpContactFactory *factory,
 {
        EmpathyTpChat *tp_chat = EMPATHY_TP_CHAT (user_data);
 
-       if (error != NULL)
-       {
+       if (error != NULL) {
                DEBUG ("Failed: %s", error->message);
                return;
-       }
-       else
-       {
+       } else {
                empathy_contact_list_add (EMPATHY_CONTACT_LIST (tp_chat),
                                contact, _("Inviting you to this room"));
        }
@@ -913,35 +862,22 @@ chat_window_invite_participant_activate_cb (GtkAction         *action,
 
        response = gtk_dialog_run (GTK_DIALOG (dialog));
 
-       if (response == GTK_RESPONSE_ACCEPT)
-       {
+       if (response == GTK_RESPONSE_ACCEPT) {
+               TpConnection *connection;
+               EmpathyTpContactFactory *factory;
                const char *id;
-               TpHandleType handle_type;
 
                id = empathy_contact_selector_dialog_get_selected (
                                EMPATHY_CONTACT_SELECTOR_DIALOG (dialog), NULL);
                if (EMP_STR_EMPTY (id)) goto out;
 
-               tp_channel_get_handle (channel, &handle_type);
-
-               if (handle_type == TP_HANDLE_TYPE_CONTACT)
-               {
-                       chat_window_upgrade_to_muc (priv->current_chat, id);
-               }
-               else
-               {
-                       TpConnection *connection;
-                       EmpathyTpContactFactory *factory;
+               connection = tp_channel_borrow_connection (channel);
+               factory = empathy_tp_contact_factory_dup_singleton (connection);
 
-                       connection = tp_channel_borrow_connection (channel);
-                       factory = empathy_tp_contact_factory_dup_singleton (connection);
+               empathy_tp_contact_factory_get_from_id (factory, id,
+                       got_contact_cb, tp_chat,  NULL, NULL);
 
-                       empathy_tp_contact_factory_get_from_id (factory, id,
-                                       got_contact_cb, tp_chat,  NULL, NULL);
-
-
-                       g_object_unref (factory);
-               }
+               g_object_unref (factory);
        }
 
 out: