[Xfce4-commits] <parole:master> Added browser plugin gecko compatible, this plugin handles various media formats and play them embedded in mozilla, but still no play control in this new plugin and mime enable/disable to go with the final Parole release.

Ali Abdallah noreply at xfce.org
Sun Nov 15 16:54:01 CET 2009


Updating branch refs/heads/master
         to 808acb84055afbb9062ffb9fea74fd2445b64e02 (commit)
       from eeab30d63eca6e1bd128154b675f7b98801e7144 (commit)

commit 808acb84055afbb9062ffb9fea74fd2445b64e02
Author: Ali Abdallah <ali at ali-xfce.org>
Date:   Sun Nov 15 16:19:38 2009 +0100

    Added browser plugin gecko compatible, this plugin handles
    various media formats and play them embedded in mozilla,
    but still no play control in this new plugin and mime
    enable/disable to go with the final Parole release.

 Makefile.am                                        |   12 +-
 browser-plugin/Makefile.am                         |   45 ++
 browser-plugin/media-plugin/Makefile.am            |   23 +
 browser-plugin/media-plugin/main.c                 |  116 +++
 browser-plugin/media-plugin/parole-gst.c           |  408 ++++++++++
 .../media-plugin/parole-gst.h                      |   51 +-
 browser-plugin/npapi.h                             |  807 ++++++++++++++++++++
 browser-plugin/npruntime.h                         |  351 +++++++++
 browser-plugin/npupp.h                             |  719 +++++++++++++++++
 browser-plugin/parole-plugin.cpp                   |  146 ++++
 browser-plugin/parole-plugin.h                     |   67 ++
 browser-plugin/plugin.cpp                          |  300 ++++++++
 browser-plugin/plugin.symbols                      |    4 +
 configure.ac.in                                    |    4 +-
 data/interfaces/Makefile.am                        |    6 +-
 data/interfaces/browser-plugin-control.ui          |    4 +
 parole/Makefile.am                                 |    2 +
 parole/main.c                                      |    2 +
 parole/parole-gst.c                                |    1 -
 parole/parole-gst.h                                |    1 +
 20 files changed, 3034 insertions(+), 35 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index b699693..56530ba 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,12 +2,12 @@ if ENABLE_BROWSER_PLUGIN
 browser_plugin_dir = browser-plugin
 endif
 
-SUBDIRS =  		\
-	data		\
-	parole 		\
-	plugins		\
-	browser-plugin  \
-	docs		\
+SUBDIRS =  			\
+	data			\
+	parole 			\
+	plugins			\
+	$(browser_plugin_dir)  	\
+	docs			\
 	po
 
 
diff --git a/browser-plugin/Makefile.am b/browser-plugin/Makefile.am
new file mode 100644
index 0000000..d058c90
--- /dev/null
+++ b/browser-plugin/Makefile.am
@@ -0,0 +1,45 @@
+SUBDIRS = 						\
+	media-plugin
+
+INCLUDES = 						\
+	-fPIC						\
+	-I$(top_builddir)				\
+	-I$(top_srcdir) 				\
+	-DPACKAGE_LOCALE_DIR=\"$(localedir)\"		\
+        -DG_LOG_DOMAIN=\"parole-browser-plugin\"	\
+	-DLIBEXECDIR="\"$(libexecdir)\""		\
+	$(GTK_CFLAGS)
+
+plugindir = $(BROWSER_PLUGIN_DIR)
+
+plugin_LTLIBRARIES = 	 				\
+        parole-player.la
+
+PLUGIN_FILES =						\
+	npupp.h						\
+	npapi.h						\
+	npruntime.h
+
+parole_player_la_SOURCES =				\
+	$(PLUGIN_FILES)					\
+	plugin.cpp					\
+	parole-plugin.cpp				\
+	parole-plugin.h
+
+
+parole_player_la_CPPFLAGS =				\
+	-DXP_UNIX 					\
+	-DMOZ_X11
+	-I$(top_srcdir)/browser-plugin
+
+parole_player_la_LIBADD =				\
+	$(GTK_LIBS)
+
+parole_player_la_LDFLAGS =				\
+	-avoid-version  				\
+	-export-symbols $(srcdir)/plugin.symbols 	\
+	-module
+
+EXTRA_DIST = 						\
+	$(PLUGIN_FILES) 
+	plugin.symbols
\ No newline at end of file
diff --git a/browser-plugin/media-plugin/Makefile.am b/browser-plugin/media-plugin/Makefile.am
new file mode 100644
index 0000000..1efafbd
--- /dev/null
+++ b/browser-plugin/media-plugin/Makefile.am
@@ -0,0 +1,23 @@
+libexec_PROGRAMS = parole-media-plugin
+
+parole_media_plugin_SOURCES =			\
+	main.c					\
+	parole-gst.c				\
+	parole-gst.h
+
+parole_media_plugin_CFLAGS =			\
+	-I$(top_srcdir)                         \
+        -I$(top_srcdir)/data                    \
+        -I$(top_srcdir)/data/mime               \
+        -DLOCALEDIR=\"$(localedir)\"            \
+        -DG_LOG_DOMAIN=\"parole-media-plugin\"  \
+	$(GTHREAD_CFLAGS)                       \
+	$(GTK_CFLAGS)				\
+	$(GST_VIDEO_CFLAGS)                     \
+        $(GST_INTERFACES_CFLAGS)
+
+parole_media_plugin_LDADD =			\
+	$(GTHREAD_LIBS)                       	\
+	$(GTK_LIBS)				\
+	$(GST_VIDEO_LIBS)                     	\
+        $(GST_INTERFACES_LIBS)
\ No newline at end of file
diff --git a/browser-plugin/media-plugin/main.c b/browser-plugin/media-plugin/main.c
new file mode 100644
index 0000000..f25868f
--- /dev/null
+++ b/browser-plugin/media-plugin/main.c
@@ -0,0 +1,116 @@
+/*
+ * * Copyright (C) 2008-2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <signal.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+
+#include <gst/gst.h>
+
+#include "parole-gst.h"
+
+static gboolean 
+parole_terminate (GtkWidget *widget, GdkEvent *ev, ParoleGst *gst)
+{
+    parole_gst_terminate (gst);
+    g_debug ("Terminating");
+    return TRUE;
+}
+
+int main (int argc, char **argv)
+{
+    GdkNativeWindow socket_id = 0;
+    gchar *url = NULL;
+    GOptionContext *ctx;
+    GOptionGroup *gst_option_group;
+    GError *error = NULL;
+    
+    GOptionEntry option_entries[] = 
+    {
+        { "socket-id", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &socket_id, N_("socket"), N_("SOCKET ID") },
+	{ "url", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_STRING, &url, N_("url to play"), N_("URL") },
+        { NULL, },
+    };
+    
+    if ( !g_thread_supported () )
+	g_thread_init (NULL);
+	
+    bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+
+#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
+    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+#endif
+
+    textdomain (GETTEXT_PACKAGE);
+  
+    gtk_init (&argc, &argv);
+    
+    ctx = g_option_context_new (NULL);
+    
+    gst_option_group = gst_init_get_option_group ();
+    g_option_context_add_main_entries (ctx, option_entries, GETTEXT_PACKAGE);
+    g_option_context_set_translation_domain (ctx, GETTEXT_PACKAGE);
+    g_option_context_add_group (ctx, gst_option_group);
+
+    g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
+    
+    if ( !g_option_context_parse (ctx, &argc, &argv, &error) ) 
+    {
+	g_print ("%s\n", error->message);
+	g_print ("Type %s --help to list all available command line options", argv[0]);
+	g_error_free (error);
+	g_option_context_free (ctx);
+	return EXIT_FAILURE;
+    }
+    g_option_context_free (ctx);
+    
+    {
+	GtkWidget *plug;
+	GtkWidget *gst;
+	gulong sig_id;
+	plug = gtk_plug_new (socket_id);
+	
+	gst = parole_gst_new ();
+	
+	gtk_container_add (GTK_CONTAINER (plug), gst);
+	
+	sig_id = g_signal_connect (plug, "delete-event",
+				   G_CALLBACK (parole_terminate), gst);
+	parole_gst_play_url (PAROLE_GST (gst), url);
+	gtk_widget_show_all (plug);
+	gtk_main ();
+	g_signal_handler_disconnect (plug, sig_id);
+	gtk_widget_destroy (plug);
+    }
+
+    gst_deinit ();
+
+    return EXIT_SUCCESS;
+}
diff --git a/browser-plugin/media-plugin/parole-gst.c b/browser-plugin/media-plugin/parole-gst.c
new file mode 100644
index 0000000..459d6ff
--- /dev/null
+++ b/browser-plugin/media-plugin/parole-gst.c
@@ -0,0 +1,408 @@
+/*
+ * * Copyright (C) 2009 Ali <aliov at xfce.org>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gst/interfaces/xoverlay.h>
+#include <gst/interfaces/navigation.h>
+
+#include <gst/video/video.h>
+
+#include <gdk/gdkx.h>
+
+#include "parole-gst.h"
+
+static void parole_gst_finalize   (GObject *object);
+
+#define PAROLE_GST_GET_PRIVATE(o) \
+(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_GST, ParoleGstPrivate))
+
+struct ParoleGstPrivate
+{
+    GstElement	 *playbin;
+    GstElement   *video_sink;
+    GstBus       *bus;
+    
+    GstState      state;
+    GstState      target;
+    
+    gulong	  sig1;
+    gulong	  sig2;
+    
+    gboolean	  terminate;
+    
+    gboolean	  has_video;
+    gboolean	  buffering;
+};
+
+G_DEFINE_TYPE (ParoleGst, parole_gst, GTK_TYPE_WIDGET)
+
+static void
+parole_gst_evaluate_state (ParoleGst *gst, GstState old, GstState new, GstState pending)
+{
+    gst->priv->state = new;
+
+    switch (gst->priv->state)
+    {
+	case GST_STATE_PLAYING:
+	    break;
+	case GST_STATE_PAUSED:
+	    break;
+	case GST_STATE_READY:
+	    gst->priv->buffering = FALSE;
+	case GST_STATE_NULL:
+	    gst->priv->buffering = FALSE;
+	    if ( gst->priv->terminate )
+	    {
+		g_debug ("Exiting");
+		gtk_main_quit ();
+	    }
+	    break;
+	default:
+	    break;
+    }
+}
+
+static void
+parole_gst_change_state (ParoleGst *gst, GstState new)
+{
+    GstStateChangeReturn ret;
+
+    ret = gst_element_set_state (GST_ELEMENT (gst->priv->playbin), new);
+    
+    if ( ret == GST_STATE_CHANGE_SUCCESS )
+    {
+	parole_gst_evaluate_state (gst, 
+				   GST_STATE_RETURN (gst->priv->playbin),
+				   GST_STATE (gst->priv->playbin),
+				   GST_STATE_PENDING (gst->priv->playbin));
+    }
+}
+
+static void
+parole_gst_set_x_overlay (ParoleGst *gst)
+{
+    GstElement *video_sink;
+    
+    g_object_get (G_OBJECT (gst->priv->playbin),
+		  "video-sink", &video_sink,
+		  NULL);
+		  
+    g_assert (video_sink != NULL);
+    
+    gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (video_sink),
+				  GDK_WINDOW_XWINDOW (GTK_WIDGET (gst)->window));
+    
+    gst_object_unref (video_sink);
+}
+
+static void
+parole_gst_element_message_sync (GstBus *bus, GstMessage *message, ParoleGst *gst)
+{
+    if ( !message->structure )
+	goto out;
+	
+    if ( gst_structure_has_name (message->structure, "prepare-xwindow-id") )
+	parole_gst_set_x_overlay (gst);
+out:
+    ;
+}
+
+static void
+parole_gst_stream_info_notify_cb (GObject * obj, GParamSpec * pspec, ParoleGst *gst)
+{
+    GstMessage *msg;
+    msg = gst_message_new_application (GST_OBJECT (gst->priv->playbin),
+				       gst_structure_new ("notify-streaminfo", NULL));
+    gst_element_post_message (gst->priv->playbin, msg);
+}
+
+static gboolean
+parole_gst_bus_event (GstBus *bus, GstMessage *msg, gpointer data)
+{
+    ParoleGst *gst;
+    
+    gst = PAROLE_GST (data);
+
+    switch (GST_MESSAGE_TYPE (msg))
+    {
+        case GST_MESSAGE_EOS:
+	{
+	    break;
+	}
+	case GST_MESSAGE_ERROR:
+	{
+	    /*
+	    GError *error = NULL;
+	    gchar *debug;
+	    
+	    gst->priv->target = GST_STATE_NULL;
+	    gst->priv->buffering = FALSE;
+	    parole_gst_change_state (gst, GST_STATE_NULL);
+	    gst_message_parse_error (msg, &error, &debug);
+	    TRACE ("*** ERROR %s : %s ***", error->message, debug);
+	    g_error_free (error);
+	    g_free (debug);
+	    gtk_widget_queue_draw (GTK_WIDGET (gst));
+	    */
+	    break;
+	}
+	case GST_MESSAGE_BUFFERING:
+	{
+	    gint per = 0;
+	    gst_message_parse_buffering (msg, &per);
+	    gst->priv->buffering = per != 100;
+	    break;
+	}
+	case GST_MESSAGE_STATE_CHANGED:
+	{
+	    /*
+	    GstState old, new, pending;
+	    gst_message_parse_state_changed (msg, &old, &new, &pending);
+	    
+	    if ( GST_MESSAGE_SRC (msg) == GST_OBJECT (gst->priv->playbin) )
+		parole_gst_evaluate_state (gst, old, new, pending);
+	    */
+	    break;
+	}
+	case GST_MESSAGE_APPLICATION:
+	   // parole_gst_application_message (gst, msg);
+	    break;
+	case GST_MESSAGE_DURATION:
+	    //parole_gst_query_duration (gst);
+	    break;
+	default:
+	    break;
+    }
+    return TRUE;
+}
+
+static void
+parole_gst_construct (GObject *object)
+{
+    ParoleGst *gst;
+    
+    gst = PAROLE_GST (object);
+    
+    gst->priv->playbin = gst_element_factory_make ("playbin", "player");
+ 
+    if ( G_UNLIKELY (gst->priv->playbin == NULL) )
+    {
+	g_critical ("playbin load failed");
+	return;
+    }
+    
+    gst->priv->video_sink = gst_element_factory_make ("xvimagesink", "video");
+
+    if ( G_UNLIKELY (gst->priv->video_sink == NULL) )
+    {
+	g_debug ("xvimagesink not found, trying to load ximagesink"); 
+	gst->priv->video_sink = gst_element_factory_make ("ximagesink", "video");
+	
+	if ( G_UNLIKELY (gst->priv->video_sink == NULL) )
+	{
+	    g_critical ("ximagesink load failed");
+	    return;
+	}
+    }
+    
+    g_object_set (G_OBJECT (gst->priv->playbin),
+		  "video-sink", gst->priv->video_sink,
+		  NULL);
+    
+    /*
+     * Listen to the bus events.
+     */
+    gst->priv->bus = gst_element_get_bus (gst->priv->playbin);
+    gst_bus_add_signal_watch (gst->priv->bus);
+    
+    gst->priv->sig1 =
+	g_signal_connect (gst->priv->bus, "message",
+			  G_CALLBACK (parole_gst_bus_event), gst);
+		      
+    /* 
+     * Handling 'prepare-xwindow-id' message async causes XSync 
+     * error in some occasions So we handle this message synchronously
+     */
+    gst_bus_set_sync_handler (gst->priv->bus, gst_bus_sync_signal_handler, gst);
+    gst->priv->sig2 =
+	g_signal_connect (gst->priv->bus, "sync-message::element",
+			  G_CALLBACK (parole_gst_element_message_sync), gst);
+
+    /*
+     * Handle stream info changes, this can happen on live/radio stream.
+     */
+    g_signal_connect (gst->priv->playbin, "notify::stream-info",
+		      G_CALLBACK (parole_gst_stream_info_notify_cb), gst);
+}
+
+static gboolean
+parole_gst_expose_event (GtkWidget *widget, GdkEventExpose *ev)
+{
+    ParoleGst *gst;
+    
+    if ( ev && ev->count > 0 )
+	return TRUE;
+
+    gst = PAROLE_GST (widget);
+
+    parole_gst_set_x_overlay (gst);
+
+    if ( gst->priv->has_video )
+    {
+	gst_x_overlay_expose (GST_X_OVERLAY (gst->priv->video_sink));
+    }
+	
+    return TRUE;
+}
+
+static void
+parole_gst_show (GtkWidget *widget)
+{
+    ParoleGst *gst;
+    
+    gst = PAROLE_GST (widget);
+    
+    if ( widget->window )
+	gdk_window_show (widget->window);
+    
+    if ( GTK_WIDGET_CLASS (parole_gst_parent_class)->show )
+	GTK_WIDGET_CLASS (parole_gst_parent_class)->show (widget);
+}
+
+static void
+parole_gst_realize (GtkWidget *widget)
+{
+    ParoleGst *gst;
+    GdkWindowAttr attr;
+    GdkColor color;
+    gint mask;
+    
+    GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
+    gst = PAROLE_GST (widget);
+    
+    attr.x = widget->allocation.x;
+    attr.y = widget->allocation.y;
+    attr.width = widget->allocation.width;
+    attr.height = widget->allocation.height;
+    attr.visual = gtk_widget_get_visual (widget);
+    attr.colormap = gtk_widget_get_colormap (widget);
+    attr.wclass = GDK_INPUT_OUTPUT;
+    attr.window_type = GDK_WINDOW_CHILD;
+    attr.event_mask = gtk_widget_get_events (widget) | 
+                      GDK_EXPOSURE_MASK |
+	              GDK_BUTTON_PRESS_MASK | 
+                      GDK_BUTTON_RELEASE_MASK | 
+		      GDK_POINTER_MOTION_MASK |
+		      GDK_KEY_PRESS_MASK;
+		      
+    mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+	
+    widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
+				     &attr, mask);
+				     
+    gdk_window_set_user_data (widget->window, widget);
+    gdk_color_parse ("black", &color);
+    gdk_colormap_alloc_color (gtk_widget_get_colormap (widget), &color,
+			      TRUE, TRUE);
+    
+    gdk_window_set_background (widget->window, &color);
+    widget->style = gtk_style_attach (widget->style, widget->window);
+}
+
+static void
+parole_gst_class_init (ParoleGstClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+    object_class->finalize = parole_gst_finalize;
+    object_class->constructed = parole_gst_construct;
+    
+    widget_class->realize = parole_gst_realize;
+    widget_class->show = parole_gst_show;
+    widget_class->expose_event = parole_gst_expose_event;
+
+    g_type_class_add_private (klass, sizeof (ParoleGstPrivate));
+}
+
+static void
+parole_gst_init (ParoleGst *gst)
+{
+    gst->priv = PAROLE_GST_GET_PRIVATE (gst);
+    
+    gst->priv->state = GST_STATE_VOID_PENDING;
+    gst->priv->target = GST_STATE_VOID_PENDING;
+    
+    gst->priv->terminate = FALSE;
+    
+    
+    GTK_WIDGET_SET_FLAGS (GTK_WIDGET (gst), GTK_CAN_FOCUS);
+    
+    /*
+     * Disable double buffering on the video output to avoid
+     * flickering when resizing the window.
+     */
+    GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (gst), GTK_DOUBLE_BUFFERED);
+}
+
+static void
+parole_gst_finalize (GObject *object)
+{
+    ParoleGst *gst;
+
+    gst = PAROLE_GST (object);
+    g_object_unref (gst->priv->playbin);
+
+    G_OBJECT_CLASS (parole_gst_parent_class)->finalize (object);
+}
+
+GtkWidget *
+parole_gst_new (void)
+{
+    GtkWidget *gst = NULL;
+    gst = g_object_new (PAROLE_TYPE_GST, NULL);
+    return gst;
+}
+
+void parole_gst_play_url (ParoleGst *gst, const gchar *url)
+{
+    g_return_if_fail (gst->priv->playbin != NULL);
+    
+    g_object_set (G_OBJECT (gst->priv->playbin),
+		  "uri", url,
+		  NULL);
+    parole_gst_change_state (gst, GST_STATE_PLAYING);
+}
+
+void parole_gst_terminate (ParoleGst *gst)
+{
+    g_return_if_fail (gst->priv->playbin != NULL);
+    
+    gst->priv->terminate = TRUE;
+    gst->priv->target = GST_STATE_NULL;
+    parole_gst_change_state (gst, GST_STATE_NULL);
+}
diff --git a/parole/parole-filters.h b/browser-plugin/media-plugin/parole-gst.h
similarity index 52%
copy from parole/parole-filters.h
copy to browser-plugin/media-plugin/parole-gst.h
index 73308dd..72a08b5 100644
--- a/parole/parole-filters.h
+++ b/browser-plugin/media-plugin/parole-gst.h
@@ -18,43 +18,42 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __PAROLE_FILTERS_H
-#define __PAROLE_FILTERS_H
+#ifndef __PAROLE_GST_H
+#define __PAROLE_GST_H
 
 #include <gtk/gtk.h>
 
