X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=src%2Fempathy-event-manager.c;h=f2bf611da03b6186da3fa7139d2441ad12e8caa8;hp=c463f693f3edd86e347df7143c187e4a903dcb9b;hb=8e588250beb9f8ba54d18c48f608ac1d1f7cdd91;hpb=ed49fdb2d4477d63e850848f88f318325fd2dec6 diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c index c463f693..f2bf611d 100644 --- a/src/empathy-event-manager.c +++ b/src/empathy-event-manager.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include @@ -639,8 +638,8 @@ invite_dialog_response_cb (GtkDialog *dialog, { EmpathyTpChat *tp_chat; TpChannel *channel; - EmpathyTpGroup *group; - EmpathyContact *self_contact; + TpHandle self_handle; + GArray *members; gtk_widget_destroy (GTK_WIDGET (approval->dialog)); approval->dialog = NULL; @@ -655,7 +654,6 @@ invite_dialog_response_cb (GtkDialog *dialog, if (empathy_dispatch_operation_claim (approval->operation)) empathy_tp_chat_close (tp_chat); - empathy_tp_chat_close (tp_chat); return; } @@ -664,25 +662,22 @@ invite_dialog_response_cb (GtkDialog *dialog, /* join the room */ channel = empathy_tp_chat_get_channel (tp_chat); - group = empathy_tp_group_new (channel); - empathy_run_until_ready (group); + self_handle = tp_channel_group_get_self_handle (channel); + members = g_array_sized_new (FALSE, FALSE, sizeof (TpHandle), 1); + g_array_append_val (members, self_handle); - self_contact = empathy_tp_group_get_self_contact (group); - empathy_tp_group_add_member (group, self_contact, NULL); + tp_cli_channel_interface_group_call_add_members (channel, -1, members, + "", NULL, NULL, NULL, NULL); empathy_dispatch_operation_approve (approval->operation); - g_object_unref (group); - g_object_unref (self_contact); + g_array_free (members, TRUE); } static void event_room_channel_process_func (EventPriv *event) { GtkWidget *dialog, *button, *image; - TpHandle room_handle; - GArray *handles; - gchar **names; TpChannel *channel = empathy_dispatch_operation_get_channel ( event->approval->operation); @@ -692,16 +687,6 @@ event_room_channel_process_func (EventPriv *event) return; } - /* get room name */ - room_handle = tp_channel_get_handle (channel, NULL); - - handles = g_array_new (FALSE, FALSE, sizeof (guint)); - g_array_append_val (handles, room_handle); - - tp_cli_connection_run_inspect_handles ( - tp_channel_borrow_connection (channel), -1, - TP_HANDLE_TYPE_ROOM, handles, &names, NULL, NULL); - /* create dialog */ dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Room invitation")); @@ -709,7 +694,7 @@ event_room_channel_process_func (EventPriv *event) gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), _("%s is inviting you to join %s"), empathy_contact_get_name (event->approval->contact), - *names); + tp_channel_get_identifier (channel)); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); @@ -729,12 +714,41 @@ event_room_channel_process_func (EventPriv *event) gtk_widget_show (dialog); - g_array_free (handles, TRUE); - g_free (names); - event->approval->dialog = dialog; } +static void +event_manager_muc_invite_got_contact_name_cb (EmpathyContact *contact, + const GError *error, + gpointer user_data, + GObject *object) +{ + EventManagerApproval *approval = (EventManagerApproval *) user_data; + TpChannel *channel; + const gchar *invite_msg; + gchar *msg; + TpHandle self_handle; + + channel = empathy_dispatch_operation_get_channel (approval->operation); + + self_handle = tp_channel_group_get_self_handle (channel); + tp_channel_group_get_local_pending_info (channel, self_handle, NULL, NULL, + &invite_msg); + + msg = g_strdup_printf (_("%s invited you to join %s"), + empathy_contact_get_name (approval->contact), + tp_channel_get_identifier (channel)); + + event_manager_add (approval->manager, + approval->contact, EMPATHY_IMAGE_GROUP_MESSAGE, msg, invite_msg, + approval, event_room_channel_process_func, NULL); + + empathy_sound_play (empathy_main_window_get (), + EMPATHY_SOUND_CONVERSATION_NEW); + + g_free (msg); +} + static void event_manager_approve_channel_cb (EmpathyDispatcher *dispatcher, EmpathyDispatchOperation *operation, EmpathyEventManager *manager) @@ -768,50 +782,44 @@ event_manager_approve_channel_cb (EmpathyDispatcher *dispatcher, handle = tp_channel_get_handle (channel, &handle_type); - if (handle_type == TP_HANDLE_TYPE_CONTACT) - { - /* 1-1 text channel, wait for the first message */ - approval->handler = g_signal_connect (tp_chat, "message-received", - G_CALLBACK (event_manager_chat_message_received_cb), approval); - } - else if (handle_type == TP_HANDLE_TYPE_ROOM) + if (tp_proxy_has_interface (channel, TP_IFACE_CHANNEL_INTERFACE_GROUP)) { - EmpathyTpGroup *group; - EmpathyPendingInfo *info; - gchar *msg; + /* Are we in local-pending ? */ + TpHandle self_handle, inviter; - group = empathy_tp_group_new (channel); - empathy_run_until_ready (group); - info = empathy_tp_group_get_invitation (group, NULL); + self_handle = tp_channel_group_get_self_handle (channel); - if (info == NULL) + if (self_handle != 0 && tp_channel_group_get_local_pending_info ( + channel, self_handle, &inviter, NULL, NULL)) { - DEBUG ("can't handle a incoming muc to which we have not been " - "invited"); + /* We are invited to a room */ + EmpathyContactFactory *contact_factory; + McAccount *account; - if (empathy_dispatch_operation_claim (approval->operation)) - empathy_tp_chat_close (tp_chat); + DEBUG ("Have been invited to %s. Ask user if he wants to accept", + tp_channel_get_identifier (channel)); - g_object_unref (group); - return; - } - - /* We are invited to a room */ - msg = g_strdup_printf ("%s invited you to join %s", - empathy_contact_get_name (info->actor), - tp_channel_get_identifier (channel)); + account = empathy_tp_chat_get_account (tp_chat); + contact_factory = empathy_contact_factory_dup_singleton (); - approval->contact = g_object_ref (info->actor); + approval->contact = empathy_contact_factory_get_from_handle ( + contact_factory, account, inviter); - event_manager_add (approval->manager, - info->actor, EMPATHY_IMAGE_GROUP_MESSAGE, msg, info->message, - approval, event_room_channel_process_func, NULL); + empathy_contact_call_when_ready (approval->contact, + EMPATHY_CONTACT_READY_NAME, + event_manager_muc_invite_got_contact_name_cb, approval, NULL, + G_OBJECT (manager)); - empathy_sound_play (empathy_main_window_get (), - EMPATHY_SOUND_CONVERSATION_NEW); + g_object_unref (contact_factory); + return; + } - g_object_unref (group); + /* if we are not invited, let's wait for the first message */ } + + /* 1-1 text channel, wait for the first message */ + approval->handler = g_signal_connect (tp_chat, "message-received", + G_CALLBACK (event_manager_chat_message_received_cb), approval); } else if (!tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA)) {