X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=src%2Fempathy-event-manager.c;h=f2bf611da03b6186da3fa7139d2441ad12e8caa8;hp=787c0e087d98e96ea14cae5f3993b603ce394a94;hb=8e588250beb9f8ba54d18c48f608ac1d1f7cdd91;hpb=9c2e004953dae519e22df6236dcc1a389a17b49c diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c index 787c0e08..f2bf611d 100644 --- a/src/empathy-event-manager.c +++ b/src/empathy-event-manager.c @@ -631,6 +631,124 @@ event_manager_tube_got_contact_name_cb (EmpathyContact *contact, } } +static void +invite_dialog_response_cb (GtkDialog *dialog, + gint response, + EventManagerApproval *approval) +{ + EmpathyTpChat *tp_chat; + TpChannel *channel; + TpHandle self_handle; + GArray *members; + + gtk_widget_destroy (GTK_WIDGET (approval->dialog)); + approval->dialog = NULL; + + tp_chat = EMPATHY_TP_CHAT (empathy_dispatch_operation_get_channel_wrapper ( + approval->operation)); + + if (response != GTK_RESPONSE_OK) + { + /* close channel */ + DEBUG ("Muc invitation rejected"); + + if (empathy_dispatch_operation_claim (approval->operation)) + empathy_tp_chat_close (tp_chat); + return; + } + + DEBUG ("Muc invitation accepted"); + + /* join the room */ + channel = empathy_tp_chat_get_channel (tp_chat); + + 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); + + tp_cli_channel_interface_group_call_add_members (channel, -1, members, + "", NULL, NULL, NULL, NULL); + + empathy_dispatch_operation_approve (approval->operation); + + g_array_free (members, TRUE); +} + +static void +event_room_channel_process_func (EventPriv *event) +{ + GtkWidget *dialog, *button, *image; + TpChannel *channel = empathy_dispatch_operation_get_channel ( + event->approval->operation); + + if (event->approval->dialog != NULL) + { + gtk_window_present (GTK_WINDOW (event->approval->dialog)); + return; + } + + /* create dialog */ + dialog = gtk_message_dialog_new (NULL, 0, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Room invitation")); + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + _("%s is inviting you to join %s"), + empathy_contact_get_name (event->approval->contact), + tp_channel_get_identifier (channel)); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), + GTK_RESPONSE_OK); + + button = gtk_dialog_add_button (GTK_DIALOG (dialog), + _("_Decline"), GTK_RESPONSE_CANCEL); + image = gtk_image_new_from_icon_name (GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), image); + + button = gtk_dialog_add_button (GTK_DIALOG (dialog), + _("_Join"), GTK_RESPONSE_OK); + image = gtk_image_new_from_icon_name (GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), image); + + g_signal_connect (dialog, "response", + G_CALLBACK (invite_dialog_response_cb), event->approval); + + gtk_widget_show (dialog); + + 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) @@ -658,10 +776,50 @@ event_manager_approve_channel_cb (EmpathyDispatcher *dispatcher, EmpathyTpChat *tp_chat = EMPATHY_TP_CHAT ( empathy_dispatch_operation_get_channel_wrapper (operation)); + TpChannel *channel = empathy_tp_chat_get_channel (tp_chat); + TpHandle handle; + TpHandleType handle_type; + + handle = tp_channel_get_handle (channel, &handle_type); + + if (tp_proxy_has_interface (channel, TP_IFACE_CHANNEL_INTERFACE_GROUP)) + { + /* Are we in local-pending ? */ + TpHandle self_handle, inviter; + + self_handle = tp_channel_group_get_self_handle (channel); + if (self_handle != 0 && tp_channel_group_get_local_pending_info ( + channel, self_handle, &inviter, NULL, NULL)) + { + /* We are invited to a room */ + EmpathyContactFactory *contact_factory; + McAccount *account; + + DEBUG ("Have been invited to %s. Ask user if he wants to accept", + tp_channel_get_identifier (channel)); + + account = empathy_tp_chat_get_account (tp_chat); + contact_factory = empathy_contact_factory_dup_singleton (); + + approval->contact = empathy_contact_factory_get_from_handle ( + contact_factory, account, inviter); + + empathy_contact_call_when_ready (approval->contact, + EMPATHY_CONTACT_READY_NAME, + event_manager_muc_invite_got_contact_name_cb, approval, NULL, + G_OBJECT (manager)); + + g_object_unref (contact_factory); + return; + } + + /* 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)) {