-#include "parole-file.h"
-
 G_BEGIN_DECLS
 
-typedef enum
-{
-    PAROLE_FILE_UNKNOWN,
-    PAROLE_FILE_AUDIO,
-    PAROLE_FILE_VIDEO,
-    PAROLE_FILE_PLAYLIST
-    
-} ParoleFileFormat;
-
-GtkFileFilter 		*parole_get_supported_audio_filter	(void);
-
-GtkFileFilter 		*parole_get_supported_video_filter	(void);
+#define PAROLE_TYPE_GST        (parole_gst_get_type () )
+#define PAROLE_GST(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_GST, ParoleGst))
+#define PAROLE_IS_GST(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_GST))
 
-GtkFileFilter 		*parole_get_supported_media_filter	(void);
+typedef struct ParoleGstPrivate ParoleGstPrivate;
 
-GtkFileFilter 		*parole_get_supported_files_filter	(void);
+typedef struct
+{
+    GtkWidget         		parent;
+    
+    ParoleGstPrivate           *priv;
+    
+} ParoleGst;
 
-GtkFileFilter 		*parole_get_supported_playlist_filter	(void);
+typedef struct
+{
+    GtkWidgetClass 		parent_class;
+    
+} ParoleGstClass;
 
-gboolean		 parole_file_filter			(GtkFileFilter *filter,
-								 ParoleFile *file);
+GType        			parole_gst_get_type        (void) G_GNUC_CONST;
 
-ParoleFileFormat	 parole_file_guess_format		(ParoleFile *file);
+GtkWidget       	       *parole_gst_new             (void);
 
-void			 parole_get_media_files			(GtkFileFilter *filter,
-								 const gchar *path,
-								 GSList **list);
+void				parole_gst_play_url	   (ParoleGst *gst,
+							    const gchar *url);
+							    
+void				parole_gst_terminate	   (ParoleGst *gst);
 
 G_END_DECLS
 
