blob: 95ac614eea888a083e35cd246f3005616b010ccb [file] [log] [blame]
/*
* Copyright (C) 2010 Igalia S.L.
* Copyright (C) 2011 Gustavo Noronha Silva <gns@gnome.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include "webkitwebplugin.h"
#include "PluginPackage.h"
#include "webkitglobalsprivate.h"
#include "webkitwebpluginprivate.h"
#include <glib/gi18n-lib.h>
/**
* SECTION:webkitwebplugin
* @short_description: Represents a plugin, enabling fine-grained control
* @see_also: #WebKitWebPluginDatabase
*
* This object represents a single plugin, found by WebKitGTK+ while
* scanning the various usual directories. This object can be used to
* get more information about a plugin, and enable/disable it,
* allowing fine-grained control of plugins. The list of available
* plugins can be obtained from the #WebKitWebPluginDatabase object.
*/
using namespace WebCore;
enum {
PROP_0,
PROP_ENABLED
};
G_DEFINE_TYPE(WebKitWebPlugin, webkit_web_plugin, G_TYPE_OBJECT)
static void freeMIMEType(WebKitWebPluginMIMEType* mimeType)
{
if (mimeType->name)
g_free(mimeType->name);
if (mimeType->description)
g_free(mimeType->description);
if (mimeType->extensions)
g_strfreev(mimeType->extensions);
g_slice_free(WebKitWebPluginMIMEType, mimeType);
}
static void webkit_web_plugin_finalize(GObject* object)
{
WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(object);
WebKitWebPluginPrivate* priv = plugin->priv;
g_free(priv->path);
g_slist_foreach(priv->mimeTypes, (GFunc)freeMIMEType, 0);
g_slist_free(priv->mimeTypes);
delete plugin->priv;
G_OBJECT_CLASS(webkit_web_plugin_parent_class)->finalize(object);
}
static void webkit_web_plugin_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* paramSpec)
{
WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(object);
switch (prop_id) {
case PROP_ENABLED:
g_value_set_boolean(value, webkit_web_plugin_get_enabled(plugin));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, paramSpec);
}
}
static void webkit_web_plugin_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* paramSpec)
{
WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(object);
switch (prop_id) {
case PROP_ENABLED:
webkit_web_plugin_set_enabled(plugin, g_value_get_boolean(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, paramSpec);
}
}
static void webkit_web_plugin_class_init(WebKitWebPluginClass* klass)
{
webkitInit();
GObjectClass* gobjectClass = reinterpret_cast<GObjectClass*>(klass);
gobjectClass->finalize = webkit_web_plugin_finalize;
gobjectClass->get_property = webkit_web_plugin_get_property;
gobjectClass->set_property = webkit_web_plugin_set_property;
g_object_class_install_property(gobjectClass,
PROP_ENABLED,
g_param_spec_boolean("enabled",
_("Enabled"),
_("Whether the plugin is enabled"),
FALSE,
WEBKIT_PARAM_READWRITE));
}
static void webkit_web_plugin_init(WebKitWebPlugin *plugin)
{
plugin->priv = new WebKitWebPluginPrivate();
plugin->priv->mimeTypes = 0;
}
namespace WebKit {
WebKitWebPlugin* kitNew(WebCore::PluginPackage* package)
{
WebKitWebPlugin* plugin = WEBKIT_WEB_PLUGIN(g_object_new(WEBKIT_TYPE_WEB_PLUGIN, 0));
plugin->priv->corePlugin = package;
return plugin;
}
}
/**
* webkit_web_plugin_get_name:
* @plugin: a #WebKitWebPlugin
*
* Returns: the name string for @plugin.
*
* Since: 1.3.8
*/
const char* webkit_web_plugin_get_name(WebKitWebPlugin* plugin)
{
g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
WebKitWebPluginPrivate* priv = plugin->priv;
if (!priv->name.length())
priv->name = priv->corePlugin->name().utf8();
return priv->name.data();
}
/**
* webkit_web_plugin_get_description:
* @plugin: a #WebKitWebPlugin
*
* Returns: the description string for @plugin.
*
* Since: 1.3.8
*/
const char* webkit_web_plugin_get_description(WebKitWebPlugin* plugin)
{
g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
WebKitWebPluginPrivate* priv = plugin->priv;
if (!priv->description.length())
priv->description = priv->corePlugin->description().utf8();
return priv->description.data();
}
/**
* webkit_web_plugin_get_path:
* @plugin: a #WebKitWebPlugin
*
* Returns: the absolute path to @plugin in system filename encoding
* or %NULL on failure to convert the filename from UTF-8.
*
* Since: 1.4.0
*/
const char* webkit_web_plugin_get_path(WebKitWebPlugin* plugin)
{
g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
WebKitWebPluginPrivate* priv = plugin->priv;
if (priv->path)
return priv->path;
GError* error = 0;
priv->path = g_filename_from_utf8(priv->corePlugin->path().utf8().data(), -1, 0, 0, &error);
if (!error)
return priv->path;
// In the unlikely case the convertion fails, report the error and make sure we free
// any partial convertion that ended up in the variable.
g_free(priv->path);
priv->path = 0;
g_warning("Failed to convert '%s' to system filename encoding: %s", priv->corePlugin->path().utf8().data(), error->message);
g_clear_error(&error);
return 0;
}
/**
* webkit_web_plugin_get_mimetypes:
* @plugin: a #WebKitWebPlugin
*
* Returns all the #WebKitWebPluginMIMEType that @plugin is handling
* at the moment.
*
* Returns: (transfer none) (element-type WebKitWebPluginMIMEType): a #GSList of #WebKitWebPluginMIMEType
*
* Since: 1.3.8
*/
GSList* webkit_web_plugin_get_mimetypes(WebKitWebPlugin* plugin)
{
g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), 0);
WebKitWebPluginPrivate* priv = plugin->priv;
if (priv->mimeTypes)
return priv->mimeTypes;
const MIMEToDescriptionsMap& mimeToDescriptions = priv->corePlugin->mimeToDescriptions();
MIMEToDescriptionsMap::const_iterator end = mimeToDescriptions.end();
for (MIMEToDescriptionsMap::const_iterator it = mimeToDescriptions.begin(); it != end; ++it) {
WebKitWebPluginMIMEType* mimeType = g_slice_new0(WebKitWebPluginMIMEType);
mimeType->name = g_strdup(it->first.utf8().data());
mimeType->description = g_strdup(it->second.utf8().data());
Vector<String> extensions = priv->corePlugin->mimeToExtensions().get(it->first);
mimeType->extensions = static_cast<gchar**>(g_malloc0(extensions.size() + 1));
for (unsigned i = 0; i < extensions.size(); i++)
mimeType->extensions[i] = g_strdup(extensions[i].utf8().data());
priv->mimeTypes = g_slist_append(priv->mimeTypes, mimeType);
}
return priv->mimeTypes;
}
/**
* webkit_web_plugin_set_enabled:
* @plugin: a #WebKitWebPlugin
* @enabled: whether to enable the plugin
*
* Sets the enabled status of the @plugin.
*
* Since: 1.3.8
*/
void webkit_web_plugin_set_enabled(WebKitWebPlugin* plugin, gboolean enabled)
{
g_return_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin));
WebKitWebPluginPrivate* priv = plugin->priv;
ASSERT(priv->corePlugin);
if (priv->corePlugin->isEnabled() == enabled)
return;
priv->corePlugin->setEnabled(enabled);
g_object_notify(G_OBJECT(plugin), "enabled");
}
/**
* webkit_web_plugin_get_enabled:
* @plugin: a #WebKitWebPlugin
*
* Returns: %TRUE if the plugin is enabled, %FALSE otherwise
*
* Since: 1.3.8
*/
gboolean webkit_web_plugin_get_enabled(WebKitWebPlugin* plugin)
{
g_return_val_if_fail(WEBKIT_IS_WEB_PLUGIN(plugin), FALSE);
ASSERT(plugin->priv->corePlugin);
return plugin->priv->corePlugin->isEnabled();
}