Commit 1c36b5e7 authored by Damien Fouilleul's avatar Damien Fouilleul

- the resurected mozilla plugin for Safari/Firefox on MacOS X

parent 90317164
......@@ -14,6 +14,8 @@ SOURCES_mozilla_common = \
vlcplugin.h \
vlcpeer.cpp \
vlcpeer.h \
vlcruntime.cpp \
vlcruntime.h \
support/classinfo.h
DIST_sources = $(SOURCES_mozilla_common) \
......@@ -70,21 +72,59 @@ CPPFLAGS_mozilla_EXTRA = -I. -I$(top_builddir) -I$(srcdir)/../include -c \
-DNO_X11=1 -DUSE_SYSTEM_CONSOLE=1 -pipe -fmessage-length=0 -g \
-include mozilla-config.h
LDFLAGS_npvlc = -arch ppc -bundle -read_only_relocs suppress \
$(LIBRARIES_libvlc) -dylib
$(LIBRARIES_libvlc) -dylib -headerpad_max_install_names
npvlc.rsrc: $(srcdir)/vlc.r
/Developer/Tools/Rez -useDF /Developer/Headers/FlatCarbon/Types.r $< -o $@
#
# Plugin uses shared libraries that are located relatively through @executable_path,
# which unfortunately references the path of the App using the Plugin, rather than the
# Plugin itself. Since this Plugin should always be installed in '/Library/Internet Plug-Ins',
# it is safer to force dylibs to locate dependants through a fixed path
#
define FIXEXECPATH
otool -L "$$dylib" | \
awk -v libdylib="$$dylib" ' \
/@executable_path/ { \
newpath=$$1 ; \
sub("@executable_path","/Library/Internet Plug-Ins/VLC Plugin.plugin/Contents/MacOS",newpath) ; \
print "install_name_tool -change \""$$1"\" \""newpath"\" \""libdylib"\"" ; \
}' | sh -x
endef
VLC\ Plugin.plugin: npvlc.rsrc npvlc.dylib
rm -rf "$@"
mkdir -p "./$@/Contents/MacOS"
cp npvlc.dylib "./$@/Contents/MacOS/VLC Plugin"
mkdir -p ./"$@"/Contents/Resources
cp npvlc.rsrc "./$@/Contents/Resources/VLC Plugin.rsrc"
cp -r $(top_srcdir)/extras/MacOSX/plugin/English.lproj "./$@/Contents/Resources/"
cp $(top_srcdir)/extras/MacOSX/plugin/Info.plist "./$@/Contents/Info.plist"
(cd $(top_builddir)/VLC.app/Contents/MacOS/; tar cf - modules)| \
(cd "./$@/Contents/MacOS"; tar xf -)
rm -Rf "$@"
$(INSTALL) -d "./$@/Contents/MacOS"
$(INSTALL) npvlc.dylib "./$@/Contents/MacOS/VLC Plugin"
dylib="./$@/Contents/MacOS/VLC Plugin"; $(FIXEXECPATH) ;
$(INSTALL) -d "./$@/Contents/Resources"
$(INSTALL) npvlc.rsrc "./$@/Contents/Resources/VLC Plugin.rsrc"
cp -r "$(top_srcdir)/extras/MacOSX/plugin/English.lproj" "./$@/Contents/Resources/"
$(INSTALL) "$(top_srcdir)/extras/MacOSX/plugin/Info.plist" "./$@/Contents/Info.plist"
$(INSTALL) -d "./$@/Contents/MacOS/modules"
for i in "" `$(VLC_CONFIG) --target plugin` ; do \
if test -n "$$i" ; then \
dylib="./$@/Contents/MacOS/modules/`basename $$i$(LIBEXT)`"; \
$(INSTALL) "$$i$(LIBEXT)" "$$dylib"; \
$(FIXEXECPATH) ; \
fi ; \
done
if test -d $(top_srcdir)/extras/contrib/vlc-lib; then \
$(INSTALL) -d "./$@/Contents/MacOS/lib"; \
for i in $(top_srcdir)/extras/contrib/vlc-lib/*.dylib ; do \
dylib="./$@/Contents/MacOS/lib/`basename $${i}`" ; \
$(INSTALL) -m 644 "$${i}" "$$dylib" ; \
$(FIXEXECPATH); \
done ; \
fi
if test -d "$(MOZILLA_SDK_PATH)/lib"; then \
for i in "$(MOZILLA_SDK_PATH)"/lib/*.dylib ; do \
dylib="./$@/Contents/MacOS/`basename $${i}`" ; \
$(INSTALL) -m 644 "$${i}" "$$dylib" ; \
$(FIXEXECPATH); \
done ; \
fi
else
......
This diff is collapsed.
......@@ -4,13 +4,17 @@
/* Definitions of system resource types */
data 'carb' (0)
{
};
/* The first string in the array is a plugin description,
* the second is the plugin name */
resource 'STR#' (126)
{
{
"A VLC test plugin... hope it goes somewhere",
"VLC plugin"
"VideoLAN WWW: http://videolan.org"
"VLC multimedia plugin"
};
};
......@@ -18,7 +22,26 @@ resource 'STR#' (126)
resource 'STR#' (127)
{
{
"Invoke scriptable sample plugin"
"MPEG audio",
"MPEG audio",
"MPEG video",
"MPEG video",
"MPEG video",
"MPEG video",
"MPEG-4 video",
"MPEG-4 audio",
"MPEG-4 video",
"MPEG-4 video",
"AVI video",
"QuickTime video",
"Ogg stream",
"Ogg stream",
"VLC plugin",
"ASF stream",
"ASF stream",
"",
"",
"Google VLC Plugin"
};
};
......@@ -26,7 +49,26 @@ resource 'STR#' (127)
resource 'STR#' (128,"MIME Type")
{
{
"application/vlc-plugin", ""
"audio/mpeg", "mp2,mp3,mpga,mpega",
"audio/x-mpeg", "mp2,mp3,mpga,mpega",
"video/mpeg", "mpg,mpeg,mpe",
"video/x-mpeg", "mpg,mpeg,mpe",
"video/mpeg-system", "mpg,mpeg,vob",
"video/x-mpeg-system", "mpg,mpeg,vob",
"video/mpeg4", "mp4,mpg4",
"audio/mpeg4", "mp4,mpg4",
"application/mpeg4-iod", "mp4,mpg4",
"application/mpeg4-muxcodetable", "mp4,mpg4",
"video/x-msvideo", "avi",
"video/quicktime", "mov, qt",
"application/ogg", "ogg",
"application/x-ogg", "ogg",
"application/x-vlc-plugin", "vlc",
"video/x-ms-asf-plugin", "",
"video/x-ms-asf", "",
"application/x-mplayer2", "",
"video/x-ms-wmv", "",
"video/x-google-vlc-plugin", "",
};
};
......@@ -20,6 +20,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef __VLCPEER_H__
#define __VLCPEER_H__
#include "vlcintf.h"
#include "support/classinfo.h"
......@@ -56,3 +58,4 @@ private:
VlcPlugin * p_plugin;
};
#endif
......@@ -41,7 +41,6 @@
#undef XP_UNIX
#endif
#include "vlcpeer.h"
#include "vlcplugin.h"
/*****************************************************************************
......@@ -96,36 +95,3 @@ VlcIntf* VlcPlugin::GetPeer()
return p_peer;
}
void VlcPlugin::SetFileName(const char * filename)
{
#if 0
FILE * fh;
fh = fopen(filename, "rb");
if(!fh)
{
fprintf(stderr, "Error while opening %s.\n", filename);
return;
}
fseek(fh, 0, SEEK_END);
m_lSize = ftell(fh);
m_szSound = (char*) malloc(m_lSize);
if(!m_szSound)
{
fprintf(stderr, "Error while allocating memory.\n");
fclose(fh);
return;
}
rewind(fh);
long pos = 0;
do
{
pos += fread(m_szSound + pos, 1, m_lSize - pos, fh);
fprintf(stderr, "pos = %d\n", pos);
}
while (pos < m_lSize -1);
fclose (fh);
fprintf(stderr, "File loaded\n");
#endif
return;
}
......@@ -24,6 +24,32 @@
/*******************************************************************************
* Instance state information about the plugin.
******************************************************************************/
#ifndef __VLCPLUGIN_H__
#define __VLCPLUGIN_H__
#include "vlcpeer.h"
#if !defined(XP_MACOSX) && !defined(XP_UNIX) && !defined(XP_WIN)
#define XP_UNIX 1
#elif defined(XP_MACOSX)
#undef XP_UNIX
#endif
#ifdef XP_WIN
/* Windows stuff */
#endif
#ifdef XP_MACOSX
/* Mac OS X stuff */
# include <Quickdraw.h>
#endif
#ifdef XP_UNIX
/* X11 stuff */
# include <X11/Xlib.h>
# include <X11/Intrinsic.h>
# include <X11/StringDefs.h>
#endif
class VlcPlugin
{
......@@ -35,8 +61,6 @@ public:
NPP GetInstance();
VlcIntf* GetPeer();
void SetFileName( const char* );
/* Window settings */
NPWindow* p_npwin;
uint16 i_npmode;
......@@ -114,3 +138,4 @@ private:
"audio/wav::WAV audio" \
"audio/x-wav::WAV audio" \
#endif
#include "config.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* vlc stuff */
#ifdef USE_LIBVLC
# include <vlc/vlc.h>
#endif
/* Mozilla stuff */
#ifdef HAVE_MOZILLA_CONFIG_H
# include <mozilla-config.h>
#endif
#include <nsISupports.h>
#include <nsMemory.h>
#include <npapi.h>
#include <npruntime.h>
#include "vlcplugin.h"
#include "vlcruntime.h"
/*
** utility functions
*/
static PRInt64 NPVariantToPRInt64(const NPVariant &v)
{
switch( v.type ) {
case NPVariantType_Bool:
return static_cast<PRInt64>(NPVARIANT_TO_BOOLEAN(v));
case NPVariantType_Int32:
return static_cast<PRInt64>(NPVARIANT_TO_INT32(v));
case NPVariantType_Double:
return static_cast<PRInt64>(NPVARIANT_TO_DOUBLE(v));
default:
return 0;
}
}
/*
** implementation root object
*/
const NPUTF8 * const VlcRuntimeRootObject::propertyNames[] = { };
const NPUTF8 * const VlcRuntimeRootObject::methodNames[] =
{
"play",
"pause",
"stop",
"fullscreen",
"set_volume",
"get_volume",
"mute",
"get_int_variable",
"set_int_variable",
"get_bool_variable",
"set_bool_variable",
"get_str_variable",
"set_str_variable",
"clear_playlist",
"add_item",
"next",
"previous",
"isplaying",
"get_length",
"get_position",
"get_time",
"seek",
};
enum VlcRuntimeRootObjectMethodIds
{
ID_play = 0,
ID_pause,
ID_stop,
ID_fullscreen,
ID_set_volume,
ID_get_volume,
ID_mute,
ID_get_int_variable,
ID_set_int_variable,
ID_get_bool_variable,
ID_set_bool_variable,
ID_get_str_variable,
ID_set_str_variable,
ID_clear_playlist,
ID_add_item,
ID_next,
ID_previous,
ID_isplaying,
ID_get_length,
ID_get_position,
ID_get_time,
ID_seek,
};
const int VlcRuntimeRootObject::propertyCount = sizeof(VlcRuntimeRootObject::propertyNames)/sizeof(NPUTF8 *);
const int VlcRuntimeRootObject::methodCount = sizeof(VlcRuntimeRootObject::methodNames)/sizeof(NPUTF8 *);
bool VlcRuntimeRootObject::getProperty(int index, NPVariant *result)
{
return false;
}
bool VlcRuntimeRootObject::setProperty(int index, const NPVariant *value)
{
return false;
}
bool VlcRuntimeRootObject::removeProperty(int index)
{
return false;
}
bool VlcRuntimeRootObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
VlcPlugin *plugin = (VlcPlugin *)(_instance->pdata);
if( plugin )
{
VlcIntf *peer = plugin->GetPeer();
switch( index )
{
case ID_play:
peer->Play();
VOID_TO_NPVARIANT(*result);
return true;
case ID_pause:
peer->Pause();
VOID_TO_NPVARIANT(*result);
return true;
case ID_stop:
peer->Stop();
VOID_TO_NPVARIANT(*result);
return true;
case ID_fullscreen:
peer->Fullscreen();
VOID_TO_NPVARIANT(*result);
return true;
case ID_set_volume:
if( argCount == 1 )
{
peer->Set_volume(NPVariantToPRInt64(args[0]));
VOID_TO_NPVARIANT(*result);
return true;
}
return false;
case ID_get_volume:
{
PRInt64 val;
peer->Get_volume(&val);
INT32_TO_NPVARIANT(val, *result);
return true;
}
case ID_mute:
peer->Mute();
VOID_TO_NPVARIANT(*result);
return true;
case ID_get_int_variable:
if( (argCount == 1)
&& NPVARIANT_IS_STRING(args[0]) )
{
const NPString &name = NPVARIANT_TO_STRING(args[0]);
NPUTF8 *s = new NPUTF8[name.utf8length+1];
if( s )
{
PRInt64 val;
strncpy(s, name.utf8characters, name.utf8length);
s[name.utf8length] = '\0';
peer->Get_int_variable(s, &val);
INT32_TO_NPVARIANT(val, *result);
delete s;
return true;
}
}
return false;
case ID_set_int_variable:
if( (argCount == 2)
&& NPVARIANT_IS_STRING(args[0]) )
{
const NPString &name = NPVARIANT_TO_STRING(args[0]);
NPUTF8 *s = new NPUTF8[name.utf8length+1];
if( s )
{
strncpy(s, name.utf8characters, name.utf8length);
s[name.utf8length] = '\0';
peer->Set_int_variable(s, NPVariantToPRInt64(args[1]));
delete s;
VOID_TO_NPVARIANT(*result);
return true;
}
}
return false;
case ID_get_bool_variable:
if( (argCount == 1)
&& NPVARIANT_IS_STRING(args[0]) )
{
const NPString &name = NPVARIANT_TO_STRING(args[0]);
NPUTF8 *s = new NPUTF8[name.utf8length+1];
if( s )
{
PRBool val;
strncpy(s, name.utf8characters, name.utf8length);
s[name.utf8length] = '\0';
peer->Get_bool_variable(s, &val);
BOOLEAN_TO_NPVARIANT(val, *result);
delete s;
return true;
}
}
return false;
case ID_set_bool_variable:
if( (argCount == 2)
&& NPVARIANT_IS_STRING(args[0])
&& NPVARIANT_IS_BOOLEAN(args[1]) )
{
const NPString &name = NPVARIANT_TO_STRING(args[0]);
NPUTF8 *s = new NPUTF8[name.utf8length+1];
if( s )
{
strncpy(s, name.utf8characters, name.utf8length);
s[name.utf8length] = '\0';
peer->Set_bool_variable(s, NPVARIANT_TO_BOOLEAN(args[1]));
delete s;
VOID_TO_NPVARIANT(*result);
return true;
}
}
return false;
case ID_get_str_variable:
if( (argCount == 1)
&& NPVARIANT_IS_STRING(args[0]) )
{
const NPString &name = NPVARIANT_TO_STRING(args[0]);
NPUTF8 *s = new NPUTF8[name.utf8length+1];
if( s )
{
char *val;
strncpy(s, name.utf8characters, name.utf8length);
s[name.utf8length] = '\0';
peer->Get_str_variable(s, &val);
delete s;
int len = strlen(val);
NPUTF8 *retval = (NPUTF8 *)NPN_MemAlloc(len);
if( retval )
{
memcpy(retval, val, len);
STRINGN_TO_NPVARIANT(retval, len, *result);
free(val);
return true;
}
free(val);
}
}
return false;
case ID_set_str_variable:
if( (argCount == 2)
&& NPVARIANT_IS_STRING(args[0])
&& NPVARIANT_IS_STRING(args[1]) )
{
const NPString &name = NPVARIANT_TO_STRING(args[0]);
NPUTF8 *s = new NPUTF8[name.utf8length+1];
if( s )
{
strncpy(s, name.utf8characters, name.utf8length);
s[name.utf8length] = '\0';
const NPString &val = NPVARIANT_TO_STRING(args[1]);
NPUTF8 *v = new NPUTF8[val.utf8length+1];
if( v )
{
strncpy(v, val.utf8characters, val.utf8length);
v[val.utf8length] = '\0';
peer->Set_str_variable(s, v);
delete s;
delete v;
VOID_TO_NPVARIANT(*result);
return true;
}
delete s;
}
}
return false;
case ID_clear_playlist:
peer->Clear_playlist();
VOID_TO_NPVARIANT(*result);
return true;
case ID_add_item:
if( (argCount == 1)
&& NPVARIANT_IS_STRING(args[0]) )
{
const NPString &name = NPVARIANT_TO_STRING(args[0]);
NPUTF8 *s = new NPUTF8[name.utf8length+1];
if( s )
{
strncpy(s, name.utf8characters, name.utf8length);
s[name.utf8length] = '\0';
peer->Add_item(s);
delete s;
return true;
}
}
return false;
case ID_next:
peer->Next();
VOID_TO_NPVARIANT(*result);
return true;
case ID_previous:
peer->Previous();
VOID_TO_NPVARIANT(*result);
return true;
case ID_isplaying:
{
PRBool val;
peer->Isplaying(&val);
BOOLEAN_TO_NPVARIANT(val, *result);
return true;
}
case ID_get_length:
{
PRInt64 val;
peer->Get_length(&val);
DOUBLE_TO_NPVARIANT(val, *result);
return true;
}
case ID_get_position:
{
PRInt64 val;
peer->Get_position(&val);
INT32_TO_NPVARIANT(val, *result);
return true;
}
case ID_get_time:
{
PRInt64 val;
peer->Get_time(&val);
INT32_TO_NPVARIANT(val, *result);
return true;
}
case ID_seek:
if( argCount == 2 )
{
peer->Seek(NPVariantToPRInt64(args[0]), NPVariantToPRInt64(args[1]));
VOID_TO_NPVARIANT(*result);
return true;
}
return false;
}
NS_RELEASE(peer);
}
return false;
}
bool VlcRuntimeRootObject::invokeDefault(const NPVariant *args, uint32_t argCount, NPVariant *result)
{
return false;
}
/*****************************************************************************
* vlcruntime.h: a VLC plugin for Mozilla
*****************************************************************************
* Copyright (C) 2002-2005 the VideoLAN team
* $Id: vlcruntime.h 14466 2006-02-22 23:34:54Z dionoea $
*
* Authors: Damien Fouilleul <damien.fouilleul@laposte.net>
*
* 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.
*****************************************************************************/
/*
** support framework for runtime script objects
*/
class VlcRuntimeObject : public NPObject
{
public:
VlcRuntimeObject(NPP instance, const NPClass *aClass) :
_instance(instance)
{
_class = const_cast<NPClass *>(aClass);
referenceCount = 1;
};
virtual ~VlcRuntimeObject() {};
virtual bool getProperty(int index, NPVariant *result) = 0;
virtual bool setProperty(int index, const NPVariant *value) = 0;
virtual bool removeProperty(int index) = 0;
virtual bool invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant *result) = 0;
virtual bool invokeDefault(const NPVariant *args, uint32_t argCount, NPVariant *result) = 0;
NPP _instance;
};
template<class T> class VlcRuntimeClass : public NPClass
{
public:
VlcRuntimeClass();
virtual ~VlcRuntimeClass();
VlcRuntimeObject *create(NPP instance) const;
int indexOfMethod(NPIdentifier name) const;
int indexOfProperty(NPIdentifier name) const;
private:
NPIdentifier *propertyIdentifiers;
NPIdentifier *methodIdentifiers;
};
template<class T>
static NPObject *vlcRuntimeClassAllocate(NPP instance, NPClass *aClass)
{
const VlcRuntimeClass<T> *vClass = static_cast<VlcRuntimeClass<T> *>(aClass);
return (NPObject *)vClass->create(instance);
}
template<class T>
static void vlcRuntimeClassDeallocate(NPObject *npobj)
{
VlcRuntimeObject *vObj = static_cast<VlcRuntimeObject *>(npobj);
delete vObj;
}
template<class T>
static void vlcRuntimeClassInvalidate(NPObject *npobj)
{
VlcRuntimeObject *vObj = static_cast<VlcRuntimeObject *>(npobj);
vObj->_instance = NULL;
}
template<class T>
bool vlcRuntimeClassHasMethod(NPObject *npobj, NPIdentifier name)
{
const VlcRuntimeClass<T> *vClass = static_cast<VlcRuntimeClass<T> *>(npobj->_class);
return vClass->indexOfMethod(name) != -1;
}
template<class T>
bool vlcRuntimeClassHasProperty(NPObject *npobj, NPIdentifier name)
{
const VlcRuntimeClass<T> *vClass = static_cast<VlcRuntimeClass<T> *>(npobj->_class);
return vClass->indexOfProperty(name) != -1;
}
template<class T>
bool vlcRuntimeClassGetProperty(NPObject *npobj, NPIdentifier name, NPVariant *result)
{
const VlcRuntimeClass<T> *vClass = static_cast<VlcRuntimeClass<T> *>(npobj->_class);
int index = vClass->indexOfProperty(name);
if( index != -1 )
{
VlcRuntimeObject *vObj = static_cast<VlcRuntimeObject *>(npobj);
return vObj->getProperty(index, result);
}
return false;
}
template<class T>
bool vlcRuntimeClassSetProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value)
{
const VlcRuntimeClass<T> *vClass = static_cast<VlcRuntimeClass<T> *>(npobj->_class);
int index = vClass->indexOfProperty(name);
if( index != -1 )
{
VlcRuntimeObject *vObj = static_cast<VlcRuntimeObject *>(npobj);
return vObj->setProperty(index, value);
}
return false;
}
template<class T>
bool vlcRuntimeClassRemoveProperty(NPObject *npobj, NPIdentifier name)
{
const VlcRuntimeClass<T> *vClass = static_cast<VlcRuntimeClass<T> *>(npobj->_class);
int index = vClass->indexOfProperty(name);
if( index != -1 )
{
VlcRuntimeObject *vObj = static_cast<VlcRuntimeObject *>(npobj);
return vObj->removeProperty(index);
}
return false;
}
template<class T>
static bool vlcRuntimeClassInvoke(NPObject *npobj, NPIdentifier name,
const NPVariant *args, uint32_t argCount,
NPVariant *result