-#endif /* PAROLE_FILTERS_H */
+#endif /* __PAROLE_GST_H */
diff --git a/browser-plugin/npapi.h b/browser-plugin/npapi.h
new file mode 100644
index 0000000..952d357
--- /dev/null
+++ b/browser-plugin/npapi.h
@@ -0,0 +1,807 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+ 
+ 
+ /*
+  *  Netscape client plug-in API spec
+  */
+ 
+
+#ifndef _NPAPI_H_
+#define _NPAPI_H_
+
+#ifdef INCLUDE_JAVA
+#include "jri.h"                /* Java Runtime Interface */
+#else
+#define jref    void *
+#define JRIEnv  void
+#endif
+
+#ifdef _WIN32
+#    ifndef XP_WIN
+#        define XP_WIN 1
+#    endif /* XP_WIN */
+#endif /* _WIN32 */
+
+#ifdef __MWERKS__
+#    define _declspec __declspec
+#    ifdef macintosh
+#        ifndef XP_MAC
+#            define XP_MAC 1
+#        endif /* XP_MAC */
+#    endif /* macintosh */
+#    ifdef __INTEL__
+#        undef NULL
+#        ifndef XP_WIN
+#            define XP_WIN 1
+#        endif /* __INTEL__ */
+#    endif /* XP_PC */
+#endif /* __MWERKS__ */
+
+#if defined(__APPLE_CC__) && !defined(__MACOS_CLASSIC__) && !defined(XP_UNIX)
+#   define XP_MACOSX
+#endif
+
+#ifdef XP_MAC
+    #include <Quickdraw.h>
+    #include <Events.h>
+#endif
+
+#if defined(XP_MACOSX) && defined(__LP64__)
+#define NP_NO_QUICKDRAW
+#define NP_NO_CARBON
+#endif
+
+#ifdef XP_MACOSX
+    #include <ApplicationServices/ApplicationServices.h>
+    #include <OpenGL/OpenGL.h>
+#ifndef NP_NO_CARBON
+    #include <Carbon/Carbon.h>
+#endif
+#endif
+
+#ifdef XP_UNIX
+    #include <X11/Xlib.h>
+    #include <X11/Xutil.h>
+    #include <stdio.h>
+#endif
+
+#ifdef XP_WIN
+    #include <windows.h>
+#endif
+
+/*----------------------------------------------------------------------*/
+/*             Plugin Version Constants                                 */
+/*----------------------------------------------------------------------*/
+
+#define NP_VERSION_MAJOR 0
+#define NP_VERSION_MINOR 20
+
+
+
+/*----------------------------------------------------------------------*/
+/*             Definition of Basic Types                                */
+/*----------------------------------------------------------------------*/
+
+#ifndef _UINT16
+#define _UINT16
+typedef unsigned short uint16;
+#endif
+
+#ifndef _UINT32
+#define _UINT32
+#ifdef __LP64__
+typedef unsigned int uint32;
+#else /* __LP64__ */
+typedef unsigned long uint32;
+#endif /* __LP64__ */
+#endif
+
+#ifndef _INT16
+#define _INT16
+typedef short int16;
+#endif
+
+#ifndef _INT32
+#define _INT32
+#ifdef __LP64__
+typedef int int32;
+#else /* __LP64__ */
+typedef long int32;
+#endif /* __LP64__ */
+#endif
+
+#ifndef FALSE
+#define FALSE (0)
+#endif
+#ifndef TRUE
+#define TRUE (1)
+#endif
+#ifndef NULL
+#define NULL (0L)
+#endif
+
+typedef unsigned char    NPBool;
+typedef int16            NPError;
+typedef int16            NPReason;
+typedef char*            NPMIMEType;
+
+
+
+/*----------------------------------------------------------------------*/
+/*             Structures and definitions             */
+/*----------------------------------------------------------------------*/
+
+#if !defined(__LP64__)
+#if defined(XP_MAC) || defined(XP_MACOSX)
+#pragma options align=mac68k
+#endif
+#endif /* __LP64__ */
+
+/*
+ *  NPP is a plug-in's opaque instance handle
+ */
+typedef struct _NPP
+{
+    void*    pdata;            /* plug-in private data */
+    void*    ndata;            /* netscape private data */
+} NPP_t;
+
+typedef NPP_t*    NPP;
+
+
+typedef struct _NPStream
+{
+    void*        pdata;        /* plug-in private data */
+    void*        ndata;        /* netscape private data */
+    const char*  url;
+    uint32       end;
+    uint32       lastmodified;
+    void*        notifyData;
+    const char*  headers;      /* Response headers from host.
+                                * Exists only for >= NPVERS_HAS_RESPONSE_HEADERS.
+                                * Used for HTTP only; NULL for non-HTTP.
+                                * Available from NPP_NewStream onwards.
+                                * Plugin should copy this data before storing it.
+                                * Includes HTTP status line and all headers,
+                                * preferably verbatim as received from server,
+                                * headers formatted as in HTTP ("Header: Value"),
+                                * and newlines (\n, NOT \r\n) separating lines.
+                                * Terminated by \n\0 (NOT \n\n\0). */
+} NPStream;
+
+
+typedef struct _NPByteRange
+{
+    int32      offset;         /* negative offset means from the end */
+    uint32     length;
+    struct _NPByteRange* next;
+} NPByteRange;
+
+
+typedef struct _NPSavedData
+{
+    int32    len;
+    void*    buf;
+} NPSavedData;
+
+
+typedef struct _NPRect
+{
+    uint16    top;
+    uint16    left;
+    uint16    bottom;
+    uint16    right;
+} NPRect;
+
+
+#ifdef XP_UNIX
+/*
+ * Unix specific structures and definitions
+ */
+
+/*
+ * Callback Structures.
+ *
+ * These are used to pass additional platform specific information.
+ */
+enum {
+    NP_SETWINDOW = 1,
+    NP_PRINT
+};
+
+typedef struct
+{
+    int32        type;
+} NPAnyCallbackStruct;
+
+typedef struct
+{
+    int32           type;
+    Display*        display;
+    Visual*         visual;
+    Colormap        colormap;
+    unsigned int    depth;
+} NPSetWindowCallbackStruct;
+
+typedef struct
+{
+    int32            type;
+    FILE*            fp;
+} NPPrintCallbackStruct;
+
+#endif /* XP_UNIX */
+
+/*
+ *   The following masks are applied on certain platforms to NPNV and 
+ *   NPPV selectors that pass around pointers to COM interfaces. Newer 
+ *   compilers on some platforms may generate vtables that are not 
+ *   compatible with older compilers. To prevent older plugins from 
+ *   not understanding a new browser's ABI, these masks change the 
+ *   values of those selectors on those platforms. To remain backwards
+ *   compatible with differenet versions of the browser, plugins can 
+ *   use these masks to dynamically determine and use the correct C++
+ *   ABI that the browser is expecting. This does not apply to Windows 
+ *   as Microsoft's COM ABI will likely not change.
+ */
+
+#define NP_ABI_GCC3_MASK  0x10000000
+/*
+ *   gcc 3.x generated vtables on UNIX and OSX are incompatible with 
+ *   previous compilers.
+ */
+#if (defined (XP_UNIX) && defined(__GNUC__) && (__GNUC__ >= 3))
+#define _NP_ABI_MIXIN_FOR_GCC3 NP_ABI_GCC3_MASK
+#else
+#define _NP_ABI_MIXIN_FOR_GCC3 0
+#endif
+
+#define NP_ABI_MACHO_MASK 0x01000000
+/*
+ *   On OSX, the Mach-O executable format is significantly
+ *   different than CFM. In addition to having a different
+ *   C++ ABI, it also has has different C calling convention.
+ *   You must use glue code when calling between CFM and
+ *   Mach-O C functions. 
+ */
+#if (defined(TARGET_RT_MAC_MACHO))
+#define _NP_ABI_MIXIN_FOR_MACHO NP_ABI_MACHO_MASK
+#else
+#define _NP_ABI_MIXIN_FOR_MACHO 0
+#endif
+
+
+#define NP_ABI_MASK (_NP_ABI_MIXIN_FOR_GCC3 | _NP_ABI_MIXIN_FOR_MACHO)
+
+/*
+ * List of variable names for which NPP_GetValue shall be implemented
+ */
+typedef enum {
+    NPPVpluginNameString = 1,
+    NPPVpluginDescriptionString,
+    NPPVpluginWindowBool,
+    NPPVpluginTransparentBool,
+
+    NPPVjavaClass,                /* Not implemented in WebKit */
+    NPPVpluginWindowSize,         /* Not implemented in WebKit */
+    NPPVpluginTimerInterval,      /* Not implemented in WebKit */
+
+    NPPVpluginScriptableInstance = (10 | NP_ABI_MASK), /* Not implemented in WebKit */
+    NPPVpluginScriptableIID = 11, /* Not implemented in WebKit */
+
+    /* 12 and over are available on Mozilla builds starting with 0.9.9 */
+    NPPVjavascriptPushCallerBool = 12,  /* Not implemented in WebKit */
+    NPPVpluginKeepLibraryInMemory = 13, /* Not implemented in WebKit */
+    NPPVpluginNeedsXEmbed         = 14, /* Not implemented in WebKit */
+
+    /* Get the NPObject for scripting the plugin. */
+    NPPVpluginScriptableNPObject  = 15,
+
+    /* Get the plugin value (as \0-terminated UTF-8 string data) for
+     * form submission if the plugin is part of a form. Use
+     * NPN_MemAlloc() to allocate memory for the string data.
+     */
+    NPPVformValue = 16,    /* Not implemented in WebKit */
+#ifdef XP_MACOSX
+    /* Used for negotiating drawing models */
+    NPPVpluginDrawingModel = 1000,
+    /* Used for negotiating event models */
+    NPPVpluginEventModel = 1001,
+#endif
+} NPPVariable;
+
+/*
+ * List of variable names for which NPN_GetValue is implemented by Mozilla
+ */
+typedef enum {
+    NPNVxDisplay = 1,
+    NPNVxtAppContext,
+    NPNVnetscapeWindow,
+    NPNVjavascriptEnabledBool,
+    NPNVasdEnabledBool,
+    NPNVisOfflineBool,
+
+    /* 10 and over are available on Mozilla builds starting with 0.9.4 */
+    NPNVserviceManager = (10 | NP_ABI_MASK),  /* Not implemented in WebKit */
+    NPNVDOMElement     = (11 | NP_ABI_MASK),  /* Not implemented in WebKit */
+    NPNVDOMWindow      = (12 | NP_ABI_MASK),  /* Not implemented in WebKit */
+    NPNVToolkit        = (13 | NP_ABI_MASK),  /* Not implemented in WebKit */
+    NPNVSupportsXEmbedBool = 14,              /* Not implemented in WebKit */
+
+    /* Get the NPObject wrapper for the browser window. */
+    NPNVWindowNPObject = 15,
+
+    /* Get the NPObject wrapper for the plugins DOM element. */
+    NPNVPluginElementNPObject
+
+#ifdef XP_MACOSX
+    , NPNVpluginDrawingModel = 1000 /* The NPDrawingModel specified by the plugin */
+
+#ifndef NP_NO_QUICKDRAW
+    , NPNVsupportsQuickDrawBool = 2000 /* TRUE if the browser supports the QuickDraw drawing model */
+#endif
+    , NPNVsupportsCoreGraphicsBool = 2001 /* TRUE if the browser supports the CoreGraphics drawing model */
+    , NPNVsupportsOpenGLBool = 2002 /* TRUE if the browser supports the OpenGL drawing model (CGL on Mac) */
+    
+    , NPNVpluginEventModel = 1001 /* The NPEventModel specified by the plugin */
+#ifndef NP_NO_CARBON
+    , NPNVsupportsCarbonBool = 2003 /* TRUE if the browser supports the Carbon event model */
+#endif
+    , NPNVsupportsCocoaBool = 2004 /* TRUE if the browser supports the Cocoa event model */
+#endif /* XP_MACOSX */
+} NPNVariable;
+
+/*
+ * The type of a NPWindow - it specifies the type of the data structure
+ * returned in the window field.
+ */
+typedef enum {
+    NPWindowTypeWindow = 1,
+    NPWindowTypeDrawable
+} NPWindowType;
+
+#ifdef XP_MACOSX
+
+/*
+ * The drawing model for a Mac OS X plugin.  These are the possible values for the NPNVpluginDrawingModel variable.
+ */
+ 
+typedef enum {
+#ifndef NP_NO_QUICKDRAW
+    NPDrawingModelQuickDraw = 0,
+#endif
+    NPDrawingModelCoreGraphics = 1,
+    NPDrawingModelOpenGL = 2
+} NPDrawingModel;
+
+/*
+ * The event model for a Mac OS X plugin. These are the possible values for the NPNVpluginEventModel variable.
+ */
+
+typedef enum {
+#ifndef NP_NO_CARBON
+    NPEventModelCarbon = 0,
+#endif
+    NPEventModelCocoa = 1,
+} NPEventModel;
+
+typedef enum {
+    NPCocoaEventDrawRect = 1,
+    NPCocoaEventMouseDown,
+    NPCocoaEventMouseUp,
+    NPCocoaEventMouseMoved,
+    NPCocoaEventMouseEntered,
+    NPCocoaEventMouseExited,
+    NPCocoaEventMouseDragged,
+    NPCocoaEventKeyDown,
+    NPCocoaEventKeyUp,
+    NPCocoaEventFlagsChanged,
+    NPCocoaEventFocusChanged,
+    NPCocoaEventWindowFocusChanged,
+    NPCocoaEventScrollWheel,
+} NPCocoaEventType;
+
+typedef struct _NPNSString NPNSString;
+typedef struct _NPNSWindow NPNSWindow;
+
+typedef struct _NPCocoaEvent {
+    NPCocoaEventType type;
+    union {
+        struct {
+            uint32 modifierFlags;
+            double pluginX;
+            double pluginY;            
+            int32 buttonNumber;
+            int32 clickCount;
+            double deltaX;
+            double deltaY;
+            double deltaZ;
+        } mouse;
+        struct {
+            uint32 modifierFlags;
+            double pluginX;
+            double pluginY;            
+            NPNSString *characters;
+            NPNSString *charactersIgnoringModifiers;
+            NPBool isARepeat;
+            uint16 keyCode;
+        } key;
+        struct {
+            double x;
+            double y;
+            double width;
+            double height;
+        } draw;
+        struct {
+            NPBool hasFocus;
+        } focus;        
+    };
+} NPCocoaEvent;
+
+#endif
+
+typedef struct _NPWindow
+{
+    void*    window;     /* Platform specific window handle */
+    int32    x;            /* Position of top left corner relative */
+    int32    y;            /*    to a netscape page.                    */
+    uint32    width;        /* Maximum window size */
+    uint32    height;
+    NPRect    clipRect;    /* Clipping rectangle in port coordinates */
+                        /* Used by MAC only.              */
+#ifdef XP_UNIX
+    void *    ws_info;    /* Platform-dependent additonal data */
+#endif /* XP_UNIX */
+    NPWindowType type;    /* Is this a window or a drawable? */
+} NPWindow;
+
+
+typedef struct _NPFullPrint
+{
+    NPBool    pluginPrinted;    /* Set TRUE if plugin handled fullscreen */
+                            /*    printing                             */
+    NPBool    printOne;        /* TRUE if plugin should print one copy  */
+                            /*    to default printer                     */
+    void*    platformPrint;    /* Platform-specific printing info */
+} NPFullPrint;
+
+typedef struct _NPEmbedPrint
+{
+    NPWindow    window;
+    void*    platformPrint;    /* Platform-specific printing info */
+} NPEmbedPrint;
+
+typedef struct _NPPrint
+{
+    uint16    mode;                        /* NP_FULL or NP_EMBED */
+    union
+    {
+        NPFullPrint     fullPrint;        /* if mode is NP_FULL */
+        NPEmbedPrint    embedPrint;        /* if mode is NP_EMBED */
+    } print;
+} NPPrint;
+
+#if defined(XP_MAC) || defined(XP_MACOSX)
+
+#ifndef NP_NO_CARBON
+typedef EventRecord    NPEvent;
+#endif
+
+#elif defined(XP_WIN)
+typedef struct _NPEvent
+{
+    uint16   event;
+    uint32   wParam;
+    uint32   lParam;
+} NPEvent;
+#elif defined (XP_UNIX)
+typedef XEvent NPEvent;
+#else
+typedef void*            NPEvent;
+#endif /* XP_MAC */
+
+#if defined(XP_MAC)
+typedef RgnHandle NPRegion;
+#elif defined(XP_MACOSX)
+/* 
+ * NPRegion's type depends on the drawing model specified by the plugin (see NPNVpluginDrawingModel).
+ * NPQDRegion represents a QuickDraw RgnHandle and is used with the QuickDraw drawing model.
+ * NPCGRegion repesents a graphical region when using any other drawing model.
+ */
+typedef void *NPRegion;
+#ifndef NP_NO_QUICKDRAW
+typedef RgnHandle NPQDRegion;
+#endif
+typedef CGPathRef NPCGRegion;
+#elif defined(XP_WIN)
+typedef HRGN NPRegion;
+#elif defined(XP_UNIX)
+typedef Region NPRegion;
+#else
+typedef void *NPRegion;
+#endif /* XP_MAC */
+
+#ifdef XP_MACOSX
+
+/* 
+ * NP_CGContext is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelCoreGraphics
+ * as its drawing model.
+ */
+
+typedef struct NP_CGContext
+{
+    CGContextRef context;
+#ifdef NP_NO_CARBON
+    NPNSWindow *window;
+#else
+    void *window; // Can be either an NSWindow or a WindowRef depending on the event model
+#endif
+} NP_CGContext;
+
+/* 
+ * NP_GLContext is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelOpenGL as its
+ * drawing model.
+ */
+
+typedef struct NP_GLContext
+{
+    CGLContextObj context;
+#ifdef NP_NO_CARBON
+    NPNSWindow *window;
+#else
+    void *window; // Can be either an NSWindow or a WindowRef depending on the event model
+#endif
+} NP_GLContext;
+
+#endif /* XP_MACOSX */
+
+#if defined(XP_MAC) || defined(XP_MACOSX)
+
+/*
+ *  Mac-specific structures and definitions.
+ */
+
+#ifndef NP_NO_QUICKDRAW
+
+/* 
+ * NP_Port is the type of the NPWindow's 'window' when the plugin specifies NPDrawingModelQuickDraw as its
+ * drawing model, or the plugin does not specify a drawing model.
+ *
+ * It is not recommended that new plugins use NPDrawingModelQuickDraw or NP_Port, as QuickDraw has been
+ * deprecated in Mac OS X 10.5.  CoreGraphics is the preferred drawing API.
+ *
+ * NP_Port is not available in 64-bit.
+ */
+ 
+typedef struct NP_Port
+{
+    CGrafPtr     port;        /* Grafport */
+    int32        portx;        /* position inside the topmost window */
+    int32        porty;
+} NP_Port;
+
+#endif /* NP_NO_QUICKDRAW */
+
+/*
+ *  Non-standard event types that can be passed to HandleEvent
+ */
+#define getFocusEvent        (osEvt + 16)
+#define loseFocusEvent        (osEvt + 17)
+#define adjustCursorEvent   (osEvt + 18)
+
+#endif /* XP_MAC */
+
+
+/*
+ * Values for mode passed to NPP_New:
+ */
+#define NP_EMBED        1
+#define NP_FULL         2
+
+/*
+ * Values for stream type passed to NPP_NewStream:
+ */
+#define NP_NORMAL        1
+#define NP_SEEK         2
+#define NP_ASFILE        3
+#define NP_ASFILEONLY        4
+
+#define NP_MAXREADY    (((unsigned)(~0)<<1)>>1)
+
+#if !defined(__LP64__)
+#if defined(XP_MAC) || defined(XP_MACOSX)
+#pragma options align=reset
+#endif
+#endif /* __LP64__ */
+
+
+/*----------------------------------------------------------------------*/
+/*             Error and Reason Code definitions            */
+/*----------------------------------------------------------------------*/
+
+/*
+ *    Values of type NPError:
+ */
+#define NPERR_BASE                            0
+#define NPERR_NO_ERROR                        (NPERR_BASE + 0)
+#define NPERR_GENERIC_ERROR                    (NPERR_BASE + 1)
+#define NPERR_INVALID_INSTANCE_ERROR        (NPERR_BASE + 2)
+#define NPERR_INVALID_FUNCTABLE_ERROR        (NPERR_BASE + 3)
+#define NPERR_MODULE_LOAD_FAILED_ERROR        (NPERR_BASE + 4)
+#define NPERR_OUT_OF_MEMORY_ERROR            (NPERR_BASE + 5)
+#define NPERR_INVALID_PLUGIN_ERROR            (NPERR_BASE + 6)
+#define NPERR_INVALID_PLUGIN_DIR_ERROR        (NPERR_BASE + 7)
+#define NPERR_INCOMPATIBLE_VERSION_ERROR    (NPERR_BASE + 8)
+#define NPERR_INVALID_PARAM                (NPERR_BASE + 9)
+#define NPERR_INVALID_URL                    (NPERR_BASE + 10)
+#define NPERR_FILE_NOT_FOUND                (NPERR_BASE + 11)
+#define NPERR_NO_DATA                        (NPERR_BASE + 12)
+#define NPERR_STREAM_NOT_SEEKABLE            (NPERR_BASE + 13)
+
+/*
+ *    Values of type NPReason:
+ */
+#define NPRES_BASE                0
+#define NPRES_DONE                    (NPRES_BASE + 0)
+#define NPRES_NETWORK_ERR            (NPRES_BASE + 1)
+#define NPRES_USER_BREAK            (NPRES_BASE + 2)
+
+/*
+ *      Don't use these obsolete error codes any more.
+ */
+#define NP_NOERR  NP_NOERR_is_obsolete_use_NPERR_NO_ERROR
+#define NP_EINVAL NP_EINVAL_is_obsolete_use_NPERR_GENERIC_ERROR
+#define NP_EABORT NP_EABORT_is_obsolete_use_NPRES_USER_BREAK
+
+/*
+ * Version feature information
+ */
+#define NPVERS_HAS_STREAMOUTPUT     8
+#define NPVERS_HAS_NOTIFICATION     9
+#define NPVERS_HAS_LIVECONNECT        9
+#define NPVERS_WIN16_HAS_LIVECONNECT    9
+#define NPVERS_68K_HAS_LIVECONNECT    11
+#define NPVERS_HAS_WINDOWLESS       11
+#define NPVERS_HAS_XPCONNECT_SCRIPTING    13  /* Not implemented in WebKit */
+#define NPVERS_HAS_NPRUNTIME_SCRIPTING    14
+#define NPVERS_HAS_FORM_VALUES            15  /* Not implemented in WebKit; see bug 13061 */
+#define NPVERS_HAS_POPUPS_ENABLED_STATE   16  /* Not implemented in WebKit */
+#define NPVERS_HAS_RESPONSE_HEADERS       17
+#define NPVERS_HAS_NPOBJECT_ENUM          18
+#define NPVERS_HAS_PLUGIN_THREAD_ASYNC_CALL 19
+#define NPVERS_MACOSX_HAS_EVENT_MODELS    20
+
+/*----------------------------------------------------------------------*/
+/*             Function Prototypes                */
+/*----------------------------------------------------------------------*/
+
+#if defined(_WINDOWS) && !defined(WIN32)
+#define NP_LOADDS  _loadds
+#else
+#define NP_LOADDS
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * NPP_* functions are provided by the plugin and called by the navigator.
+ */
+
+#ifdef XP_UNIX
+char*                    NPP_GetMIMEDescription(void);
+#endif /* XP_UNIX */
+
+NPError     NPP_Initialize(void);
+void        NPP_Shutdown(void);
+NPError     NP_LOADDS    NPP_New(NPMIMEType pluginType, NPP instance,
+                                uint16 mode, int16 argc, char* argn[],
+                                char* argv[], NPSavedData* saved);
+NPError     NP_LOADDS    NPP_Destroy(NPP instance, NPSavedData** save);
+NPError     NP_LOADDS    NPP_SetWindow(NPP instance, NPWindow* window);
+NPError     NP_LOADDS    NPP_NewStream(NPP instance, NPMIMEType type,
+                                      NPStream* stream, NPBool seekable,
+                                      uint16* stype);
+NPError     NP_LOADDS    NPP_DestroyStream(NPP instance, NPStream* stream,
+                                          NPReason reason);
+int32        NP_LOADDS    NPP_WriteReady(NPP instance, NPStream* stream);
+int32        NP_LOADDS    NPP_Write(NPP instance, NPStream* stream, int32 offset,
+                                  int32 len, void* buffer);
+void        NP_LOADDS    NPP_StreamAsFile(NPP instance, NPStream* stream,
+                                         const char* fname);
+void        NP_LOADDS    NPP_Print(NPP instance, NPPrint* platformPrint);
+int16            NPP_HandleEvent(NPP instance, void* event);
+void        NP_LOADDS    NPP_URLNotify(NPP instance, const char* url,
+                                      NPReason reason, void* notifyData);
+jref        NP_LOADDS            NPP_GetJavaClass(void);
+NPError     NPP_GetValue(NPP instance, NPPVariable variable,
+                                     void *value);
+NPError     NPP_SetValue(NPP instance, NPNVariable variable,
+                                     void *value);
+
+/*
+ * NPN_* functions are provided by the navigator and called by the plugin.
+ */
+
+void        NPN_Version(int* plugin_major, int* plugin_minor,
+                            int* netscape_major, int* netscape_minor);
+NPError     NPN_GetURLNotify(NPP instance, const char* url,
+                                 const char* target, void* notifyData);
+NPError     NPN_GetURL(NPP instance, const char* url,
+                           const char* target);
+NPError     NPN_PostURLNotify(NPP instance, const char* url,
+                                  const char* target, uint32 len,
+                                  const char* buf, NPBool file,
+                                  void* notifyData);
+NPError     NPN_PostURL(NPP instance, const char* url,
+                            const char* target, uint32 len,
+                            const char* buf, NPBool file);
+NPError     NPN_RequestRead(NPStream* stream, NPByteRange* rangeList);
+NPError     NPN_NewStream(NPP instance, NPMIMEType type,
+                              const char* target, NPStream** stream);
+int32        NPN_Write(NPP instance, NPStream* stream, int32 len,
+                          void* buffer);
+NPError     NPN_DestroyStream(NPP instance, NPStream* stream,
+                                  NPReason reason);
+void        NPN_Status(NPP instance, const char* message);
+const char*    NPN_UserAgent(NPP instance);
+void*        NPN_MemAlloc(uint32 size);
+void        NPN_MemFree(void* ptr);
+uint32        NPN_MemFlush(uint32 size);
+void* NPN_MemDup (const void*, uint32);
+char* NPN_StrDup (const char *);
+void        NPN_ReloadPlugins(NPBool reloadPages);
+JRIEnv*     NPN_GetJavaEnv(void);
+jref        NPN_GetJavaPeer(NPP instance);
+NPError     NPN_GetValue(NPP instance, NPNVariable variable,
+                             void *value);
+NPError     NPN_SetValue(NPP instance, NPPVariable variable,
+                             void *value);
+void        NPN_InvalidateRect(NPP instance, NPRect *invalidRect);
+void        NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion);
+void        NPN_ForceRedraw(NPP instance);
+void        NPN_PushPopupsEnabledState(NPP instance, NPBool enabled);
+void        NPN_PopPopupsEnabledState(NPP instance);
+void        NPN_PluginThreadAsyncCall(NPP instance, void (*func) (void *), void *userData);
+uint32      NPN_ScheduleTimer(NPP instance, uint32 interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32 timerID));
+void        NPN_UnscheduleTimer(NPP instance, uint32 timerID);
+
+#ifdef __cplusplus
+}  /* end extern "C" */
+#endif
+
+#endif /* _NPAPI_H_ */
diff --git a/browser-plugin/npruntime.h b/browser-plugin/npruntime.h
new file mode 100644
index 0000000..5725b72
--- /dev/null
+++ b/browser-plugin/npruntime.h
@@ -0,0 +1,351 @@
+/*
+ * Copyright (C) 2004, Apple Computer, Inc. and The Mozilla Foundation. 
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
+ * Foundation ("Mozilla") nor the names of their contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
+ * THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Revision 1 (March 4, 2004):
+ * Initial proposal.
+ *
+ * Revision 2 (March 10, 2004):
+ * All calls into script were made asynchronous.  Results are
+ * provided via the NPScriptResultFunctionPtr callback.
+ *
+ * Revision 3 (March 10, 2004):
+ * Corrected comments to not refer to class retain/release FunctionPtrs.
+ *
+ * Revision 4 (March 11, 2004):
+ * Added additional convenience NPN_SetExceptionWithUTF8().
+ * Changed NPHasPropertyFunctionPtr and NPHasMethodFunctionPtr to take NPClass
+ * pointers instead of NPObject pointers.
+ * Added NPIsValidIdentifier().
+ *
+ * Revision 5 (March 17, 2004):
+ * Added context parameter to result callbacks from ScriptObject functions.
+ *
+ * Revision 6 (March 29, 2004):
+ * Renamed functions implemented by user agent to NPN_*.  Removed _ from
+ * type names.
+ * Renamed "JavaScript" types to "Script".
+ *
+ * Revision 7 (April 21, 2004):
+ * NPIdentifier becomes a void*, was int32_t
+ * Remove NP_IsValidIdentifier, renamed NP_IdentifierFromUTF8 to NP_GetIdentifier
+ * Added NPVariant and modified functions to use this new type.
+ *
+ * Revision 8 (July 9, 2004):
+ * Updated to joint Apple-Mozilla license.
+ *
+ * Revision 9 (August 12, 2004):
+ * Changed NPVariantType enum values to form PVariantType_XXX
+ * Added NPP arguments to NPObject functions.
+ * Replaced NPVariant functions with macros.
+ */
+#ifndef _NP_RUNTIME_H_
+#define _NP_RUNTIME_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include "npapi.h"
+
+/*
+    This API is used to facilitate binding code written in C to script
+    objects.  The API in this header does not assume the presence of a
+    user agent.  That is, it can be used to bind C code to scripting
+    environments outside of the context of a user agent.
+    
+    However, the normal use of the this API is in the context of a
+    scripting environment running in a browser or other user agent.
+    In particular it is used to support the extended Netscape
+    script-ability API for plugins (NP-SAP).  NP-SAP is an extension
+    of the Netscape plugin API.  As such we have adopted the use of
+    the "NP" prefix for this API.
+
+    The following NP{N|P}Variables were added to the Netscape plugin
+    API (in npapi.h):
+
+    NPNVWindowNPObject
+    NPNVPluginElementNPObject
+    NPPVpluginScriptableNPObject
+
+    These variables are exposed through NPN_GetValue() and
+    NPP_GetValue() (respectively) and are used to establish the
+    initial binding between the user agent and native code.  The DOM
+    objects in the user agent can be examined and manipulated using
+    the NPN_ functions that operate on NPObjects described in this
+    header.
+
+    To the extent possible the assumptions about the scripting
+    language used by the scripting environment have been minimized.
+*/
+
+
+/*
+    Objects (non-primitive data) passed between 'C' and script is
+    always wrapped in an NPObject.  The 'interface' of an NPObject is
+    described by an NPClass.
+*/
+typedef struct NPObject NPObject;
+typedef struct NPClass NPClass;
+
+typedef char NPUTF8;
+typedef struct _NPString {
+    const NPUTF8 *UTF8Characters;
+    uint32_t UTF8Length;
+} NPString;
+  
+typedef enum {
+    NPVariantType_Void,
+    NPVariantType_Null,
+    NPVariantType_Bool,
+    NPVariantType_Int32,
+    NPVariantType_Double,
+    NPVariantType_String,
+    NPVariantType_Object
+} NPVariantType;
+
+typedef struct _NPVariant {
+    NPVariantType type;
+    union {
+        bool boolValue;
+        int32_t intValue;
+        double doubleValue;
+        NPString stringValue;
+        NPObject *objectValue;
+    } value;
+} NPVariant;
+
+/*
+    NPN_ReleaseVariantValue is called on all 'out' parameters references.
+    Specifically it is called on variants that are resultant out parameters
+    in NPGetPropertyFunctionPtr and NPInvokeFunctionPtr.  Resultant variants
+    from these two functions should be initialized using the
+    NPN_InitializeVariantXXX() functions.
+    
+    After calling NPReleaseVariantValue, the type of the variant will
+    be set to NPVariantUndefinedType.
+*/
+void NPN_ReleaseVariantValue (NPVariant *variant);
+
+#define NPVARIANT_IS_VOID(_v)    ((_v).type == NPVariantType_Void)
+#define NPVARIANT_IS_NULL(_v)    ((_v).type == NPVariantType_Null)
+#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
+#define NPVARIANT_IS_INT32(_v)   ((_v).type == NPVariantType_Int32)
+#define NPVARIANT_IS_DOUBLE(_v)  ((_v).type == NPVariantType_Double)
+#define NPVARIANT_IS_STRING(_v)  ((_v).type == NPVariantType_String)
+#define NPVARIANT_IS_OBJECT(_v)  ((_v).type == NPVariantType_Object)
+
+#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
+#define NPVARIANT_TO_INT32(_v)   ((_v).value.intValue)
+#define NPVARIANT_TO_DOUBLE(_v)  ((_v).value.doubleValue)
+#define NPVARIANT_TO_STRING(_v)  ((_v).value.stringValue)
+#define NPVARIANT_TO_OBJECT(_v)  ((_v).value.objectValue)
+
+#define NP_BEGIN_MACRO  do {
+#define NP_END_MACRO    } while (0)
+
+#define VOID_TO_NPVARIANT(_v)                NP_BEGIN_MACRO (_v).type = NPVariantType_Void; (_v).value.objectValue = NULL; NP_END_MACRO
+#define NULL_TO_NPVARIANT(_v)                NP_BEGIN_MACRO (_v).type = NPVariantType_Null; (_v).value.objectValue = NULL; NP_END_MACRO
+#define BOOLEAN_TO_NPVARIANT(_val, _v)       NP_BEGIN_MACRO (_v).type = NPVariantType_Bool; (_v).value.boolValue = !!(_val); NP_END_MACRO
+#define INT32_TO_NPVARIANT(_val, _v)         NP_BEGIN_MACRO (_v).type = NPVariantType_Int32; (_v).value.intValue = _val; NP_END_MACRO
+#define DOUBLE_TO_NPVARIANT(_val, _v)        NP_BEGIN_MACRO (_v).type = NPVariantType_Double; (_v).value.doubleValue = _val; NP_END_MACRO
+#define STRINGZ_TO_NPVARIANT(_val, _v)       NP_BEGIN_MACRO (_v).type = NPVariantType_String; NPString str = { _val, strlen(_val) }; (_v).value.stringValue = str; NP_END_MACRO
+#define STRINGN_TO_NPVARIANT(_val, _len, _v) NP_BEGIN_MACRO (_v).type = NPVariantType_String; NPString str = { _val, _len }; (_v).value.stringValue = str; NP_END_MACRO
+#define OBJECT_TO_NPVARIANT(_val, _v)        NP_BEGIN_MACRO (_v).type = NPVariantType_Object; (_v).value.objectValue = _val; NP_END_MACRO
+
+/*
+        Type mappings (JavaScript types have been used for illustration
+    purposes):
+
+        JavaScript       to             C (NPVariant with type:)
+        undefined                       NPVariantType_Void
+        null                            NPVariantType_Null
+        Boolean                         NPVariantType_Bool
+        Number                          NPVariantType_Double or NPVariantType_Int32
+        String                          NPVariantType_String
+        Object                          NPVariantType_Object
+
+        C (NPVariant with type:)   to   JavaScript
+        NPVariantType_Void              undefined
+        NPVariantType_Null              null
+        NPVariantType_Bool              Boolean 
+        NPVariantType_Int32             Number
+        NPVariantType_Double            Number
+        NPVariantType_String            String
+        NPVariantType_Object            Object
+*/
+
+typedef void *NPIdentifier;
+
+/*
+    NPObjects have methods and properties.  Methods and properties are
+    identified with NPIdentifiers.  These identifiers may be reflected
+    in script.  NPIdentifiers can be either strings or integers, IOW,
+    methods and properties can be identified by either strings or
+    integers (i.e. foo["bar"] vs foo[1]). NPIdentifiers can be
+    compared using ==.  In case of any errors, the requested
+    NPIdentifier(s) will be NULL.
+*/
+NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name);
+void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount, NPIdentifier *identifiers);
+NPIdentifier NPN_GetIntIdentifier(int32_t intid);
+bool NPN_IdentifierIsString(NPIdentifier identifier);
+
+/*
+    The NPUTF8 returned from NPN_UTF8FromIdentifier SHOULD be freed.
+*/
+NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier);
+
+/*
+    Get the integer represented by identifier. If identifier is not an
+    integer identifier, the behaviour is undefined.
+*/
+int32_t NPN_IntFromIdentifier(NPIdentifier identifier);
+
+/*
+    NPObject behavior is implemented using the following set of
+    callback functions.
+
+    The NPVariant *result argument of these functions (where
+    applicable) should be released using NPN_ReleaseVariantValue().
+*/
+typedef NPObject *(*NPAllocateFunctionPtr)(NPP npp, NPClass *aClass);
+typedef void (*NPDeallocateFunctionPtr)(NPObject *obj);
+typedef void (*NPInvalidateFunctionPtr)(NPObject *obj);
+typedef bool (*NPHasMethodFunctionPtr)(NPObject *obj, NPIdentifier name);
+typedef bool (*NPInvokeFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result);
+typedef bool (*NPInvokeDefaultFunctionPtr)(NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
+typedef bool (*NPHasPropertyFunctionPtr)(NPObject *obj, NPIdentifier name);
+typedef bool (*NPGetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, NPVariant *result);
+typedef bool (*NPSetPropertyFunctionPtr)(NPObject *obj, NPIdentifier name, const NPVariant *value);
+typedef bool (*NPRemovePropertyFunctionPtr)(NPObject *npobj, NPIdentifier name);
+typedef bool (*NPEnumerationFunctionPtr)(NPObject *npobj, NPIdentifier **value, uint32_t *count);
+
+/*
+    NPObjects returned by create have a reference count of one.  It is the caller's responsibility
+    to release the returned object.
+
+    NPInvokeFunctionPtr function may return false to indicate a the method could not be invoked.
+    
+    NPGetPropertyFunctionPtr and NPSetPropertyFunctionPtr may return false to indicate a property doesn't
+    exist.
+    
+    NPInvalidateFunctionPtr is called by the scripting environment when the native code is
+    shutdown.  Any attempt to message a NPObject instance after the invalidate
+    callback has been called will result in undefined behavior, even if the
+    native code is still retaining those NPObject instances.
+    (The runtime will typically return immediately, with 0 or NULL, from an attempt to
+    dispatch to a NPObject, but this behavior should not be depended upon.)
+    
+    The NPEnumerationFunctionPtr function may pass an array of                  
+    NPIdentifiers back to the caller. The callee allocs the memory of           
+    the array using NPN_MemAlloc(), and it's the caller's responsibility        
+    to release it using NPN_MemFree().           
+*/
+struct NPClass
+{
+    uint32_t structVersion;
+    NPAllocateFunctionPtr allocate;
+    NPDeallocateFunctionPtr deallocate;
+    NPInvalidateFunctionPtr invalidate;
+    NPHasMethodFunctionPtr hasMethod;
+    NPInvokeFunctionPtr invoke;
+    NPInvokeDefaultFunctionPtr invokeDefault;
+    NPHasPropertyFunctionPtr hasProperty;
+    NPGetPropertyFunctionPtr getProperty;
+    NPSetPropertyFunctionPtr setProperty;
+    NPRemovePropertyFunctionPtr removeProperty;
+    NPEnumerationFunctionPtr enumerate;
+};
+
+#define NP_CLASS_STRUCT_VERSION      2
+#define NP_CLASS_STRUCT_VERSION_ENUM 2                           
+#define NP_CLASS_STRUCT_VERSION_HAS_ENUM(npclass)   \
+    ((npclass)->structVersion >= NP_CLASS_STRUCT_VERSION_ENUM)
+
+struct NPObject {
+    NPClass *_class;
+    uint32_t referenceCount;
+    // Additional space may be allocated here by types of NPObjects
+};
+
+/*
+    If the class has an allocate function, NPN_CreateObject invokes that function,
+    otherwise a NPObject is allocated and returned.  If a class has an allocate
+    function it is the responsibility of that implementation to set the initial retain
+    count to 1.
+*/
+NPObject *NPN_CreateObject(NPP npp, NPClass *aClass);
+
+/*
+    Increment the NPObject's reference count.
+*/
+NPObject *NPN_RetainObject (NPObject *obj);
+
+/*
+    Decremented the NPObject's reference count.  If the reference
+    count goes to zero, the class's destroy function is invoke if
+    specified, otherwise the object is freed directly.
+*/
+void NPN_ReleaseObject (NPObject *obj);
+
+/*
+    Functions to access script objects represented by NPObject.
+
+    Calls to script objects are synchronous.  If a function returns a
+    value, it will be supplied via the result NPVariant
+    argument. Successful calls will return true, false will be
+    returned in case of an error.
+    
+    Calls made from plugin code to script must be made from the thread
+    on which the plugin was initialized.
+*/
+bool NPN_Invoke(NPP npp, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
+bool NPN_InvokeDefault(NPP npp, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
+bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script, NPVariant *result);
+bool NPN_GetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, NPVariant *result);
+bool NPN_SetProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName, const NPVariant *value);
+bool NPN_RemoveProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
+bool NPN_HasProperty(NPP npp, NPObject *npobj, NPIdentifier propertyName);
+bool NPN_HasMethod(NPP npp, NPObject *npobj, NPIdentifier methodName);
+bool NPN_Enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier, uint32_t *count);
+bool NPN_Construct(NPP npp, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result);
+
+/*
+    NPN_SetException may be called to trigger a script exception upon return
+    from entry points into NPObjects.
+*/
+void NPN_SetException (NPObject *obj, const NPUTF8 *message);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/browser-plugin/npupp.h b/browser-plugin/npupp.h
new file mode 100644
index 0000000..94712da
--- /dev/null
+++ b/browser-plugin/npupp.h
@@ -0,0 +1,719 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+
+/*
+ *  npupp.h $Revision: 3.26 $
+ *  function call mecahnics needed by platform specific glue code.
+ */
+
+
+#ifndef _NPUPP_H_
+#define _NPUPP_H_
+
+#if defined(__OS2__)
+#pragma pack(1)
+#endif
+
+#ifndef GENERATINGCFM
+#define GENERATINGCFM 0
+#endif
+
+#ifndef _NPAPI_H_
+#include "npapi.h"
+#endif
+
+#include "npruntime.h"
+
+#ifdef OJI
+#include "jri.h"
+#else
+typedef void*           JRIGlobalRef;
+#endif
+
+
+/******************************************************************************************
+   plug-in function table macros
+ 	        for each function in and out of the plugin API we define
+                    typedef NPP_FooUPP
+					#define NewNPP_FooProc
+					#define CallNPP_FooProc
+ *******************************************************************************************/
+
+
+/* NPP_Initialize */
+typedef void (* NP_LOADDS NPP_InitializeUPP)(void);
+#define NewNPP_InitializeProc(FUNC)		\
+		((NPP_InitializeUPP) (FUNC))
+#define CallNPP_InitializeProc(FUNC)		\
+		(*(FUNC))()
+
+/* NPP_Shutdown */
+typedef void (* NP_LOADDS NPP_ShutdownUPP)(void);
+#define NewNPP_ShutdownProc(FUNC)		\
+		((NPP_ShutdownUPP) (FUNC))
+#define CallNPP_ShutdownProc(FUNC)		\
+		(*(FUNC))()
+
+/* NPP_New */
+typedef NPError	(* NP_LOADDS NPP_NewUPP)(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char* argn[], char* argv[], NPSavedData* saved);
+#define NewNPP_NewProc(FUNC)		\
+		((NPP_NewUPP) (FUNC))
+#define CallNPP_NewProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6), (ARG7))
+
+/* NPP_Destroy */
+typedef NPError	(* NP_LOADDS NPP_DestroyUPP)(NPP instance, NPSavedData** save);
+#define NewNPP_DestroyProc(FUNC)		\
+		((NPP_DestroyUPP) (FUNC))
+#define CallNPP_DestroyProc(FUNC, ARG1, ARG2)		\
+		(*(FUNC))((ARG1), (ARG2))
+
+/* NPP_SetWindow */
+typedef NPError	(* NP_LOADDS NPP_SetWindowUPP)(NPP instance, NPWindow* window);
+#define NewNPP_SetWindowProc(FUNC)		\
+		((NPP_SetWindowUPP) (FUNC))
+#define CallNPP_SetWindowProc(FUNC, ARG1, ARG2)		\
+		(*(FUNC))((ARG1), (ARG2))
+
+/* NPP_NewStream */
+typedef NPError	(* NP_LOADDS NPP_NewStreamUPP)(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype);
+#define NewNPP_NewStreamProc(FUNC)		\
+		((NPP_NewStreamUPP) (FUNC))
+#define CallNPP_NewStreamProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5) \
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5))
+
+/* NPP_DestroyStream */
+typedef NPError	(* NP_LOADDS NPP_DestroyStreamUPP)(NPP instance, NPStream* stream, NPReason reason);
+#define NewNPP_DestroyStreamProc(FUNC)		\
+		((NPP_DestroyStreamUPP) (FUNC))
+#define CallNPP_DestroyStreamProc(FUNC,  NPParg, NPStreamPtr, NPReasonArg)		\
+		(*(FUNC))((NPParg), (NPStreamPtr), (NPReasonArg))
+
+/* NPP_WriteReady */
+typedef int32 (* NP_LOADDS NPP_WriteReadyUPP)(NPP instance, NPStream* stream);
+#define NewNPP_WriteReadyProc(FUNC)		\
+		((NPP_WriteReadyUPP) (FUNC))
+#define CallNPP_WriteReadyProc(FUNC,  NPParg, NPStreamPtr)		\
+		(*(FUNC))((NPParg), (NPStreamPtr))
+
+/* NPP_Write */
+typedef int32 (* NP_LOADDS NPP_WriteUPP)(NPP instance, NPStream* stream, int32 offset, int32 len, void* buffer);
+#define NewNPP_WriteProc(FUNC)		\
+		((NPP_WriteUPP) (FUNC))
+#define CallNPP_WriteProc(FUNC,  NPParg, NPStreamPtr, offsetArg, lenArg, bufferPtr)		\
+		(*(FUNC))((NPParg), (NPStreamPtr), (offsetArg), (lenArg), (bufferPtr))
+
+/* NPP_StreamAsFile */
+typedef void (* NP_LOADDS NPP_StreamAsFileUPP)(NPP instance, NPStream* stream, const char* fname);
+#define NewNPP_StreamAsFileProc(FUNC)		\
+		((NPP_StreamAsFileUPP) (FUNC))
+#define CallNPP_StreamAsFileProc(FUNC,  ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPP_Print */
+typedef void (* NP_LOADDS NPP_PrintUPP)(NPP instance, NPPrint* platformPrint);
+#define NewNPP_PrintProc(FUNC)		\
+		((NPP_PrintUPP) (FUNC))
+#define CallNPP_PrintProc(FUNC,  NPParg, NPPrintArg)		\
+		(*(FUNC))((NPParg), (NPPrintArg))
+
+/* NPP_HandleEvent */
+typedef int16 (* NP_LOADDS NPP_HandleEventUPP)(NPP instance, void* event);
+#define NewNPP_HandleEventProc(FUNC)		\
+		((NPP_HandleEventUPP) (FUNC))
+#define CallNPP_HandleEventProc(FUNC,  NPParg, voidPtr)		\
+		(*(FUNC))((NPParg), (voidPtr))
+
+/* NPP_URLNotify */
+typedef void (* NP_LOADDS NPP_URLNotifyUPP)(NPP instance, const char* url, NPReason reason, void* notifyData);
+#define NewNPP_URLNotifyProc(FUNC)		\
+		((NPP_URLNotifyUPP) (FUNC))
+#define CallNPP_URLNotifyProc(FUNC,  ARG1, ARG2, ARG3, ARG4)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4))
+
+/* NPP_GetValue */
+typedef NPError	(* NP_LOADDS NPP_GetValueUPP)(NPP instance, NPPVariable variable, void *ret_alue);
+#define NewNPP_GetValueProc(FUNC)		\
+		((NPP_GetValueUPP) (FUNC))
+#define CallNPP_GetValueProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPP_SetValue */
+typedef NPError	(* NP_LOADDS NPP_SetValueUPP)(NPP instance, NPNVariable variable, void *ret_alue);
+#define NewNPP_SetValueProc(FUNC)		\
+		((NPP_SetValueUPP) (FUNC))
+#define CallNPP_SetValueProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/*
+ *  Netscape entry points
+ */
+
+
+/* NPN_GetValue */
+typedef NPError	(* NP_LOADDS NPN_GetValueUPP)(NPP instance, NPNVariable variable, void *ret_alue);
+#define NewNPN_GetValueProc(FUNC)		\
+		((NPN_GetValueUPP) (FUNC))
+#define CallNPN_GetValueProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPN_SetValue */
+typedef NPError	(* NP_LOADDS NPN_SetValueUPP)(NPP instance, NPPVariable variable, void *ret_alue);
+#define NewNPN_SetValueProc(FUNC)		\
+		((NPN_SetValueUPP) (FUNC))
+#define CallNPN_SetValueProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPN_GetUrlNotify */
+typedef NPError	(* NP_LOADDS NPN_GetURLNotifyUPP)(NPP instance, const char* url, const char* window, void* notifyData);
+#define NewNPN_GetURLNotifyProc(FUNC)		\
+		((NPN_GetURLNotifyUPP) (FUNC))
+#define CallNPN_GetURLNotifyProc(FUNC, ARG1, ARG2, ARG3, ARG4)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4))
+
+/* NPN_PostUrlNotify */
+typedef NPError (* NP_LOADDS NPN_PostURLNotifyUPP)(NPP instance, const char* url, const char* window, uint32 len, const char* buf, NPBool file, void* notifyData);
+#define NewNPN_PostURLNotifyProc(FUNC)		\
+		((NPN_PostURLNotifyUPP) (FUNC))
+#define CallNPN_PostURLNotifyProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) \
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6), (ARG7))
+
+/* NPN_GetUrl */
+typedef NPError	(* NP_LOADDS NPN_GetURLUPP)(NPP instance, const char* url, const char* window);
+#define NewNPN_GetURLProc(FUNC)		\
+		((NPN_GetURLUPP) (FUNC))
+#define CallNPN_GetURLProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPN_PostUrl */
+typedef NPError (* NP_LOADDS NPN_PostURLUPP)(NPP instance, const char* url, const char* window, uint32 len, const char* buf, NPBool file);
+#define NewNPN_PostURLProc(FUNC)		\
+		((NPN_PostURLUPP) (FUNC))
+#define CallNPN_PostURLProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) \
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6))
+
+/* NPN_RequestRead */
+typedef NPError	(* NP_LOADDS NPN_RequestReadUPP)(NPStream* stream, NPByteRange* rangeList);
+#define NewNPN_RequestReadProc(FUNC)		\
+		((NPN_RequestReadUPP) (FUNC))
+#define CallNPN_RequestReadProc(FUNC, stream, range)		\
+		(*(FUNC))((stream), (range))
+
+/* NPN_NewStream */
+typedef NPError	(* NP_LOADDS NPN_NewStreamUPP)(NPP instance, NPMIMEType type, const char* window, NPStream** stream);
+#define NewNPN_NewStreamProc(FUNC)		\
+		((NPN_NewStreamUPP) (FUNC))
+#define CallNPN_NewStreamProc(FUNC, npp, type, window, stream)		\
+		(*(FUNC))((npp), (type), (window), (stream))
+
+/* NPN_Write */
+typedef int32 (* NP_LOADDS NPN_WriteUPP)(NPP instance, NPStream* stream, int32 len, void* buffer);
+#define NewNPN_WriteProc(FUNC)		\
+		((NPN_WriteUPP) (FUNC))
+#define CallNPN_WriteProc(FUNC, npp, stream, len, buffer)		\
+		(*(FUNC))((npp), (stream), (len), (buffer))
+
+/* NPN_DestroyStream */
+typedef NPError (* NP_LOADDS NPN_DestroyStreamUPP)(NPP instance, NPStream* stream, NPReason reason);
+#define NewNPN_DestroyStreamProc(FUNC)		\
+		((NPN_DestroyStreamUPP) (FUNC))
+#define CallNPN_DestroyStreamProc(FUNC, npp, stream, reason)		\
+		(*(FUNC))((npp), (stream), (reason))
+
+/* NPN_Status */
+typedef void (* NP_LOADDS NPN_StatusUPP)(NPP instance, const char* message);
+#define NewNPN_StatusProc(FUNC)		\
+		((NPN_StatusUPP) (FUNC))
+#define CallNPN_StatusProc(FUNC, npp, msg)		\
+		(*(FUNC))((npp), (msg))	
+
+/* NPN_UserAgent */
+typedef const char*	(* NP_LOADDS NPN_UserAgentUPP)(NPP instance);
+#define NewNPN_UserAgentProc(FUNC)              \
+                ((NPN_UserAgentUPP) (FUNC))
+#define CallNPN_UserAgentProc(FUNC, ARG1)               \
+                (*(FUNC))((ARG1))
+
+/* NPN_MemAlloc */
+typedef void* (* NP_LOADDS NPN_MemAllocUPP)(uint32 size);
+#define NewNPN_MemAllocProc(FUNC)		\
+		((NPN_MemAllocUPP) (FUNC))
+#define CallNPN_MemAllocProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))	
+
+/* NPN__MemFree */
+typedef void (* NP_LOADDS NPN_MemFreeUPP)(void* ptr);
+#define NewNPN_MemFreeProc(FUNC)		\
+		((NPN_MemFreeUPP) (FUNC))
+#define CallNPN_MemFreeProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))	
+
+/* NPN_MemFlush */
+typedef uint32 (* NP_LOADDS NPN_MemFlushUPP)(uint32 size);
+#define NewNPN_MemFlushProc(FUNC)		\
+		((NPN_MemFlushUPP) (FUNC))
+#define CallNPN_MemFlushProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))	
+
+/* NPN_ReloadPlugins */
+typedef void (* NP_LOADDS NPN_ReloadPluginsUPP)(NPBool reloadPages);
+#define NewNPN_ReloadPluginsProc(FUNC)		\
+		((NPN_ReloadPluginsUPP) (FUNC))
+#define CallNPN_ReloadPluginsProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))	
+
+/* NPN_GetJavaEnv */
+typedef JRIEnv* (* NP_LOADDS NPN_GetJavaEnvUPP)(void);
+#define NewNPN_GetJavaEnvProc(FUNC)		\
+		((NPN_GetJavaEnvUPP) (FUNC))
+#define CallNPN_GetJavaEnvProc(FUNC)		\
+		(*(FUNC))()	
+
+/* NPN_GetJavaPeer */
+typedef jref (* NP_LOADDS NPN_GetJavaPeerUPP)(NPP instance);
+#define NewNPN_GetJavaPeerProc(FUNC)		\
+		((NPN_GetJavaPeerUPP) (FUNC))
+#define CallNPN_GetJavaPeerProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))	
+
+/* NPN_InvalidateRect */
+typedef void (* NP_LOADDS NPN_InvalidateRectUPP)(NPP instance, NPRect *rect);
+#define NewNPN_InvalidateRectProc(FUNC)		\
+		((NPN_InvalidateRectUPP) (FUNC))
+#define CallNPN_InvalidateRectProc(FUNC, ARG1, ARG2)		\
+		(*(FUNC))((ARG1), (ARG2))	
+
+/* NPN_InvalidateRegion */
+typedef void (* NP_LOADDS NPN_InvalidateRegionUPP)(NPP instance, NPRegion region);
+#define NewNPN_InvalidateRegionProc(FUNC)		\
+		((NPN_InvalidateRegionUPP) (FUNC))
+#define CallNPN_InvalidateRegionProc(FUNC, ARG1, ARG2)		\
+		(*(FUNC))((ARG1), (ARG2))	
+
+/* NPN_ForceRedraw */
+typedef void (* NP_LOADDS NPN_ForceRedrawUPP)(NPP instance);
+#define NewNPN_ForceRedrawProc(FUNC)		\
+		((NPN_ForceRedrawUPP) (FUNC))
+#define CallNPN_ForceRedrawProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))	
+
+/* NPN_GetStringIdentifier */
+typedef NPIdentifier (* NP_LOADDS NPN_GetStringIdentifierUPP)(const NPUTF8* name);
+#define NewNPN_GetStringIdentifierProc(FUNC)		\
+		((NPN_GetStringIdentifierUPP) (FUNC))
+#define CallNPN_GetStringIdentifierProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_GetStringIdentifiers */
+typedef void (* NP_LOADDS NPN_GetStringIdentifiersUPP)(const NPUTF8** names,
+                                                 int32_t nameCount,
+                                                 NPIdentifier* identifiers);
+#define NewNPN_GetStringIdentifiersProc(FUNC)		\
+		((NPN_GetStringIdentifiersUPP) (FUNC))
+#define CallNPN_GetStringIdentifiersProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPN_GetIntIdentifier */
+typedef NPIdentifier (* NP_LOADDS NPN_GetIntIdentifierUPP)(int32_t intid);
+#define NewNPN_GetIntIdentifierProc(FUNC)		\
+		((NPN_GetIntIdentifierUPP) (FUNC))
+#define CallNPN_GetIntIdentifierProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_IdentifierIsString */
+typedef bool (* NP_LOADDS NPN_IdentifierIsStringUPP)(NPIdentifier identifier);
+#define NewNPN_IdentifierIsStringProc(FUNC)		\
+		((NPN_IdentifierIsStringUPP) (FUNC))
+#define CallNPN_IdentifierIsStringProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_UTF8FromIdentifier */
+typedef NPUTF8* (* NP_LOADDS NPN_UTF8FromIdentifierUPP)(NPIdentifier identifier);
+#define NewNPN_UTF8FromIdentifierProc(FUNC)		\
+		((NPN_UTF8FromIdentifierUPP) (FUNC))
+#define CallNPN_UTF8FromIdentifierProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_IntFromIdentifier */
+typedef int32_t (* NP_LOADDS NPN_IntFromIdentifierUPP)(NPIdentifier identifier);
+#define NewNPN_IntFromIdentifierProc(FUNC)		\
+		((NPN_IntFromIdentifierUPP) (FUNC))
+#define CallNPN_IntFromIdentifierProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_CreateObject */
+typedef NPObject* (* NP_LOADDS NPN_CreateObjectUPP)(NPP npp, NPClass *aClass);
+#define NewNPN_CreateObjectProc(FUNC)		\
+		((NPN_CreateObjectUPP) (FUNC))
+#define CallNPN_CreateObjectProc(FUNC, ARG1, ARG2)		\
+		(*(FUNC))((ARG1), (ARG2))
+
+/* NPN_RetainObject */
+typedef NPObject* (* NP_LOADDS NPN_RetainObjectUPP)(NPObject *obj);
+#define NewNPN_RetainObjectProc(FUNC)		\
+		((NPN_RetainObjectUPP) (FUNC))
+#define CallNPN_RetainObjectProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_ReleaseObject */
+typedef void (* NP_LOADDS NPN_ReleaseObjectUPP)(NPObject *obj);
+#define NewNPN_ReleaseObjectProc(FUNC)		\
+		((NPN_ReleaseObjectUPP) (FUNC))
+#define CallNPN_ReleaseObjectProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_Invoke */
+typedef bool (* NP_LOADDS NPN_InvokeUPP)(NPP npp, NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
+#define NewNPN_InvokeProc(FUNC)		\
+		((NPN_InvokeUPP) (FUNC))
+#define CallNPN_InvokeProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6))
+
+/* NPN_InvokeDefault */
+typedef bool (* NP_LOADDS NPN_InvokeDefaultUPP)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
+#define NewNPN_InvokeDefaultProc(FUNC)		\
+		((NPN_InvokeDefaultUPP) (FUNC))
+#define CallNPN_InvokeDefaultProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5))
+
+/* NPN_Evaluate */
+typedef bool (* NP_LOADDS NPN_EvaluateUPP)(NPP npp, NPObject *obj, NPString *script, NPVariant *result);
+#define NewNPN_EvaluateProc(FUNC)		\
+		((NPN_EvaluateUPP) (FUNC))
+#define CallNPN_EvaluateProc(FUNC, ARG1, ARG2, ARG3, ARG4)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4))
+
+/* NPN_GetProperty */
+typedef bool (* NP_LOADDS NPN_GetPropertyUPP)(NPP npp, NPObject *obj, NPIdentifier propertyName, NPVariant *result);
+#define NewNPN_GetPropertyProc(FUNC)		\
+		((NPN_GetPropertyUPP) (FUNC))
+#define CallNPN_GetPropertyProc(FUNC, ARG1, ARG2, ARG3, ARG4)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4))
+
+/* NPN_SetProperty */
+typedef bool (* NP_LOADDS NPN_SetPropertyUPP)(NPP npp, NPObject *obj, NPIdentifier propertyName, const NPVariant *value);
+#define NewNPN_SetPropertyProc(FUNC)		\
+		((NPN_SetPropertyUPP) (FUNC))
+#define CallNPN_SetPropertyProc(FUNC, ARG1, ARG2, ARG3, ARG4)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4))
+
+/* NPN_RemoveProperty */
+typedef bool (* NP_LOADDS NPN_RemovePropertyUPP)(NPP npp, NPObject *obj, NPIdentifier propertyName);
+#define NewNPN_RemovePropertyProc(FUNC)		\
+		((NPN_RemovePropertyUPP) (FUNC))
+#define CallNPN_RemovePropertyProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPN_HasProperty */
+typedef bool (* NP_LOADDS NPN_HasPropertyUPP)(NPP npp, NPObject *obj, NPIdentifier propertyName);
+#define NewNPN_HasPropertyProc(FUNC)		\
+		((NPN_HasPropertyUPP) (FUNC))
+#define CallNPN_HasPropertyProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPN_HasMethod */
+typedef bool (* NP_LOADDS NPN_HasMethodUPP)(NPP npp, NPObject *obj, NPIdentifier propertyName);
+#define NewNPN_HasMethodProc(FUNC)		\
+		((NPN_HasMethodUPP) (FUNC))
+#define CallNPN_HasMethodProc(FUNC, ARG1, ARG2, ARG3)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPN_ReleaseVariantValue */
+typedef void (* NP_LOADDS NPN_ReleaseVariantValueUPP)(NPVariant *variant);
+#define NewNPN_ReleaseVariantValueProc(FUNC)		\
+		((NPN_ReleaseVariantValueUPP) (FUNC))
+#define CallNPN_ReleaseVariantValueProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_SetException */
+typedef void (* NP_LOADDS NPN_SetExceptionUPP)(NPObject *obj, const NPUTF8 *message);
+#define NewNPN_SetExceptionProc(FUNC)		\
+		((NPN_SetExceptionUPP) (FUNC))
+#define CallNPN_SetExceptionProc(FUNC, ARG1, ARG2)		\
+		(*(FUNC))((ARG1), (ARG2))	
+
+/* NPN_PushPopupsEnabledStateUPP */
+typedef bool (* NP_LOADDS NPN_PushPopupsEnabledStateUPP)(NPP npp, NPBool enabled);
+#define NewNPN_PushPopupsEnabledStateProc(FUNC)		\
+		((NPN_PushPopupsEnabledStateUPP) (FUNC))
+#define CallNPN_PushPopupsEnabledStateProc(FUNC, ARG1, ARG2)		\
+		(*(FUNC))((ARG1), (ARG2))
+
+/* NPN_PopPopupsEnabledState */
+typedef bool (* NP_LOADDS NPN_PopPopupsEnabledStateUPP)(NPP npp);
+#define NewNPN_PopPopupsEnabledStateProc(FUNC)		\
+		((NPN_PopPopupsEnabledStateUPP) (FUNC))
+#define CallNPN_PopPopupsEnabledStateProc(FUNC, ARG1)		\
+		(*(FUNC))((ARG1))
+
+/* NPN_Enumerate */
+typedef bool (* NP_LOADDS NPN_EnumerateUPP)(NPP npp, NPObject *obj, NPIdentifier **identifier, uint32_t *count);
+#define NewNPN_EnumerateProc(FUNC)		\
+		((NPN_EnumerateUPP) (FUNC))
+#define CallNPN_EnumerateProc(FUNC, ARG1, ARG2, ARG3, ARG4)		\
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4))
+
+/* NPN_PluginThreadAsyncCall */
+typedef void (* NP_LOADDS NPN_PluginThreadAsyncCallUPP)(NPP instance, void (*func)(void *), void *userData);
+#define NewNPN_PluginThreadAsyncCallProc(FUNC) \
+		((NPN_PluginThreadAsyncCallUPP) (FUNC))
+#define CallNPN_PluginThreadAsyncCallProc(FUNC, ARG1, ARG2, ARG3) \
+		(*(FUNC))((ARG1), (ARG2), (ARG3))
+
+/* NPN_Construct */
+typedef bool (* NP_LOADDS NPN_ConstructUPP)(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result);
+#define NewNPN_ConstructProc(FUNC)		\
+		((NPN_ConstructUPP) (FUNC))
+#define CallNPN_ConstructProc(FUNC, ARG1, ARG2, ARG3, ARG4, ARG5)      \
+		(*(FUNC))((ARG1), (ARG2), (ARG3), (ARG4), (ARG5))
+
+
+
+/******************************************************************************************
+ * The actual plugin function table definitions
+ *******************************************************************************************/
+
+typedef struct _NPPluginFuncs {
+    uint16 size;
+    uint16 version;
+    NPP_NewUPP newp;
+    NPP_DestroyUPP destroy;
+    NPP_SetWindowUPP setwindow;
+    NPP_NewStreamUPP newstream;
+    NPP_DestroyStreamUPP destroystream;
+    NPP_StreamAsFileUPP asfile;
+    NPP_WriteReadyUPP writeready;
+    NPP_WriteUPP write;
+    NPP_PrintUPP print;
+    NPP_HandleEventUPP event;
+    NPP_URLNotifyUPP urlnotify;
+    JRIGlobalRef javaClass;
+    NPP_GetValueUPP getvalue;
+    NPP_SetValueUPP setvalue;
+} NPPluginFuncs;
+
+typedef struct _NPNetscapeFuncs {
+    uint16 size;
+    uint16 version;
+    NPN_GetURLUPP geturl;
+    NPN_PostURLUPP posturl;
+    NPN_RequestReadUPP requestread;
+    NPN_NewStreamUPP newstream;
+    NPN_WriteUPP write;
+    NPN_DestroyStreamUPP destroystream;
+    NPN_StatusUPP status;
+    NPN_UserAgentUPP uagent;
+    NPN_MemAllocUPP memalloc;
+    NPN_MemFreeUPP memfree;
+    NPN_MemFlushUPP memflush;
+    NPN_ReloadPluginsUPP reloadplugins;
+    NPN_GetJavaEnvUPP getJavaEnv;
+    NPN_GetJavaPeerUPP getJavaPeer;
+    NPN_GetURLNotifyUPP geturlnotify;
+    NPN_PostURLNotifyUPP posturlnotify;
+    NPN_GetValueUPP getvalue;
+    NPN_SetValueUPP setvalue;
+    NPN_InvalidateRectUPP invalidaterect;
+    NPN_InvalidateRegionUPP invalidateregion;
+    NPN_ForceRedrawUPP forceredraw;
+    NPN_GetStringIdentifierUPP getstringidentifier;
+    NPN_GetStringIdentifiersUPP getstringidentifiers;
+    NPN_GetIntIdentifierUPP getintidentifier;
+    NPN_IdentifierIsStringUPP identifierisstring;
+    NPN_UTF8FromIdentifierUPP utf8fromidentifier;
+    NPN_IntFromIdentifierUPP intfromidentifier;
+    NPN_CreateObjectUPP createobject;
+    NPN_RetainObjectUPP retainobject;
+    NPN_ReleaseObjectUPP releaseobject;
+    NPN_InvokeUPP invoke;
+    NPN_InvokeDefaultUPP invokeDefault;
+    NPN_EvaluateUPP evaluate;
+    NPN_GetPropertyUPP getproperty;
+    NPN_SetPropertyUPP setproperty;
+    NPN_RemovePropertyUPP removeproperty;
+    NPN_HasPropertyUPP hasproperty;
+    NPN_HasMethodUPP hasmethod;
+    NPN_ReleaseVariantValueUPP releasevariantvalue;
+    NPN_SetExceptionUPP setexception;
+    NPN_PushPopupsEnabledStateUPP pushpopupsenabledstate;
+    NPN_PopPopupsEnabledStateUPP poppopupsenabledstate;
+    NPN_EnumerateUPP enumerate;
+    NPN_PluginThreadAsyncCallUPP pluginthreadasynccall;
+    NPN_ConstructUPP construct;
+} NPNetscapeFuncs;
+
+
+#ifdef XP_MACOSX
+/******************************************************************************************
+ * Mac platform-specific plugin glue stuff
+ *******************************************************************************************/
+
+/*
+ * Main entry point of the plugin.
+ * This routine will be called when the plugin is loaded. The function
+ * tables are passed in and the plugin fills in the NPPluginFuncs table
+ * and NPPShutdownUPP for Netscape's use.
+ */
+typedef NPError (* NP_LOADDS NPP_MainEntryUPP)(NPNetscapeFuncs*, NPPluginFuncs*, NPP_ShutdownUPP*);
+#define NewNPP_MainEntryProc(FUNC)		\
+		((NPP_MainEntryUPP) (FUNC))
+#define CallNPP_MainEntryProc(FUNC,  netscapeFunc, pluginFunc, shutdownUPP)		\
+		(*(FUNC))((netscapeFunc), (pluginFunc), (shutdownUPP))
+
+/*
+ * Mac OS X version(s) of NP_GetMIMEDescription(const char *)
+ * These can be called to retreive MIME information from the plugin dynamically
+ *
+ * Note: For compatibility with Quicktime, BPSupportedMIMEtypes is another way
+ *       to get mime info from the plugin only on OSX and may not be supported 
+ *       in furture version -- use NP_GetMIMEDescription instead
+ */
+
+enum
+{
+ kBPSupportedMIMETypesStructVers_1    = 1
+};
+
+typedef struct _BPSupportedMIMETypes
+{
+ SInt32    structVersion;      /* struct version */
+ Handle    typeStrings;        /* STR# formated handle, allocated by plug-in */
+ Handle    infoStrings;        /* STR# formated handle, allocated by plug-in */
+} BPSupportedMIMETypes;
+OSErr BP_GetSupportedMIMETypes(BPSupportedMIMETypes *mimeInfo, UInt32 flags);
+
+ /* NP_GetMIMEDescription */
+#define NP_GETMIMEDESCRIPTION_NAME "NP_GetMIMEDescription"
+typedef const char* (* NP_LOADDS NP_GetMIMEDescriptionUPP)();
+#define NewNP_GetMIMEDescEntryProc(FUNC)		\
+		((NP_GetMIMEDescriptionUPP) (FUNC))
+#define CallNP_GetMIMEDescEntryProc(FUNC)		\
+		(*(FUNC))()
+
+/* BP_GetSupportedMIMETypes */
+typedef OSErr (* NP_LOADDS BP_GetSupportedMIMETypesUPP)(BPSupportedMIMETypes*, UInt32);
+#define NewBP_GetSupportedMIMETypesEntryProc(FUNC)		\
+		((BP_GetSupportedMIMETypesUPP) (FUNC))
+#define CallBP_GetMIMEDescEntryProc(FUNC,  mimeInfo, flags)		\
+		(*(FUNC))((mimeInfo), (flags))
+
+#endif /* XP_MACOSX */
+
+#if defined(_WINDOWS)
+#define OSCALL WINAPI
+#else
+#if defined(__OS2__)
+#define OSCALL _System
+#else
+#define OSCALL
+#endif
+#endif
+
+#if defined(XP_UNIX)
+/* GCC 3.3 and later support the visibility attribute. */
+#if defined(__GNUC__) && \
+    ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
+#define NP_VISIBILITY_DEFAULT __attribute__((visibility("default")))
+#else
+#define NP_VISIBILITY_DEFAULT
+#endif
+
+#define NP_EXPORT(__type) NP_VISIBILITY_DEFAULT __type
+#endif
+
+#if defined( _WINDOWS ) || defined (__OS2__)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* plugin meta member functions */
+#if defined(__OS2__)
+
+typedef struct _NPPluginData {   /* Alternate OS2 Plugin interface */
+    char *pMimeTypes;
+    char *pFileExtents;
+    char *pFileOpenTemplate;
+    char *pProductName;
+    char *pProductDescription;
+    unsigned long dwProductVersionMS;
+    unsigned long dwProductVersionLS;
+} NPPluginData;
+
+NPError OSCALL NP_GetPluginData(NPPluginData * pPluginData);
+
+#endif
+
+NPError OSCALL NP_GetEntryPoints(NPPluginFuncs* pFuncs);
+
+NPError OSCALL NP_Initialize(NPNetscapeFuncs* pFuncs);
+
+NPError OSCALL NP_Shutdown();
+
+char*	NP_GetMIMEDescription();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WINDOWS || __OS2__ */
+
+#if defined(__OS2__)
+#pragma pack()
+#endif
+
+#ifdef XP_UNIX
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* plugin meta member functions */
+
+NP_EXPORT(char*)   NP_GetMIMEDescription(void);
+NP_EXPORT(NPError) NP_Initialize(NPNetscapeFuncs*, NPPluginFuncs*);
+NP_EXPORT(NPError) NP_Shutdown(void);
+NP_EXPORT(NPError) NP_GetValue(void *future, NPPVariable aVariable, void *aValue);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* XP_UNIX */
+
+#endif /* _NPUPP_H_ */
diff --git a/browser-plugin/parole-plugin.cpp b/browser-plugin/parole-plugin.cpp
new file mode 100644
index 0000000..4441380
--- /dev/null
+++ b/browser-plugin/parole-plugin.cpp
@@ -0,0 +1,146 @@
+/* 
+ * Modified version of totemPluginGlue
+ * 
+ * Totem Mozilla plugin
+ * 
+ * Copyright © 2004-2006 Bastien Nocera <hadess at hadess.net>
+ * Copyright © 2002 David A. Schleef <ds at schleef.org>
+ * Copyright © 2006, 2008 Christian Persch
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#include <glib.h>
+
+#include "parole-plugin.h"
+
+NPError ParolePlugin::Init (NPMIMEType mimetype,
+			    uint16_t mode,
+			    int16_t argc,
+			    char *argn[],
+			    char *argv[],
+			    NPSavedData *saved)
+{
+    g_debug ("Init");
+    
+    for (int i = 0; i < argc; i++)
+    {
+	g_print ("argv[%d] %s %s\n", i, argn[i], argv[i] ? argv[i] : "");
+    }
+    
+    return NPERR_NO_ERROR;
+}
+
+NPError ParolePlugin::Shutdown (void)
+{
+    return NPERR_NO_ERROR;
+}
+
+NPError ParolePlugin::Initialize (void)
+{
+    return NPERR_NO_ERROR;
+}
+
+NPError ParolePlugin::NewStream (NPMIMEType type, NPStream *stream,
+				 NPBool seekable, uint16 *stype)
+{
+    g_debug ("New stream callback %s", stream->url);
+    
+    if ( !url )
+    {
+	gchar *command[6];
+	gchar *socket;
+	gchar *app;
+	GError *error = NULL;
+	
+	url = g_strdup (stream->url);
+	
+	socket = g_strdup_printf ("%ld", window);
+	
+	//app = g_build_filename (LIBEXECDIR, "parole-media-plugin", NULL);
+	app = g_strdup ("media-plugin/parole-media-plugin");
+	command[0] = app;
+	command[1] = (gchar *)"--socket-id";
+	command[2] = socket;
+	command[3] = (gchar *)"--url";
+	command[4] = url;
+	command[5] = NULL;
+	
+	if ( !g_spawn_async (NULL, 
+			     command,
+			     NULL,
+			     (GSpawnFlags) 0,
+			     NULL, NULL,
+			     NULL, 
+			     &error) )
+	{
+	    g_critical ("Failed to spawn command : %s", error->message);
+	    g_error_free (error);
+	}
+	
+	g_free (socket);
+	g_free (app);
+    }
+    
+    return NPERR_NO_ERROR;
+}
+
+ParolePlugin::ParolePlugin (NPP pNPInstance)
+{
+    g_debug ("Constructor");
+    window_set = FALSE;
+    url = NULL;
+}
+
+ParolePlugin::~ParolePlugin ()
+{
+    if ( url )
+	g_free (url);
+    g_debug ("Destructor");
+}
+
+char *ParolePlugin::PluginName (void)
+{
+    return (char*)"Parole media player plugin-in";
+}
+    
+char *ParolePlugin::PluginDescription (void)
+{
+    return (char*)"Media player browser plugin for various media format";
+}
+
+NPError ParolePlugin::SetWindow (NPWindow* aWindow)
+{
+    g_debug ("SetWindow");
+    
+    if ( aWindow == NULL )
+	return FALSE;
+
+    if ( !window_set )
+    {
+	window = (Window) aWindow->window;
+	
+	window_set = TRUE;
+    }
+
+    return NPERR_NO_ERROR;
+}
diff --git a/browser-plugin/parole-plugin.h b/browser-plugin/parole-plugin.h
new file mode 100644
index 0000000..82664de
--- /dev/null
+++ b/browser-plugin/parole-plugin.h
@@ -0,0 +1,67 @@
+/* 
+ * Modified version of totemPluginGlue
+ * 
+ * Totem Mozilla plugin
+ * 
+ * Copyright © 2004-2006 Bastien Nocera <hadess at hadess.net>
+ * Copyright © 2002 David A. Schleef <ds at schleef.org>
+ * Copyright © 2006, 2008 Christian Persch
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library 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.
+ */
+
+
+#ifndef __PAROLE_PLUGIN_H__
+#define __PAROLE_PLUGIN_H__
+
+#include <npapi.h>
+#include <npruntime.h>
+#include <npupp.h>
+
+#include <gtk/gtk.h>
+
+class ParolePlugin
+{
+public:
+    ParolePlugin 			(NPP pNPInstance);
+    
+   ~ParolePlugin 			(void); 
+
+    static NPError Initialize   	(void);
+    static NPError Shutdown     	(void);
+    
+    NPError 	Init 			(NPMIMEType mimetype,
+					 uint16_t mode,
+					 int16_t argc,
+					 char *argn[],
+					 char *argv[],
+					 NPSavedData *saved);
+				 
+    NPError 	SetWindow		(NPWindow* aWindow);
+    
+    NPError	NewStream 		(NPMIMEType type, NPStream *stream,
+					 NPBool seekable, uint16 *stype);
+				 
+    static char       *PluginName	(void);
+    static char       *PluginDescription(void);
+
+private:
+    gboolean 	window_set;
+    gchar      *url;
+    Window      window;
+};
+
+#endif // __PAROLE_PLUGIN_H__
diff --git a/browser-plugin/plugin.cpp b/browser-plugin/plugin.cpp
new file mode 100644
index 0000000..4b78bd7
--- /dev/null
+++ b/browser-plugin/plugin.cpp
@@ -0,0 +1,300 @@
+/* 
+ * Taken from totemPluginGlue modified to fit our needs.
+ * 
+ * Totem Mozilla plugin
+ * 
+ * Copyright © 2004-2006 Bastien Nocera <hadess at hadess.net>
+ * Copyright © 2002 David A. Schleef <ds at schleef.org>
+ * Copyright © 2006, 2008 Christian Persch
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include "parole-plugin.h"
+
+NPNetscapeFuncs NPNFuncs; /* used in npn_gate.cpp */
+static gchar *mime_types = NULL;
+
+static NPError
+parole_plugin_new_instance (NPMIMEType mimetype,
+			    NPP instance,
+			    uint16_t mode,
+			    int16_t argc,
+			    char *argn[],
+			    char *argv[],
+			    NPSavedData *savedData)
+{
+    if (!instance)
+	return NPERR_INVALID_INSTANCE_ERROR;
+
+    ParolePlugin *plugin = new ParolePlugin (instance);
+    
+    if (!plugin)
+	    return NPERR_OUT_OF_MEMORY_ERROR;
+
+    instance->pdata = reinterpret_cast<void*> (plugin);
+
+    NPError rv = plugin->Init (mimetype, mode, argc, argn, argv, savedData);
+    
+    if (rv != NPERR_NO_ERROR) 
+    {
+	delete plugin;
+	instance->pdata = 0;
+    }
+
+    return rv;
+}
+
+static NPError
+parole_plugin_destroy_instance (NPP instance,
+			        NPSavedData **save)
+{
+    if (!instance)
+	return NPERR_INVALID_INSTANCE_ERROR;
+
+    ParolePlugin *plugin = reinterpret_cast<ParolePlugin*> (instance->pdata);
+    
+    if (!plugin)
+	return NPERR_NO_ERROR;
+	
+    delete plugin;
+
+    instance->pdata = 0;
+
+    return NPERR_NO_ERROR;
+}
+
+static NPError
+parole_plugin_set_window (NPP instance,
+			  NPWindow* window)
+{
+    if (!instance)
+	return NPERR_INVALID_INSTANCE_ERROR;
+
+    ParolePlugin *plugin = reinterpret_cast<ParolePlugin*> (instance->pdata);
+    
+    if (!plugin)
+	return NPERR_INVALID_INSTANCE_ERROR;
+
+    return plugin->SetWindow (window);
+}
+
+static NPError
+parole_plugin_new_stream (NPP instance,
+			  NPMIMEType type,
+			  NPStream* stream_ptr,
+			  NPBool seekable,
+			  uint16* stype)
+{
+    if (!instance)
+	return NPERR_INVALID_INSTANCE_ERROR;
+
+    ParolePlugin *plugin = reinterpret_cast<ParolePlugin*> (instance->pdata);
+	
+    if (!plugin)
+	return NPERR_INVALID_INSTANCE_ERROR;
+
+    return plugin->NewStream (type, stream_ptr, seekable, stype);
+}
+
+static NPError
+parole_plugin_get_value (NPP instance,
+			 NPPVariable variable,
+		         void *value)
+{
+    ParolePlugin *plugin = 0;
+	
+    NPError err = NPERR_NO_ERROR;
+
+    if (instance) 
+    {
+	plugin = reinterpret_cast<ParolePlugin*> (instance->pdata);
+    }
+
+    /* See NPPVariable in npapi.h */
+    switch (variable) 
+    {
+	case NPPVpluginNameString:
+	    *((char **)value) = ParolePlugin::PluginName ();
+	    break;
+	case NPPVpluginDescriptionString:
+	    *((char **)value) = ParolePlugin::PluginDescription ();
+	    break;
+	case NPPVpluginNeedsXEmbed:
+	    // FIXMEchpe fix webkit which passes a (unsigned int*) here...
+	    *((NPBool *)value) = TRUE;
+	    break;
+	case NPPVpluginScriptableIID:
+	case NPPVpluginScriptableInstance:
+	    /* XPCOM scripting, obsolete */
+	    err = NPERR_GENERIC_ERROR;
+	    break;
+	default:
+	    err = NPERR_INVALID_PARAM;
+	    break;
+    }
+
+    return err;
+}
+
+static NPError
+parole_plugin_set_value (NPP instance,
+			 NPNVariable variable,
+			 void *value)
+{
+    return NPERR_NO_ERROR;
+}
+
+NPError NP_Initialize (NPNetscapeFuncs *aMozillaVTable, NPPluginFuncs *aPluginVTable)
+{
+    g_debug ("Initialize");
+    
+    if (aMozillaVTable == NULL || aPluginVTable == NULL)
+	return NPERR_INVALID_FUNCTABLE_ERROR;
+
+    if ((aMozillaVTable->version >> 8) > NP_VERSION_MAJOR)
+	return NPERR_INCOMPATIBLE_VERSION_ERROR;
+
+    if (aMozillaVTable->size < sizeof (NPNetscapeFuncs))
+	return NPERR_INVALID_FUNCTABLE_ERROR;
+	
+    if (aPluginVTable->size < sizeof (NPPluginFuncs))
+	return NPERR_INVALID_FUNCTABLE_ERROR;
+
+    /* Copy the function table. We can use memcpy here since we've already
+     * established that the aMozillaVTable is at least as big as the compile-
+     * time NPNetscapeFuncs.
+     */
+    memcpy (&NPNFuncs, aMozillaVTable, sizeof (NPNetscapeFuncs));
+    NPNFuncs.size = sizeof (NPNetscapeFuncs);
+    
+    
+    aPluginVTable->size           = sizeof (NPPluginFuncs);
+    aPluginVTable->version        = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
+    aPluginVTable->newp           = NewNPP_NewProc (parole_plugin_new_instance);
+    aPluginVTable->destroy        = NewNPP_DestroyProc (parole_plugin_destroy_instance);
+    aPluginVTable->setwindow      = NewNPP_SetWindowProc (parole_plugin_set_window);
+    aPluginVTable->newstream      = NewNPP_NewStreamProc (parole_plugin_new_stream);
+	
+    aPluginVTable->javaClass      = NULL; 
+    aPluginVTable->getvalue       = NewNPP_GetValueProc (parole_plugin_get_value);
+    aPluginVTable->setvalue       = NewNPP_SetValueProc (parole_plugin_set_value);
+	
+    return ParolePlugin::Initialize ();
+}
+
+NPError NP_Shutdown (void)
+{
+    if ( mime_types )
+	g_free (mime_types);
+	
+    return ParolePlugin::Shutdown ();
+}
+
+NPError NP_GetValue (void *future, NPPVariable var, void *value)
+{
+    return parole_plugin_get_value (NULL, var, value);
+}
+
+char *NP_GetMIMEDescription ()
+{
+    if ( mime_types != NULL )
+	return mime_types;
+	
+    const gchar *mime_types_list = /* Wmp mime types */
+			      "application/asx:*:Media Files;"
+			      "video/x-ms-asf-plugin:*:Media Files;"
+			      "video/x-msvideo:avi,*:AVI;"
+			      "video/msvideo:avi,*:AVI;"
+			      "application/x-mplayer2:*:Media Files;"
+			      "application/x-ms-wmv:wmv,*:Microsoft WMV video;"
+			      "video/x-ms-asf:asf,asx,*:Media Files;"
+			      "video/x-ms-wm:wm,*:Media Files;"
+			      "video/x-ms-wmv:wmv,*:Microsoft WMV video;"
+			      "audio/x-ms-wmv:wmv,*:Windows Media;"
+			      "video/x-ms-wmp:wmp,*:Windows Media;"
+			      "application/x-ms-wmp:wmp,*:Windows Media;"
+			      "video/x-ms-wvx:wvx,*:Windows Media;"
+			      "audio/x-ms-wax:wax,*:Windows Media;"
+			      "audio/x-ms-wma:wma,*:Windows Media;"
+			      "application/x-drm-v2:asx,*:Windows Media;"
+			      "audio/wav:wav,*:Microsoft wave file;"
+			      "audio/x-wav:wav,*:Microsoft wave file;"
+			      /* Standard mime types */
+			      "audio/x-mpegurl:m3u:MPEG Playlist;"
+			      "video/mpeg:mpg,mpeg:MPEG;"
+			      "audio/mpeg:mpg,mpeg:MPEG;"
+			      "video/x-mpeg:mpg,mpeg:MPEG;"
+			      "video/x-mpeg2:mpv2,mp2ve:MPEG2;"
+			      "audio/mpeg:mpg,mpeg:MPEG;"
+			      "audio/x-mpeg:mpg,mpeg:MPEG;"
+			      "audio/mpeg2:mp2:MPEG audio;"
+			      "audio/x-mpeg2:mp2:MPEG audio;"
+			      "audio/mp4:mp4:MPEG 4 audio;"
+			      "audio/x-mp4:mp4:MPEG 4 audio;"
+			      "video/mp4:mp4:MPEG 4 Video;"
+			      "video/x-m4v:m4v:MPEG 4 Video;"
+			      "video/3gpp:mp4,3gp:MPEG 4 Video;"
+			      "application/x-ogg:ogg:Ogg Vorbis Media;"
+			      "audio/flac:ogg:FLAC Lossless Audio;"
+			      "audio/x-flac:ogg:FLAC Lossless Audio;"
+			      "audio/ogg:ogg:Ogg Vorbis Audio;"
+			      "audio/ogg:x-ogg:Ogg Vorbis Audio;"
+			      "application/ogg:ogg:Ogg Vorbis / Ogg Theora;"
+			      "video/ogg:ogg:Ogg Vorbis Video;"
+			      "video/ogg:x-ogg:Ogg Vorbis Video;"
+			      /* Real audio */
+			      "audio/x-pn-realaudio:ram,rm:RealAudio;"
+			      "application/vnd.rn-realmedia:rm:RealMedia;"
+			      "application/vnd.rn-realaudio:ra,ram:RealAudio;"
+			      "video/vnd.rn-realvideo:rv:RealVideo;"
+			      "audio/x-realaudio:ra:RealAudio;"
+			      "audio/x-pn-realaudio-plugin:rpm:RealAudio;"
+			      "application/smil:smil:SMIL;"
+			      /* DivX Mime type */
+			      "video/divx:divx:DivX Media Format;"
+			      "video/vnd.divx:divx:DivX Media Format;"
+			      /*Quick time */
+			      "video/quicktime:mov:Quicktime;"
+			      "video/x-quicktime:mov:Quicktime;"
+			      "image/x-quicktime:mov:Quicktime;"
+			      "video/quicktime:mp4:Quicktime;"
+			      "video/quicktime:sdp:Quicktime - Session Description Protocol;"
+			      "application/x-quicktimeplayer:mov:Quicktime;";
+
+    g_debug ("GetMimeDescription");
+			     
+    mime_types = g_strdup (mime_types_list);
+    
+    return mime_types;
+}
+
+NPError NPP_NewStream (NPP instance, NPMIMEType type, NPStream *stream,
+		       NPBool seekable, uint16 *stype)
+{
+    g_debug ("New stream callback %s", stream->url);
+    
+    return NPERR_NO_ERROR;
+}
diff --git a/browser-plugin/plugin.symbols b/browser-plugin/plugin.symbols
new file mode 100644
index 0000000..c13252c
--- /dev/null
+++ b/browser-plugin/plugin.symbols
@@ -0,0 +1,4 @@
+NP_GetMIMEDescription
+NP_GetValue
+NP_Initialize
+NP_Shutdown
diff --git a/configure.ac.in b/configure.ac.in
index c987568..fe02ad7 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -33,6 +33,7 @@ AC_PROG_INTLTOOL([intltool_minimum_version], [no-xml])
 # ===================================================== #
 AC_DISABLE_STATIC()
 AC_PROG_LIBTOOL()
