X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=src%2Fempathy-event-manager.c;h=0b4fa775a73157045907cb52d2017d89011daf28;hp=f8b4381b2f0d9d7f498c5b9a25f839e8c50ebf3d;hb=24a7e1a69082dceea87e4f2a4c70667f17b19637;hpb=a88f6249fe6de057d3ce7eaefa6d4c7bd6fde369 diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c index f8b4381b..0b4fa775 100644 --- a/src/empathy-event-manager.c +++ b/src/empathy-event-manager.c @@ -27,10 +27,11 @@ #include #include -#include +#include #include #include #include +#include #include #include @@ -59,8 +60,9 @@ typedef struct { EmpathyContact *contact; /* Tube dispatcher if applicable */ EmpathyTubeDispatch *tube_dispatch; - /* option signal handler */ + /* option signal handler and it's instance */ gulong handler; + GObject *handler_instance; /* optional accept widget */ GtkWidget *dialog; } EventManagerApproval; @@ -124,6 +126,10 @@ event_manager_approval_free (EventManagerApproval *approval) approval->invalidated_handler); g_object_unref (approval->operation); + if (approval->handler != 0) + g_signal_handler_disconnect (approval->handler_instance, + approval->handler); + if (approval->contact != NULL) g_object_unref (approval->contact); @@ -280,7 +286,7 @@ event_text_channel_process_func (EventPriv *event) { tp_chat = EMPATHY_TP_CHAT (empathy_dispatch_operation_get_channel_wrapper (event->approval->operation)); - + g_signal_handler_disconnect (tp_chat, event->approval->handler); event->approval->handler = 0; } @@ -367,8 +373,7 @@ event_channel_process_voip_func (EventPriv *event) return; } - dialog = gtk_message_dialog_new (GTK_WINDOW (empathy_main_window_get()), - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Incoming call")); gtk_message_dialog_format_secondary_text ( GTK_MESSAGE_DIALOG (dialog), @@ -495,21 +500,12 @@ event_manager_operation_invalidated_cb (EmpathyDispatchOperation *operation, } static void -event_manager_media_channel_got_name_cb (EmpathyContact *contact, - const GError *error, gpointer user_data, GObject *object) +event_manager_media_channel_got_contact (EventManagerApproval *approval) { - EventManagerApproval *approval = user_data; gchar *header; - if (error != NULL) - { - /* FIXME just returning assuming the operation will be invalidated as - * well */ - return; - } - header = g_strdup_printf (_("Incoming call from %s"), - empathy_contact_get_name (contact)); + empathy_contact_get_name (approval->contact)); event_manager_add (approval->manager, approval->contact, EMPATHY_IMAGE_VOIP, header, NULL, @@ -519,14 +515,6 @@ event_manager_media_channel_got_name_cb (EmpathyContact *contact, event_manager_start_ringing (approval->manager); } -static void -event_manager_media_channel_got_contact (EventManagerApproval *approval) -{ - empathy_contact_call_when_ready (approval->contact, - EMPATHY_CONTACT_READY_NAME, event_manager_media_channel_got_name_cb, - approval, NULL, G_OBJECT (approval->manager)); -} - static void event_manager_media_channel_contact_changed_cb (EmpathyTpCall *call, GParamSpec *param, EventManagerApproval *approval) @@ -599,29 +587,34 @@ event_manager_tube_dispatch_ability_cb (GObject *object, } static void -event_manager_tube_got_contact_name_cb (EmpathyContact *contact, - const GError *error, gpointer user_data, GObject *object) +event_manager_tube_got_contact_cb (EmpathyTpContactFactory *factory, + EmpathyContact *contact, + const GError *error, + gpointer user_data, + GObject *object) { EventManagerApproval *approval = (EventManagerApproval *)user_data; EmpathyTubeDispatchAbility dispatchability; if (error != NULL) { - /* FIXME?, we assume that the operation gets invalidated as well (if it - * didn't already */ - return; + /* FIXME: We should probably still display the event */ + DEBUG ("Error: %s", error->message); + return; } + approval->contact = g_object_ref (contact); + dispatchability = empathy_tube_dispatch_is_dispatchable (approval->tube_dispatch); - switch (dispatchability) { case EMPATHY_TUBE_DISPATCHABILITY_UNKNOWN: approval->handler = g_signal_connect (approval->tube_dispatch, "notify::dispatchability", G_CALLBACK (event_manager_tube_dispatch_ability_cb), approval); + approval->handler_instance = G_OBJECT (approval->tube_dispatch); break; case EMPATHY_TUBE_DISPATCHABILITY_POSSIBLE: /* fallthrough */ @@ -718,10 +711,11 @@ event_room_channel_process_func (EventPriv *event) } static void -event_manager_muc_invite_got_contact_name_cb (EmpathyContact *contact, - const GError *error, - gpointer user_data, - GObject *object) +event_manager_muc_invite_got_contact_cb (EmpathyTpContactFactory *factory, + EmpathyContact *contact, + const GError *error, + gpointer user_data, + GObject *object) { EventManagerApproval *approval = (EventManagerApproval *) user_data; TpChannel *channel; @@ -729,6 +723,14 @@ event_manager_muc_invite_got_contact_name_cb (EmpathyContact *contact, gchar *msg; TpHandle self_handle; + if (error != NULL) + { + /* FIXME: We should probably still display the event */ + DEBUG ("Error: %s", error->message); + return; + } + + approval->contact = g_object_ref (contact); channel = empathy_dispatch_operation_get_channel (approval->operation); self_handle = tp_channel_group_get_self_handle (channel); @@ -777,50 +779,42 @@ event_manager_approve_channel_cb (EmpathyDispatcher *dispatcher, 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 (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)) { + /* Are we in local-pending ? */ TpHandle self_handle, inviter; - EmpathyContactFactory *contact_factory; - McAccount *account; self_handle = tp_channel_group_get_self_handle (channel); - if (self_handle == 0 || !tp_channel_group_get_local_pending_info ( + 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 */ + EmpathyTpContactFactory *factory; + TpConnection *connection; - if (empathy_dispatch_operation_claim (approval->operation)) - empathy_tp_chat_close (tp_chat); - return; - } + DEBUG ("Have been invited to %s. Ask user if he wants to accept", + tp_channel_get_identifier (channel)); - /* We are invited to a room */ - account = empathy_tp_chat_get_account (tp_chat); - contact_factory = empathy_contact_factory_dup_singleton (); + connection = empathy_tp_chat_get_connection (tp_chat); + factory = empathy_tp_contact_factory_dup_singleton (connection); - approval->contact = empathy_contact_factory_get_from_handle ( - contact_factory, account, inviter); + empathy_tp_contact_factory_get_from_handle (factory, + inviter, event_manager_muc_invite_got_contact_cb, + approval, NULL, G_OBJECT (manager)); - 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 (factory); + return; + } - g_object_unref (contact_factory); + /* 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); + approval->handler_instance = G_OBJECT (tp_chat); } else if (!tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA)) { @@ -843,75 +837,47 @@ event_manager_approve_channel_cb (EmpathyDispatcher *dispatcher, } } - else if (!tp_strdiff (channel_type, EMP_IFACE_CHANNEL_TYPE_FILE_TRANSFER)) + else if (!tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER)) { - EmpathyContact *contact; - gchar *header; - TpHandle handle; - McAccount *account; - EmpathyContactFactory *factory; - TpChannel *channel = empathy_dispatch_operation_get_channel (operation); + EmpathyTpFile *file; + gchar *header; - factory = empathy_contact_factory_dup_singleton (); - handle = tp_channel_get_handle (channel, NULL); - account = empathy_channel_get_account (channel); - - contact = empathy_contact_factory_get_from_handle (factory, account, - handle); - - empathy_contact_run_until_ready (contact, - EMPATHY_CONTACT_READY_NAME, NULL); + file = EMPATHY_TP_FILE (empathy_dispatch_operation_get_channel_wrapper (operation)); + approval->contact = g_object_ref (empathy_tp_file_get_contact (file)); header = g_strdup_printf (_("Incoming file transfer from %s"), - empathy_contact_get_name (contact)); + empathy_contact_get_name (approval->contact)); - event_manager_add (manager, contact, EMPATHY_IMAGE_DOCUMENT_SEND, + event_manager_add (manager, approval->contact, EMPATHY_IMAGE_DOCUMENT_SEND, header, NULL, approval, event_channel_process_func, NULL); /* FIXME better sound for incoming file transfers ?*/ empathy_sound_play (empathy_main_window_get (), EMPATHY_SOUND_CONVERSATION_NEW); - g_object_unref (factory); - g_object_unref (account); g_free (header); } else if (!tp_strdiff (channel_type, EMP_IFACE_CHANNEL_TYPE_STREAM_TUBE) || !tp_strdiff (channel_type, EMP_IFACE_CHANNEL_TYPE_DBUS_TUBE)) { - EmpathyContact *contact; - TpHandle handle; - TpHandleType handle_type; - McAccount *account; - EmpathyContactFactory *factory; - EmpathyTubeDispatch *tube_dispatch; TpChannel *channel; + TpHandle handle; + TpHandleType handle_type; + TpConnection *connection; + EmpathyTpContactFactory *factory; channel = empathy_dispatch_operation_get_channel (operation); - handle = tp_channel_get_handle (channel, &handle_type); /* Only understand p2p tubes */ if (handle_type != TP_HANDLE_TYPE_CONTACT) return; - factory = empathy_contact_factory_dup_singleton (); - account = empathy_channel_get_account (channel); - - contact = empathy_contact_factory_get_from_handle (factory, account, - handle); - - tube_dispatch = empathy_tube_dispatch_new (operation); - - approval->contact = contact; - approval->tube_dispatch = tube_dispatch; - - empathy_contact_call_when_ready (contact, - EMPATHY_CONTACT_READY_NAME, event_manager_tube_got_contact_name_cb, - approval, NULL, G_OBJECT (manager)); - - g_object_unref (factory); - g_object_unref (account); + approval->tube_dispatch = empathy_tube_dispatch_new (operation); + connection = tp_channel_borrow_connection (channel); + factory = empathy_tp_contact_factory_dup_singleton (connection); + empathy_tp_contact_factory_get_from_handle (factory, handle, + event_manager_tube_got_contact_cb, approval, NULL, G_OBJECT (manager)); } else { @@ -943,19 +909,17 @@ event_manager_pendings_changed_cb (EmpathyContactList *list, { EventPriv *event = l->data; - if (event->public.contact == contact && - event->func == event_pending_subscribe_func) - { - event_remove (event); - break; + if (event->public.contact == contact && + event->func == event_pending_subscribe_func) + { + event_remove (event); + break; + } } - } return; } - empathy_contact_run_until_ready (contact, EMPATHY_CONTACT_READY_NAME, NULL); - header = g_strdup_printf (_("Subscription requested by %s"), empathy_contact_get_name (contact));