void _bp_missing_elements_destroy (BansheePlayer *player) { g_return_if_fail (IS_BANSHEE_PLAYER (player)); bp_slist_destroy (player->missing_element_details); bp_slist_destroy (player->missing_element_details_handled); if (player->install_plugins_context != NULL) { gst_install_plugins_context_free (player->install_plugins_context); } }
static void bp_missing_elements_handle_install_result (GstInstallPluginsReturn result, gpointer data) { BansheePlayer *player = (BansheePlayer *)data; g_return_if_fail (IS_BANSHEE_PLAYER (player)); // TODO: Actually handle a successful plugin installation // if (result == GST_INSTALL_PLUGINS_SUCCESS) { // } bp_missing_elements_handle_install_failed (player); gst_install_plugins_context_free (player->install_plugins_context); player->install_plugins_context = NULL; }
static gboolean bacon_video_widget_gst_on_missing_plugins_event (BaconVideoWidget *bvw, char **details, char **descriptions, gboolean playing, gpointer user_data) { GstInstallPluginsContext *install_ctx; TotemCodecInstallContext *ctx; GstInstallPluginsReturn status; guint i, num; #ifdef GDK_WINDOWING_X11 GdkDisplay *display; #endif num = g_strv_length (details); g_return_val_if_fail (num > 0 && g_strv_length (descriptions) == num, FALSE); ctx = g_new0 (TotemCodecInstallContext, 1); ctx->descriptions = g_strdupv (descriptions); ctx->details = g_strdupv (details); ctx->playing = playing; ctx->bvw = bvw; for (i = 0; i < num; ++i) { if (bacon_video_widget_gst_codec_install_plugin_is_blacklisted (ctx->details[i])) { g_message ("Missing plugin: %s (ignoring)", ctx->details[i]); g_free (ctx->details[i]); g_free (ctx->descriptions[i]); ctx->details[i] = ctx->details[num-1]; ctx->descriptions[i] = ctx->descriptions[num-1]; ctx->details[num-1] = NULL; ctx->descriptions[num-1] = NULL; --num; --i; } else { g_message ("Missing plugin: %s (%s)", ctx->details[i], ctx->descriptions[i]); } } if (num == 0) { g_message ("All missing plugins are blacklisted, doing nothing"); bacon_video_widget_gst_codec_install_context_free (ctx); return FALSE; } install_ctx = gst_install_plugins_context_new (); #ifdef GDK_WINDOWING_X11 display = gdk_display_get_default (); if (GDK_IS_X11_DISPLAY (display) && gtk_widget_get_window (GTK_WIDGET (bvw)) != NULL && gtk_widget_get_realized (GTK_WIDGET (bvw))) { gulong xid = 0; xid = bacon_video_widget_gst_get_toplevel (GTK_WIDGET (bvw)); gst_install_plugins_context_set_xid (install_ctx, xid); } #endif /* GDK_WINDOWING_X11 */ status = gst_install_plugins_async ((const char * const*) ctx->details, install_ctx, on_plugin_installation_done, ctx); gst_install_plugins_context_free (install_ctx); GST_INFO ("gst_install_plugins_async() result = %d", status); if (status != GST_INSTALL_PLUGINS_STARTED_OK) { if (status == GST_INSTALL_PLUGINS_HELPER_MISSING) { g_message ("Automatic missing codec installation not supported " "(helper script missing)"); } else { g_warning ("Failed to start codec installation: %s", gst_install_plugins_return_get_name (status)); } bacon_video_widget_gst_codec_install_context_free (ctx); return FALSE; } /* if we managed to start playing, pause playback, since some install * wizard should now take over in a second anyway and the user might not * be able to use totem's controls while the wizard is running */ if (playing) bacon_video_widget_pause (bvw); return TRUE; }
gboolean rb_missing_plugins_install (const char **details, gboolean ignore_blacklist, GClosure *closure) { RBPluginInstallContext *ctx; GstInstallPluginsContext *install_ctx; GstInstallPluginsReturn status; int i, num; num = g_strv_length ((char **)details); g_return_val_if_fail (num > 0, FALSE); ctx = g_new0 (RBPluginInstallContext, 1); ctx->closure = g_closure_ref (closure); ctx->details = g_strdupv ((char **)details); num = g_strv_length (ctx->details); for (i = 0; i < num; ++i) { if (ignore_blacklist == FALSE && rb_plugin_install_plugin_is_blacklisted (ctx->details[i])) { g_message ("Missing plugin: %s (ignoring)", ctx->details[i]); g_free (ctx->details[i]); ctx->details[i] = ctx->details[num-1]; ctx->details[num-1] = NULL; --num; --i; } else { g_message ("Missing plugin: %s", ctx->details[i]); } } if (num == 0) { g_message ("All missing plugins are blacklisted, doing nothing"); rb_plugin_install_context_free (ctx); return FALSE; } install_ctx = gst_install_plugins_context_new (); if (parent_window != NULL && gtk_widget_get_realized (GTK_WIDGET (parent_window))) { #ifdef GDK_WINDOWING_X11 gulong xid = 0; xid = gdk_x11_window_get_xid (gtk_widget_get_window (GTK_WIDGET (parent_window))); gst_install_plugins_context_set_xid (install_ctx, xid); #endif } status = gst_install_plugins_async (ctx->details, install_ctx, on_plugin_installation_done, ctx); gst_install_plugins_context_free (install_ctx); rb_debug ("gst_install_plugins_async() result = %d", status); if (status != GST_INSTALL_PLUGINS_STARTED_OK) { if (status == GST_INSTALL_PLUGINS_HELPER_MISSING) { g_message ("Automatic missing codec installation not supported " "(helper script missing)"); } else { g_warning ("Failed to start codec installation: %s", gst_install_plugins_return_get_name (status)); } rb_plugin_install_context_free (ctx); return FALSE; } return TRUE; }