+m4_ifdef([LT_OUTPUT], [LT_OUTPUT])
 
 # ===================================================== #
 #               Version information                     #
@@ -194,9 +195,9 @@ AC_MSG_CHECKING([whether to build the browser plugin])
 AM_CONDITIONAL([ENABLE_BROWSER_PLUGIN], [test x"$ac_browser_plugin" = x"yes"])
 AC_MSG_RESULT([$ac_browser_plugin])
 if test x"$ac_browser_plugin" = x"yes"; then
-    XDT_CHECK_PACKAGE([GECKO], [libxul], [])
     BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}"
     AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the browser plugin])
+    AC_DEFINE(BUILD_BROWSER_PLUGIN, 1, [whether to build with browser plugin support])
 fi
 
 #=======================================================#
@@ -226,6 +227,7 @@ plugins/properties/Makefile
 plugins/tray/Makefile
 plugins/window-title/Makefile
 browser-plugin/Makefile
+browser-plugin/media-plugin/Makefile
 docs/Makefile
 docs/plugin-api/version.xml
 docs/plugin-api/Makefile
diff --git a/data/interfaces/Makefile.am b/data/interfaces/Makefile.am
index dbb3922..e8851b7 100644
--- a/data/interfaces/Makefile.am
+++ b/data/interfaces/Makefile.am
@@ -4,7 +4,8 @@ interfaces =					\
 	playlist.ui				\
 	mediachooser.ui				\
 	save-playlist.ui			\
