void WebPageProxy::requestInstallMissingMediaPlugins(const String& details) { CString detail = details.utf8(); const char* detailArray[2] = { detail.data(), nullptr }; ref(); GUniquePtr<GstInstallPluginsContext> context = m_pageClient.createGstInstallPluginsContext(); GstInstallPluginsReturn result = gst_install_plugins_async(detailArray, context.get(), [](GstInstallPluginsReturn result, gpointer userData) { RefPtr<WebPageProxy> page = adoptRef(static_cast<WebPageProxy*>(userData)); if (page->isValid()) page->send(Messages::WebPage::DidEndRequestInstallMissingMediaPlugins(static_cast<uint32_t>(result))); }, this); if (result != GST_INSTALL_PLUGINS_STARTED_OK) { // If the installer didn't start, the callback will not be called, so remove the ref manually. deref(); send(Messages::WebPage::DidEndRequestInstallMissingMediaPlugins(static_cast<uint32_t>(result))); WTFLogAlways("Missing GStreamer Plugin: %s\n", detail.data()); } }
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; }
/* make sure our script gets called with the right parameters */ static void test_pb_utils_install_plugins_do_callout (const gchar * const *details, GstInstallPluginsContext * ctx, const gchar * script, GstInstallPluginsReturn expected_result) { #ifdef G_OS_UNIX GstInstallPluginsReturn ret; GError *err = NULL; gchar *path; path = g_strdup_printf ("%s/gst-plugins-base-unit-test-helper.%s.%lu", g_get_tmp_dir (), (g_get_user_name ())? g_get_user_name () : "nobody", (gulong) getpid ()); if (!g_file_set_contents (path, script, -1, &err)) { GST_DEBUG ("Failed to write test script to %s: %s", path, err->message); g_error_free (err); goto done; } if (chmod (path, S_IRUSR | S_IWUSR | S_IXUSR) != 0) { GST_DEBUG ("Could not set mode u+rwx on '%s'", path); goto done; } /* test gst_install_plugins_supported() I */ g_setenv ("GST_INSTALL_PLUGINS_HELPER", "/i/do/not/ex.ist!", 1); fail_if (gst_install_plugins_supported ()); GST_LOG ("setting GST_INSTALL_PLUGINS_HELPER to '%s'", path); g_setenv ("GST_INSTALL_PLUGINS_HELPER", path, 1); /* test gst_install_plugins_supported() II */ fail_unless (gst_install_plugins_supported ()); /* test sync callout */ ret = gst_install_plugins_sync (details, ctx); fail_unless (ret == GST_INSTALL_PLUGINS_HELPER_MISSING || ret == expected_result, "gst_install_plugins_sync() failed with unexpected ret %d, which is " "neither HELPER_MISSING nor %d", ret, expected_result); /* test async callout */ marker = -333; ret = gst_install_plugins_async (details, ctx, result_cb, (gpointer) & marker); fail_unless (ret == GST_INSTALL_PLUGINS_HELPER_MISSING || ret == GST_INSTALL_PLUGINS_STARTED_OK, "gst_install_plugins_async() failed with unexpected ret %d", ret); if (ret == GST_INSTALL_PLUGINS_STARTED_OK) { while (marker == -333) { g_usleep (500); g_main_context_iteration (NULL, FALSE); } /* and check that the callback was called with the expected code */ fail_unless_equals_int (marker, expected_result); } done: unlink (path); g_free (path); #endif /* G_OS_UNIX */ }
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; }