+static void
+event_manager_tube_approved_cb (EventPriv *event)
+{
+ empathy_tube_dispatch_handle (event->approval->tube_dispatch);
+}
+
+static void
+event_manager_add_tube_approval (EventManagerApproval *approval,
+ EmpathyTubeDispatchAbility ability)
+{
+ const gchar *icon_name;
+ gchar *msg;
+
+ if (ability == EMPATHY_TUBE_DISPATCHABILITY_POSSIBLE)
+ {
+ icon_name = GTK_STOCK_EXECUTE;
+ msg = g_strdup_printf (_("%s is offering you an invitation."
+ " An external application will be started to handle it."),
+ empathy_contact_get_name (approval->contact));
+ }
+ else
+ {
+ icon_name = GTK_STOCK_DIALOG_ERROR;
+ msg = g_strdup_printf (_("%s is offering you an invitation, but "
+ "you don't have the needed external "
+ "application to handle it."),
+ empathy_contact_get_name (approval->contact));
+ }
+
+ event_manager_add (approval->manager, approval->contact, icon_name, msg,
+ approval, event_manager_tube_approved_cb, approval);
+
+ g_free (msg);
+}
+
+static void
+event_manager_tube_dispatch_ability_cb (GObject *object,
+ GParamSpec *spec, gpointer user_data)
+{
+ EventManagerApproval *approval = (EventManagerApproval *)user_data;
+ EmpathyTubeDispatchAbility dispatchability;
+
+ dispatchability =
+ empathy_tube_dispatch_is_dispatchable (approval->tube_dispatch);
+
+ if (dispatchability != EMPATHY_TUBE_DISPATCHABILITY_UNKNOWN)
+ {
+ event_manager_add_tube_approval (approval, dispatchability);
+ g_signal_handler_disconnect (object, approval->handler);
+ approval->handler = 0;
+ }
+}
+
+static void
+event_manager_tube_got_contact_name_cb (EmpathyContact *contact,
+ gpointer user_data)
+{
+ EventManagerApproval *approval = (EventManagerApproval *)user_data;
+ EmpathyTubeDispatchAbility dispatchability;
+
+ 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);
+ break;
+ case EMPATHY_TUBE_DISPATCHABILITY_POSSIBLE:
+ /* fallthrough */
+ case EMPATHY_TUBE_DISPATCHABILITY_IMPOSSIBLE:
+ event_manager_add_tube_approval (approval, dispatchability);
+ break;
+ }
+}
+