-	plugins.ui
+	plugins.ui				\
+	browser-plugin-control.ui
 
 interfaces_h = 					\
 	$(interfaces:.ui=_ui.h)
@@ -30,6 +31,9 @@ save-playlist_ui.h: save-playlist.ui
 plugins_ui.h: plugins.ui
 	exo-csource --static --strip-comments --strip-content --name=plugins_ui $< > $@
 
+browser-plugin-control_ui.h: browser-plugin-control.ui
+	exo-csource --static --strip-comments --strip-content --name=browser_plugin_control_ui $< > $@
+
 endif
 
 CLEANFILES =					\
diff --git a/data/interfaces/browser-plugin-control.ui b/data/interfaces/browser-plugin-control.ui
new file mode 100644
index 0000000..8fc2c38
--- /dev/null
+++ b/data/interfaces/browser-plugin-control.ui
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<interface>
+  <!-- interface-naming-policy project-wide -->
+</interface>
diff --git a/parole/Makefile.am b/parole/Makefile.am
index f99ace4..5129d92 100644
--- a/parole/Makefile.am
+++ b/parole/Makefile.am
@@ -135,6 +135,8 @@ parole_glib_enum_headers =			\
 	parole-stream.h				\
 	parole-conf.h
 
+# Parole Browser Player plugin
+
 if MAINTAINER_MODE
 
 BUILT_SOURCES = 				\
diff --git a/parole/main.c b/parole/main.c
index 80ee5b7..eb52f74 100644
--- a/parole/main.c
+++ b/parole/main.c
@@ -204,6 +204,8 @@ int main (int argc, char **argv)
 
     xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
     
+    g_set_application_name (PACKAGE_NAME);
+    
     gtk_init (&argc, &argv);
     
     ctx = g_option_context_new (NULL);
diff --git a/parole/parole-gst.c b/parole/parole-gst.c
index 57dd8af..5a177e8 100644
--- a/parole/parole-gst.c
+++ b/parole/parole-gst.c
@@ -41,7 +41,6 @@
 #include "parole-gst.h"
 #include "parole-utils.h"
 #include "parole-conf.h"
-#include "parole-utils.h"
 #include "parole-debug.h"
 #include "enum-gtypes.h"
 #include "gmarshal.h"
diff --git a/parole/parole-gst.h b/parole/parole-gst.h
index a51be66..08265d6 100644
--- a/parole/parole-gst.h
+++ b/parole/parole-gst.h
@@ -135,6 +135,7 @@ gdouble			parole_gst_get_stream_position  (ParoleGst *gst);
 
 gboolean		parole_gst_get_is_xvimage_sink  (ParoleGst *gst);
 
+
 G_END_DECLS
 
 #endif /* __PAROLE_GST_H */



More information about the Xfce4-commits mailing list