X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=projects%2Fmozilla%2Fcontrol%2Fnpolibvlc.cpp;h=976d7733e50aea8021596d0ec42c58185971232c;hb=28029c51a8f26ac22cc49ab3458620290d026724;hp=cd3efb3f989c386092de044f08a6bde56eaace7f;hpb=df61d33b06e2b3cbbe746b2f5a9bea5b370c24ff;p=vlc diff --git a/projects/mozilla/control/npolibvlc.cpp b/projects/mozilla/control/npolibvlc.cpp index cd3efb3f98..976d7733e5 100644 --- a/projects/mozilla/control/npolibvlc.cpp +++ b/projects/mozilla/control/npolibvlc.cpp @@ -1,9 +1,11 @@ /***************************************************************************** * npolibvlc.cpp: official Javascript APIs ***************************************************************************** - * Copyright (C) 2002-2006 the VideoLAN team + * Copyright (C) 2002-2009 the VideoLAN team + * Copyright (C) 2010 M2X BV * * Authors: Damien Fouilleul + * JP Dinger * * 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 @@ -15,9 +17,9 @@ * 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. + * 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. *****************************************************************************/ #include "config.h" @@ -34,6 +36,85 @@ #include "vlcplugin.h" #include "npolibvlc.h" +#include "position.h" + +/* +** Local helper macros and function +*/ +#define COUNTNAMES(a,b,c) const int a::b = sizeof(a::c)/sizeof(NPUTF8 *) +#define RETURN_ON_EXCEPTION(this,ex) \ + do { if( libvlc_exception_raised(&ex) ) \ + { \ + NPN_SetException(this, libvlc_errmsg()); \ + libvlc_exception_clear(&ex); \ + return INVOKERESULT_GENERIC_ERROR; \ + } } while(false) + +#define ERROR_EVENT_NOT_FOUND "ERROR: One or more events could not be found." +#define ERROR_API_VERSION "ERROR: NPAPI version not high enough. (Gecko >= 1.9 needed)" + +// Make a copy of an NPVariant. +NPVariant copyNPVariant(const NPVariant& original) +{ + NPVariant res; + + if (NPVARIANT_IS_STRING(original)) + STRINGZ_TO_NPVARIANT(strdup(NPVARIANT_TO_STRING(original).utf8characters), res); + else if (NPVARIANT_IS_INT32(original)) + INT32_TO_NPVARIANT(NPVARIANT_TO_INT32(original), res); + else if (NPVARIANT_IS_DOUBLE(original)) + DOUBLE_TO_NPVARIANT(NPVARIANT_TO_DOUBLE(original), res); + else if (NPVARIANT_IS_OBJECT(original)) + { + NPObject *obj = NPVARIANT_TO_OBJECT(original); + NPN_RetainObject(obj); + OBJECT_TO_NPVARIANT(obj, res); + } + else if (NPVARIANT_IS_BOOLEAN(original)) + BOOLEAN_TO_NPVARIANT(NPVARIANT_TO_BOOLEAN(original), res); + + return res; +} + +// Parse an event Array given as a NPObject by JS. +// This function is similar to LibvlcPlaylistNPObject::parseOptions, +// but we don't use it because it's not clearly accessible and the FIXME flags +// implie that it might be modified. +bool parseEventArray(NPObject *obj, eventtypes_bitmap_t &eventToGet, NPP instance) +{ + NPIdentifier propId = NPN_GetStringIdentifier("length"); + NPVariant value; + + if (!NPN_GetProperty(instance, obj, propId, &value)) + return false; + + int count = NPVARIANT_TO_INT32(value); + NPN_ReleaseVariantValue(&value); + if (count == 0) + return false; + + int nOptions = 0; + while (nOptions < count) + { + propId = NPN_GetIntIdentifier(nOptions); + // if there is no other string in the array. + if( ! NPN_GetProperty(instance, obj, propId, &value) ) + break; + + // if the element is not a string. + if( ! NPVARIANT_IS_STRING(value) ) + { + NPN_ReleaseVariantValue(&value); + break; + } + + if (!eventToGet.add_event(NPVARIANT_TO_STRING(value).utf8characters)) + return false; + nOptions++; + } + return true; +} + /* ** implementation of libvlc root object */ @@ -41,95 +122,83 @@ LibvlcRootNPObject::~LibvlcRootNPObject() { /* - ** when plugin is destroyed, firefox takes upon itself to destroy all 'live' script objects - ** and ignores refcounting. Therefore we cannot safely assume that refcounting will control - ** lifespan of objects. Hence they are only lazily created on request, so that firefox can - ** take ownership, and are not released when plugin is being destroyed. + ** When the plugin is destroyed, firefox takes it upon itself to + ** destroy all 'live' script objects and ignores refcounting. + ** Therefore we cannot safely assume that refcounting will control + ** lifespan of objects. Hence they are only lazily created on + ** request, so that firefox can take ownership, and are not released + ** when the plugin is destroyed. */ if( isValid() ) { if( audioObj ) NPN_ReleaseObject(audioObj); if( inputObj ) NPN_ReleaseObject(inputObj); - if( logObj ) NPN_ReleaseObject(logObj); if( playlistObj ) NPN_ReleaseObject(playlistObj); if( videoObj ) NPN_ReleaseObject(videoObj); } } -const NPUTF8 * const LibvlcRootNPObject::propertyNames[] = +const NPUTF8 * const LibvlcRootNPObject::propertyNames[] = { "audio", "input", - "log", "playlist", + "subtitle", "video", + "events", "VersionInfo", }; - -const int LibvlcRootNPObject::propertyCount = sizeof(LibvlcRootNPObject::propertyNames)/sizeof(NPUTF8 *); +COUNTNAMES(LibvlcRootNPObject,propertyCount,propertyNames); enum LibvlcRootNPObjectPropertyIds { ID_root_audio = 0, ID_root_input, - ID_root_log, ID_root_playlist, + ID_root_subtitle, ID_root_video, + ID_root_events, ID_root_VersionInfo, }; -RuntimeNPObject::InvokeResult LibvlcRootNPObject::getProperty(int index, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcRootNPObject::getProperty(int index, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { switch( index ) { case ID_root_audio: - // create child object in lazyman fashion to avoid ownership problem with firefox - if( ! audioObj ) - audioObj = NPN_CreateObject(_instance, RuntimeNPClass::getClass()); + InstantObj( audioObj ); OBJECT_TO_NPVARIANT(NPN_RetainObject(audioObj), result); return INVOKERESULT_NO_ERROR; case ID_root_input: - // create child object in lazyman fashion to avoid ownership problem with firefox - if( ! inputObj ) - inputObj = NPN_CreateObject(_instance, RuntimeNPClass::getClass()); + InstantObj( inputObj ); OBJECT_TO_NPVARIANT(NPN_RetainObject(inputObj), result); return INVOKERESULT_NO_ERROR; - case ID_root_log: - // create child object in lazyman fashion to avoid ownership problem with firefox - if( ! logObj ) - logObj = NPN_CreateObject(_instance, RuntimeNPClass::getClass()); - OBJECT_TO_NPVARIANT(NPN_RetainObject(logObj), result); - return INVOKERESULT_NO_ERROR; case ID_root_playlist: - // create child object in lazyman fashion to avoid ownership problem with firefox - if( ! playlistObj ) - playlistObj = NPN_CreateObject(_instance, RuntimeNPClass::getClass()); + InstantObj( playlistObj ); OBJECT_TO_NPVARIANT(NPN_RetainObject(playlistObj), result); return INVOKERESULT_NO_ERROR; + case ID_root_subtitle: + InstantObj( subtitleObj ); + OBJECT_TO_NPVARIANT(NPN_RetainObject(subtitleObj), result); + return INVOKERESULT_NO_ERROR; case ID_root_video: - // create child object in lazyman fashion to avoid ownership problem with firefox - if( ! videoObj ) - videoObj = NPN_CreateObject(_instance,RuntimeNPClass::getClass()); + InstantObj( videoObj ); OBJECT_TO_NPVARIANT(NPN_RetainObject(videoObj), result); return INVOKERESULT_NO_ERROR; - case ID_root_VersionInfo: - { - int len = strlen(VLC_Version()); - NPUTF8 *retval =(NPUTF8*)NPN_MemAlloc(len); - if( retval ) - { - memcpy(retval, VLC_Version(), len); - STRINGN_TO_NPVARIANT(retval, len, result); - } - else - { - NULL_TO_NPVARIANT(result); - } + case ID_root_events: + // create child object in lazyman fashion to avoid + // ownership problem with firefox + if( ! eventObj ) + eventObj = NPN_CreateObject(_instance, + RuntimeNPClass::getClass()); + OBJECT_TO_NPVARIANT(NPN_RetainObject(eventObj), result); return INVOKERESULT_NO_ERROR; - } + case ID_root_VersionInfo: + return invokeResultString(libvlc_get_version(),result); default: ; } @@ -141,18 +210,18 @@ const NPUTF8 * const LibvlcRootNPObject::methodNames[] = { "versionInfo", }; - -const int LibvlcRootNPObject::methodCount = sizeof(LibvlcRootNPObject::methodNames)/sizeof(NPUTF8 *); +COUNTNAMES(LibvlcRootNPObject,methodCount,methodNames); enum LibvlcRootNPObjectMethodIds { ID_root_versionInfo, }; -RuntimeNPObject::InvokeResult LibvlcRootNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) +RuntimeNPObject::InvokeResult LibvlcRootNPObject::invoke(int index, + const NPVariant *args, uint32_t argCount, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { libvlc_exception_t ex; libvlc_exception_init(&ex); @@ -160,22 +229,9 @@ RuntimeNPObject::InvokeResult LibvlcRootNPObject::invoke(int index, const NPVari switch( index ) { case ID_root_versionInfo: - if( argCount == 0 ) - { - int len = strlen(VLC_Version()); - NPUTF8 *retval =(NPUTF8*)NPN_MemAlloc(len); - if( retval ) - { - memcpy(retval, VLC_Version(), len); - STRINGN_TO_NPVARIANT(retval, len, result); - } - else - { - NULL_TO_NPVARIANT(result); - } - return INVOKERESULT_NO_ERROR; - } - return INVOKERESULT_NO_SUCH_METHOD; + if( 0 != argCount ) + return INVOKERESULT_NO_SUCH_METHOD; + return invokeResultString(libvlc_get_version(),result); default: ; } @@ -187,30 +243,32 @@ RuntimeNPObject::InvokeResult LibvlcRootNPObject::invoke(int index, const NPVari ** implementation of libvlc audio object */ -const NPUTF8 * const LibvlcAudioNPObject::propertyNames[] = +const NPUTF8 * const LibvlcAudioNPObject::propertyNames[] = { "mute", "volume", "track", + "count", "channel", }; - -const int LibvlcAudioNPObject::propertyCount = sizeof(LibvlcAudioNPObject::propertyNames)/sizeof(NPUTF8 *); +COUNTNAMES(LibvlcAudioNPObject,propertyCount,propertyNames); enum LibvlcAudioNPObjectPropertyIds { ID_audio_mute, ID_audio_volume, ID_audio_track, + ID_audio_count, ID_audio_channel, }; -RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcAudioNPObject::getProperty(int index, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); @@ -218,57 +276,40 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari { case ID_audio_mute: { - bool muted = libvlc_audio_get_mute(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + bool muted = libvlc_audio_get_mute(p_plugin->getVLC()); BOOLEAN_TO_NPVARIANT(muted, result); return INVOKERESULT_NO_ERROR; } case ID_audio_volume: { - int volume = libvlc_audio_get_volume(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + int volume = libvlc_audio_get_volume(p_plugin->getVLC()); INT32_TO_NPVARIANT(volume, result); return INVOKERESULT_NO_ERROR; } case ID_audio_track: { - libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); int track = libvlc_audio_get_track(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); INT32_TO_NPVARIANT(track, result); return INVOKERESULT_NO_ERROR; } + case ID_audio_count: + { + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + // get the number of audio track available + int i_track = libvlc_audio_get_track_count(p_md, &ex); + RETURN_ON_EXCEPTION(this,ex); + // return it + INT32_TO_NPVARIANT(i_track, result); + return INVOKERESULT_NO_ERROR; + } case ID_audio_channel: { int channel = libvlc_audio_get_channel(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); INT32_TO_NPVARIANT(channel, result); return INVOKERESULT_NO_ERROR; } @@ -279,12 +320,13 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari return INVOKERESULT_GENERIC_ERROR; } -RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const NPVariant &value) +RuntimeNPObject::InvokeResult +LibvlcAudioNPObject::setProperty(int index, const NPVariant &value) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); @@ -294,13 +336,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const if( NPVARIANT_IS_BOOLEAN(value) ) { libvlc_audio_set_mute(p_plugin->getVLC(), - NPVARIANT_TO_BOOLEAN(value), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + NPVARIANT_TO_BOOLEAN(value)); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_INVALID_VALUE; @@ -309,34 +345,17 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const { libvlc_audio_set_volume(p_plugin->getVLC(), numberValue(value), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_INVALID_VALUE; case ID_audio_track: if( isNumberValue(value) ) { - libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - libvlc_audio_set_track(p_md, - numberValue(value), &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + libvlc_audio_set_track(p_md, numberValue(value), &ex); + RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_INVALID_VALUE; @@ -345,12 +364,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const { libvlc_audio_set_channel(p_plugin->getVLC(), numberValue(value), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } return INVOKERESULT_INVALID_VALUE; @@ -364,21 +378,24 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const const NPUTF8 * const LibvlcAudioNPObject::methodNames[] = { "toggleMute", + "description", }; - -const int LibvlcAudioNPObject::methodCount = sizeof(LibvlcAudioNPObject::methodNames)/sizeof(NPUTF8 *); +COUNTNAMES(LibvlcAudioNPObject,methodCount,methodNames); enum LibvlcAudioNPObjectMethodIds { ID_audio_togglemute, + ID_audio_description, }; -RuntimeNPObject::InvokeResult LibvlcAudioNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcAudioNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); @@ -387,20 +404,55 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::invoke(int index, const NPVar case ID_audio_togglemute: if( argCount == 0 ) { - libvlc_audio_toggle_mute(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); + libvlc_audio_toggle_mute(p_plugin->getVLC()); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; + } + return INVOKERESULT_NO_SUCH_METHOD; + case ID_audio_description: + { + if( argCount == 1) + { + char *psz_name; + int i_trackID, i_limit, i; + libvlc_track_description_t *p_trackDesc; + + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + /* get tracks description */ + p_trackDesc = libvlc_audio_get_track_description(p_md, &ex); + RETURN_ON_EXCEPTION(this,ex); + if( !p_trackDesc ) return INVOKERESULT_GENERIC_ERROR; - } + + /* get the number of track available */ + i_limit = libvlc_audio_get_track_count(p_md, &ex); + RETURN_ON_EXCEPTION(this,ex); + + /* check if a number is given by the user + * and get the track number */ + if( isNumberValue(args[0]) ) + i_trackID = numberValue(args[0]); else + return INVOKERESULT_INVALID_VALUE; + + /* if bad number is given return invalid value */ + if ( ( i_trackID > ( i_limit - 1 ) ) || ( i_trackID < 0 ) ) + return INVOKERESULT_INVALID_VALUE; + + /* get the good trackDesc */ + for( i = 0 ; i < i_trackID ; i++ ) { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; + p_trackDesc = p_trackDesc->p_next; } + psz_name = p_trackDesc->psz_name; + + /* display the name of the track chosen */ + return invokeResultString( psz_name, result ); } return INVOKERESULT_NO_SUCH_METHOD; + } default: ; } @@ -412,7 +464,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::invoke(int index, const NPVar ** implementation of libvlc input object */ -const NPUTF8 * const LibvlcInputNPObject::propertyNames[] = +const NPUTF8 * const LibvlcInputNPObject::propertyNames[] = { "length", "position", @@ -422,8 +474,7 @@ const NPUTF8 * const LibvlcInputNPObject::propertyNames[] = "fps", "hasVout", }; - -const int LibvlcInputNPObject::propertyCount = sizeof(LibvlcInputNPObject::propertyNames)/sizeof(NPUTF8 *); +COUNTNAMES(LibvlcInputNPObject,propertyCount,propertyNames); enum LibvlcInputNPObjectPropertyIds { @@ -436,21 +487,22 @@ enum LibvlcInputNPObjectPropertyIds ID_input_hasvout, }; -RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcInputNPObject::getProperty(int index, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_plugin->getVLC(), &ex); + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); if( libvlc_exception_raised(&ex) ) { if( index != ID_input_state ) { - NPN_SetException(this, libvlc_exception_get_message(&ex)); + NPN_SetException(this, libvlc_errmsg()); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } @@ -458,6 +510,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari { /* for input state, return CLOSED rather than an exception */ INT32_TO_NPVARIANT(0, result); + libvlc_exception_clear(&ex); return INVOKERESULT_NO_ERROR; } } @@ -467,118 +520,71 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari case ID_input_length: { double val = (double)libvlc_media_player_get_length(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); DOUBLE_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_input_position: { double val = libvlc_media_player_get_position(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); DOUBLE_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_input_time: { double val = (double)libvlc_media_player_get_time(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); DOUBLE_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_input_state: { - int val = libvlc_media_player_get_state(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + int val = libvlc_media_player_get_state(p_md); + RETURN_ON_EXCEPTION(this,ex); INT32_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_input_rate: { float val = libvlc_media_player_get_rate(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); DOUBLE_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_input_fps: { double val = libvlc_media_player_get_fps(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); DOUBLE_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_input_hasvout: { - bool val = libvlc_media_player_has_vout(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + bool val = p_plugin->player_has_vout(&ex); + RETURN_ON_EXCEPTION(this,ex); BOOLEAN_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } default: ; } - libvlc_media_player_release(p_md); } return INVOKERESULT_GENERIC_ERROR; } -RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const NPVariant &value) +RuntimeNPObject::InvokeResult +LibvlcInputNPObject::setProperty(int index, const NPVariant &value) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); switch( index ) { @@ -586,42 +592,28 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const { if( ! NPVARIANT_IS_DOUBLE(value) ) { - libvlc_media_player_release(p_md); return INVOKERESULT_INVALID_VALUE; } float val = (float)NPVARIANT_TO_DOUBLE(value); libvlc_media_player_set_position(p_md, val, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } case ID_input_time: { - vlc_int64_t val; + int64_t val; if( NPVARIANT_IS_INT32(value) ) - val = (vlc_int64_t)NPVARIANT_TO_INT32(value); + val = (int64_t)NPVARIANT_TO_INT32(value); else if( NPVARIANT_IS_DOUBLE(value) ) - val = (vlc_int64_t)NPVARIANT_TO_DOUBLE(value); + val = (int64_t)NPVARIANT_TO_DOUBLE(value); else { - libvlc_media_player_release(p_md); return INVOKERESULT_INVALID_VALUE; } libvlc_media_player_set_time(p_md, val, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } case ID_input_rate: @@ -633,24 +625,16 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const val = (float)NPVARIANT_TO_DOUBLE(value); else { - libvlc_media_player_release(p_md); return INVOKERESULT_INVALID_VALUE; } libvlc_media_player_set_rate(p_md, val, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } default: ; } - libvlc_media_player_release(p_md); } return INVOKERESULT_GENERIC_ERROR; } @@ -658,118 +642,26 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const const NPUTF8 * const LibvlcInputNPObject::methodNames[] = { /* no methods */ + "none", }; +COUNTNAMES(LibvlcInputNPObject,methodCount,methodNames); -const int LibvlcInputNPObject::methodCount = sizeof(LibvlcInputNPObject::methodNames)/sizeof(NPUTF8 *); - -/* -** implementation of libvlc message object -*/ - -const NPUTF8 * const LibvlcMessageNPObject::propertyNames[] = -{ - "severity", - "type", - "name", - "header", - "message", -}; - -const int LibvlcMessageNPObject::propertyCount = sizeof(LibvlcMessageNPObject::propertyNames)/sizeof(NPUTF8 *); - -enum LibvlcMessageNPObjectPropertyIds +enum LibvlcInputNPObjectMethodIds { - ID_message_severity, - ID_message_type, - ID_message_name, - ID_message_header, - ID_message_message, + ID_none, }; -RuntimeNPObject::InvokeResult LibvlcMessageNPObject::getProperty(int index, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcInputNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { switch( index ) { - case ID_message_severity: - { - INT32_TO_NPVARIANT(_msg.i_severity, result); - return INVOKERESULT_NO_ERROR; - } - case ID_message_type: - { - if( _msg.psz_type ) - { - int len = strlen(_msg.psz_type); - NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len); - if( retval ) - { - memcpy(retval, _msg.psz_type, len); - STRINGN_TO_NPVARIANT(retval, len, result); - } - } - else - { - NULL_TO_NPVARIANT(result); - } - return INVOKERESULT_NO_ERROR; - } - case ID_message_name: - { - if( _msg.psz_name ) - { - int len = strlen(_msg.psz_name); - NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len); - if( retval ) - { - memcpy(retval, _msg.psz_name, len); - STRINGN_TO_NPVARIANT(retval, len, result); - } - } - else - { - NULL_TO_NPVARIANT(result); - } - return INVOKERESULT_NO_ERROR; - } - case ID_message_header: - { - if( _msg.psz_header ) - { - int len = strlen(_msg.psz_header); - NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len); - if( retval ) - { - memcpy(retval, _msg.psz_header, len); - STRINGN_TO_NPVARIANT(retval, len, result); - } - } - else - { - NULL_TO_NPVARIANT(result); - } - return INVOKERESULT_NO_ERROR; - } - case ID_message_message: - { - if( _msg.psz_message ) - { - int len = strlen(_msg.psz_message); - NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len); - if( retval ) - { - memcpy(retval, _msg.psz_message, len); - STRINGN_TO_NPVARIANT(retval, len, result); - } - } - else - { - NULL_TO_NPVARIANT(result); - } - return INVOKERESULT_NO_ERROR; - } + case ID_none: + return INVOKERESULT_NO_SUCH_METHOD; default: ; } @@ -777,78 +669,35 @@ RuntimeNPObject::InvokeResult LibvlcMessageNPObject::getProperty(int index, NPVa return INVOKERESULT_GENERIC_ERROR; } -const NPUTF8 * const LibvlcMessageNPObject::methodNames[] = -{ - /* no methods */ -}; - -const int LibvlcMessageNPObject::methodCount = sizeof(LibvlcMessageNPObject::methodNames)/sizeof(NPUTF8 *); - /* -** implementation of libvlc message iterator object +** implementation of libvlc playlist items object */ -LibvlcMessageIteratorNPObject::LibvlcMessageIteratorNPObject(NPP instance, const NPClass *aClass) : - RuntimeNPObject(instance, aClass), - _p_iter(NULL) -{ - /* is plugin still running */ - if( instance->pdata ) - { - VlcPlugin* p_plugin = reinterpret_cast(instance->pdata); - libvlc_log_t *p_log = p_plugin->getLog(); - if( p_log ) - { - _p_iter = libvlc_log_get_iterator(p_log, NULL); - } - } -}; - -LibvlcMessageIteratorNPObject::~LibvlcMessageIteratorNPObject() -{ - if( _p_iter ) - libvlc_log_iterator_free(_p_iter, NULL); -} - -const NPUTF8 * const LibvlcMessageIteratorNPObject::propertyNames[] = +const NPUTF8 * const LibvlcPlaylistItemsNPObject::propertyNames[] = { - "hasNext", + "count", }; +COUNTNAMES(LibvlcPlaylistItemsNPObject,propertyCount,propertyNames); -const int LibvlcMessageIteratorNPObject::propertyCount = sizeof(LibvlcMessageIteratorNPObject::propertyNames)/sizeof(NPUTF8 *); - -enum LibvlcMessageIteratorNPObjectPropertyIds +enum LibvlcPlaylistItemsNPObjectPropertyIds { - ID_messageiterator_hasNext, + ID_playlistitems_count, }; -RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::getProperty(int index, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcPlaylistItemsNPObject::getProperty(int index, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); + switch( index ) { - case ID_messageiterator_hasNext: + case ID_playlistitems_count: { - if( _p_iter && p_plugin->getLog() ) - { - libvlc_exception_t ex; - libvlc_exception_init(&ex); - - BOOLEAN_TO_NPVARIANT(libvlc_log_iterator_has_next(_p_iter, &ex), result); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - } - else - { - BOOLEAN_TO_NPVARIANT(0, result); - } + int val = p_plugin->playlist_count(); + INT32_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } default: @@ -858,59 +707,48 @@ RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::getProperty(int ind return INVOKERESULT_GENERIC_ERROR; } -const NPUTF8 * const LibvlcMessageIteratorNPObject::methodNames[] = +const NPUTF8 * const LibvlcPlaylistItemsNPObject::methodNames[] = { - "next", + "clear", + "remove", }; +COUNTNAMES(LibvlcPlaylistItemsNPObject,methodCount,methodNames); -const int LibvlcMessageIteratorNPObject::methodCount = sizeof(LibvlcMessageIteratorNPObject::methodNames)/sizeof(NPUTF8 *); - -enum LibvlcMessageIteratorNPObjectMethodIds +enum LibvlcPlaylistItemsNPObjectMethodIds { - ID_messageiterator_next, + ID_playlistitems_clear, + ID_playlistitems_remove, }; -RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcPlaylistItemsNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); switch( index ) { - case ID_messageiterator_next: + case ID_playlistitems_clear: if( argCount == 0 ) { - if( _p_iter && p_plugin->getLog() ) - { - struct libvlc_log_message_t buffer; - - buffer.sizeof_msg = sizeof(buffer); - - libvlc_log_iterator_next(_p_iter, &buffer, &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - LibvlcMessageNPObject* message = - static_cast(NPN_CreateObject(_instance, RuntimeNPClass::getClass())); - if( message ) - { - message->setMessage(buffer); - OBJECT_TO_NPVARIANT(message, result); - return INVOKERESULT_NO_ERROR; - } - return INVOKERESULT_OUT_OF_MEMORY; - } - } - return INVOKERESULT_GENERIC_ERROR; + p_plugin->playlist_clear(&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; + } + return INVOKERESULT_NO_SUCH_METHOD; + case ID_playlistitems_remove: + if( (argCount == 1) && isNumberValue(args[0]) ) + { + p_plugin->playlist_delete_item(numberValue(args[0]),&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; default: @@ -919,398 +757,25 @@ RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::invoke(int index, c } return INVOKERESULT_GENERIC_ERROR; } - + /* -** implementation of libvlc message object +** implementation of libvlc playlist object */ -const NPUTF8 * const LibvlcMessagesNPObject::propertyNames[] = +LibvlcPlaylistNPObject::~LibvlcPlaylistNPObject() { - "count", + // Why the isValid()? + if( isValid() && playlistItemsObj ) + NPN_ReleaseObject(playlistItemsObj); }; -const int LibvlcMessagesNPObject::propertyCount = sizeof(LibvlcMessagesNPObject::propertyNames)/sizeof(NPUTF8 *); - -enum LibvlcMessagesNPObjectPropertyIds +const NPUTF8 * const LibvlcPlaylistNPObject::propertyNames[] = { - ID_messages_count, + "itemCount", /* deprecated */ + "isPlaying", + "items", }; - -RuntimeNPObject::InvokeResult LibvlcMessagesNPObject::getProperty(int index, NPVariant &result) -{ - /* is plugin still running */ - if( _instance->pdata ) - { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); - switch( index ) - { - case ID_messages_count: - { - libvlc_log_t *p_log = p_plugin->getLog(); - if( p_log ) - { - libvlc_exception_t ex; - libvlc_exception_init(&ex); - - INT32_TO_NPVARIANT(libvlc_log_count(p_log, &ex), result); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - } - else - { - INT32_TO_NPVARIANT(0, result); - } - return INVOKERESULT_NO_ERROR; - } - default: - ; - } - } - return INVOKERESULT_GENERIC_ERROR; -} - -const NPUTF8 * const LibvlcMessagesNPObject::methodNames[] = -{ - "clear", - "iterator", -}; - -const int LibvlcMessagesNPObject::methodCount = sizeof(LibvlcMessagesNPObject::methodNames)/sizeof(NPUTF8 *); - -enum LibvlcMessagesNPObjectMethodIds -{ - ID_messages_clear, - ID_messages_iterator, -}; - -RuntimeNPObject::InvokeResult LibvlcMessagesNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) -{ - /* is plugin still running */ - if( _instance->pdata ) - { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); - libvlc_exception_t ex; - libvlc_exception_init(&ex); - - switch( index ) - { - case ID_messages_clear: - if( argCount == 0 ) - { - libvlc_log_t *p_log = p_plugin->getLog(); - if( p_log ) - { - libvlc_log_clear(p_log, &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - } - return INVOKERESULT_NO_ERROR; - } - return INVOKERESULT_NO_SUCH_METHOD; - - case ID_messages_iterator: - if( argCount == 0 ) - { - LibvlcMessageIteratorNPObject* iter = - static_cast(NPN_CreateObject(_instance, RuntimeNPClass::getClass())); - if( iter ) - { - OBJECT_TO_NPVARIANT(iter, result); - return INVOKERESULT_NO_ERROR; - } - return INVOKERESULT_OUT_OF_MEMORY; - } - return INVOKERESULT_NO_SUCH_METHOD; - - default: - ; - } - } - return INVOKERESULT_GENERIC_ERROR; -} - - -/* -** implementation of libvlc message object -*/ - - -LibvlcLogNPObject::~LibvlcLogNPObject() -{ - if( isValid() ) - { - if( messagesObj ) NPN_ReleaseObject(messagesObj); - } -}; - -const NPUTF8 * const LibvlcLogNPObject::propertyNames[] = -{ - "messages", - "verbosity", -}; - -const int LibvlcLogNPObject::propertyCount = sizeof(LibvlcLogNPObject::propertyNames)/sizeof(NPUTF8 *); - -enum LibvlcLogNPObjectPropertyIds -{ - ID_log_messages, - ID_log_verbosity, -}; - -RuntimeNPObject::InvokeResult LibvlcLogNPObject::getProperty(int index, NPVariant &result) -{ - /* is plugin still running */ - if( _instance->pdata ) - { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); - libvlc_exception_t ex; - libvlc_exception_init(&ex); - - switch( index ) - { - case ID_log_messages: - { - // create child object in lazyman fashion to avoid ownership problem with firefox - if( ! messagesObj ) - messagesObj = NPN_CreateObject(_instance, RuntimeNPClass::getClass()); - OBJECT_TO_NPVARIANT(NPN_RetainObject(messagesObj), result); - return INVOKERESULT_NO_ERROR; - } - case ID_log_verbosity: - { - if( p_plugin->getLog() ) - { - INT32_TO_NPVARIANT(libvlc_get_log_verbosity(p_plugin->getVLC(), - &ex), result); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - } - else - { - /* log is not enabled, return -1 */ - DOUBLE_TO_NPVARIANT(-1.0, result); - } - return INVOKERESULT_NO_ERROR; - } - default: - ; - } - } - return INVOKERESULT_GENERIC_ERROR; -} - -RuntimeNPObject::InvokeResult LibvlcLogNPObject::setProperty(int index, const NPVariant &value) -{ - /* is plugin still running */ - if( _instance->pdata ) - { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); - libvlc_exception_t ex; - libvlc_exception_init(&ex); - - switch( index ) - { - case ID_log_verbosity: - if( isNumberValue(value) ) - { - libvlc_instance_t* p_libvlc = p_plugin->getVLC(); - libvlc_log_t *p_log = p_plugin->getLog(); - int verbosity = numberValue(value); - if( verbosity >= 0 ) - { - if( ! p_log ) - { - p_log = libvlc_log_open(p_libvlc, &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - p_plugin->setLog(p_log); - } - libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - } - else if( p_log ) - { - /* close log when verbosity is set to -1 */ - p_plugin->setLog(NULL); - libvlc_log_close(p_log, &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - } - return INVOKERESULT_NO_ERROR; - } - return INVOKERESULT_INVALID_VALUE; - default: - ; - } - } - return INVOKERESULT_GENERIC_ERROR; -} - -const NPUTF8 * const LibvlcLogNPObject::methodNames[] = -{ - /* no methods */ -}; - -const int LibvlcLogNPObject::methodCount = sizeof(LibvlcLogNPObject::methodNames)/sizeof(NPUTF8 *); - -/* -** implementation of libvlc playlist items object -*/ - -const NPUTF8 * const LibvlcPlaylistItemsNPObject::propertyNames[] = -{ - "count", -}; - -const int LibvlcPlaylistItemsNPObject::propertyCount = sizeof(LibvlcPlaylistItemsNPObject::propertyNames)/sizeof(NPUTF8 *); - -enum LibvlcPlaylistItemsNPObjectPropertyIds -{ - ID_playlistitems_count, -}; - -RuntimeNPObject::InvokeResult LibvlcPlaylistItemsNPObject::getProperty(int index, NPVariant &result) -{ - /* is plugin still running */ - if( _instance->pdata ) - { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); - libvlc_exception_t ex; - libvlc_exception_init(&ex); - - switch( index ) - { - case ID_playlistitems_count: - { - int val = libvlc_playlist_items_count(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - INT32_TO_NPVARIANT(val, result); - return INVOKERESULT_NO_ERROR; - } - default: - ; - } - } - return INVOKERESULT_GENERIC_ERROR; -} - -const NPUTF8 * const LibvlcPlaylistItemsNPObject::methodNames[] = -{ - "clear", - "remove", -}; - -const int LibvlcPlaylistItemsNPObject::methodCount = sizeof(LibvlcPlaylistItemsNPObject::methodNames)/sizeof(NPUTF8 *); - -enum LibvlcPlaylistItemsNPObjectMethodIds -{ - ID_playlistitems_clear, - ID_playlistitems_remove, -}; - -RuntimeNPObject::InvokeResult LibvlcPlaylistItemsNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) -{ - /* is plugin still running */ - if( _instance->pdata ) - { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); - libvlc_exception_t ex; - libvlc_exception_init(&ex); - - switch( index ) - { - case ID_playlistitems_clear: - if( argCount == 0 ) - { - libvlc_playlist_clear(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } - } - return INVOKERESULT_NO_SUCH_METHOD; - case ID_playlistitems_remove: - if( (argCount == 1) && isNumberValue(args[0]) ) - { - libvlc_playlist_delete_item(p_plugin->getVLC(), numberValue(args[0]), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } - } - return INVOKERESULT_NO_SUCH_METHOD; - default: - ; - } - } - return INVOKERESULT_GENERIC_ERROR; -} - -/* -** implementation of libvlc playlist object -*/ - - -LibvlcPlaylistNPObject::~LibvlcPlaylistNPObject() -{ - if( isValid() ) - { - if( playlistItemsObj ) NPN_ReleaseObject(playlistItemsObj); - } -}; - -const NPUTF8 * const LibvlcPlaylistNPObject::propertyNames[] = -{ - "itemCount", /* deprecated */ - "isPlaying", - "items", -}; - -const int LibvlcPlaylistNPObject::propertyCount = sizeof(LibvlcPlaylistNPObject::propertyNames)/sizeof(NPUTF8 *); +COUNTNAMES(LibvlcPlaylistNPObject,propertyCount,propertyNames); enum LibvlcPlaylistNPObjectPropertyIds { @@ -1319,46 +784,31 @@ enum LibvlcPlaylistNPObjectPropertyIds ID_playlist_items, }; -RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::getProperty(int index, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcPlaylistNPObject::getProperty(int index, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); - libvlc_exception_t ex; - libvlc_exception_init(&ex); + VlcPlugin* p_plugin = getPrivate(); switch( index ) { case ID_playlist_itemcount: /* deprecated */ { - int val = libvlc_playlist_items_count(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + int val = p_plugin->playlist_count(); INT32_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_playlist_isplaying: { - int val = libvlc_playlist_isplaying(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + int val = p_plugin->playlist_isplaying(); BOOLEAN_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_playlist_items: { - // create child object in lazyman fashion to avoid ownership problem with firefox - if( ! playlistItemsObj ) - playlistItemsObj = NPN_CreateObject(_instance, RuntimeNPClass::getClass()); + InstantObj( playlistItemsObj ); OBJECT_TO_NPVARIANT(NPN_RetainObject(playlistItemsObj), result); return INVOKERESULT_NO_ERROR; } @@ -1381,8 +831,7 @@ const NPUTF8 * const LibvlcPlaylistNPObject::methodNames[] = "clear", /* deprecated */ "removeItem", /* deprecated */ }; - -const int LibvlcPlaylistNPObject::methodCount = sizeof(LibvlcPlaylistNPObject::methodNames)/sizeof(NPUTF8 *); +COUNTNAMES(LibvlcPlaylistNPObject,methodCount,methodNames); enum LibvlcPlaylistNPObjectMethodIds { @@ -1397,43 +846,42 @@ enum LibvlcPlaylistNPObjectMethodIds ID_playlist_removeitem }; -RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); switch( index ) { + // XXX FIXME this needs squashing into something much smaller case ID_playlist_add: { if( (argCount < 1) || (argCount > 3) ) return INVOKERESULT_NO_SUCH_METHOD; - - char *url = NULL; + if( !NPVARIANT_IS_STRING(args[0]) ) + return INVOKERESULT_NO_SUCH_METHOD; // grab URL - if( NPVARIANT_IS_STRING(args[0]) ) - { - char *s = stringValue(NPVARIANT_TO_STRING(args[0])); - if( s ) - { - url = p_plugin->getAbsoluteURL(s); - if( url ) - delete s; - else - // problem with combining url, use argument - url = s; - } - else - return INVOKERESULT_OUT_OF_MEMORY; - } - else + if( NPVARIANT_IS_NULL(args[0]) ) return INVOKERESULT_NO_SUCH_METHOD; + char *s = stringValue(NPVARIANT_TO_STRING(args[0])); + if( !s ) + return INVOKERESULT_OUT_OF_MEMORY; + + char *url = p_plugin->getAbsoluteURL(s); + if( url ) + free(s); + else + // problem with combining url, use argument + url = s; + char *name = NULL; // grab name if available @@ -1449,7 +897,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP } else { - delete url; + free(url); return INVOKERESULT_INVALID_VALUE; } } @@ -1466,181 +914,106 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP } else if( NPVARIANT_IS_STRING(args[2]) ) { - parseOptions(NPVARIANT_TO_STRING(args[2]), &i_options, &ppsz_options); + parseOptions(NPVARIANT_TO_STRING(args[2]), + &i_options, &ppsz_options); } else if( NPVARIANT_IS_OBJECT(args[2]) ) { - parseOptions(NPVARIANT_TO_OBJECT(args[2]), &i_options, &ppsz_options); + parseOptions(NPVARIANT_TO_OBJECT(args[2]), + &i_options, &ppsz_options); } else { - delete url; - delete name; + free(url); + free(name); return INVOKERESULT_INVALID_VALUE; } } - int item = libvlc_playlist_add_extended(p_plugin->getVLC(), - url, - name, - i_options, - const_cast(ppsz_options), - &ex); - delete url; - delete name; + int item = p_plugin->playlist_add_extended_untrusted(url, name, + i_options, const_cast(ppsz_options), &ex); + free(url); + free(name); for( int i=0; i< i_options; ++i ) { - delete ppsz_options[i]; + free(ppsz_options[i]); } - delete ppsz_options; + free(ppsz_options); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - INT32_TO_NPVARIANT(item, result); - return INVOKERESULT_NO_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); + INT32_TO_NPVARIANT(item, result); + return INVOKERESULT_NO_ERROR; } case ID_playlist_play: if( argCount == 0 ) { - libvlc_playlist_play(p_plugin->getVLC(), -1, 0, NULL, &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + p_plugin->playlist_play(&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_playItem: if( (argCount == 1) && isNumberValue(args[0]) ) { - libvlc_playlist_play(p_plugin->getVLC(), numberValue(args[0]), 0, NULL, &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + p_plugin->playlist_play_item(numberValue(args[0]),&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_togglepause: if( argCount == 0 ) { - libvlc_playlist_pause(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + p_plugin->playlist_pause(&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_stop: if( argCount == 0 ) { - libvlc_playlist_stop(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + p_plugin->playlist_stop(); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_next: if( argCount == 0 ) { - libvlc_playlist_next(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + p_plugin->playlist_next(&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_prev: if( argCount == 0 ) { - libvlc_playlist_prev(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + p_plugin->playlist_prev(&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_clear: /* deprecated */ if( argCount == 0 ) { - libvlc_playlist_clear(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + p_plugin->playlist_clear(&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_removeitem: /* deprecated */ if( (argCount == 1) && isNumberValue(args[0]) ) { - libvlc_playlist_delete_item(p_plugin->getVLC(), numberValue(args[0]), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + p_plugin->playlist_delete_item(numberValue(args[0]), &ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; default: @@ -1650,7 +1023,14 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP return INVOKERESULT_GENERIC_ERROR; } -void LibvlcPlaylistNPObject::parseOptions(const NPString &nps, int *i_options, char*** ppsz_options) +// XXX FIXME The new playlist_add creates a media instance and feeds it +// XXX FIXME these options one at a time, so this hunk of code does lots +// XXX FIXME of unnecessairy work. Break out something that can do one +// XXX FIXME option at a time and doesn't need to realloc(). +// XXX FIXME Same for the other version of parseOptions. + +void LibvlcPlaylistNPObject::parseOptions(const NPString &nps, + int *i_options, char*** ppsz_options) { if( nps.utf8length ) { @@ -1691,11 +1071,11 @@ void LibvlcPlaylistNPObject::parseOptions(const NPString &nps, int *i_options, c if( nOptions == capacity ) { capacity += 16; - char **moreOptions = (char **)realloc(options, capacity*sizeof(char*)); + char **moreOptions = (char **)realloc(options, capacity*sizeof(char*)); if( ! moreOptions ) { /* failed to allocate more memory */ - delete s; + free(s); /* return what we got so far */ *i_options = nOptions; *ppsz_options = options; @@ -1713,12 +1093,14 @@ void LibvlcPlaylistNPObject::parseOptions(const NPString &nps, int *i_options, c *i_options = nOptions; *ppsz_options = options; } - delete s; + free(s); } } } -void LibvlcPlaylistNPObject::parseOptions(NPObject *obj, int *i_options, char*** ppsz_options) +// XXX FIXME See comment at the other parseOptions variant. +void LibvlcPlaylistNPObject::parseOptions(NPObject *obj, int *i_options, + char*** ppsz_options) { /* WARNING: Safari does not implement NPN_HasProperty/NPN_HasMethod */ @@ -1756,7 +1138,7 @@ void LibvlcPlaylistNPObject::parseOptions(NPObject *obj, int *i_options, char*** if( nOptions == capacity ) { capacity += 16; - char **moreOptions = (char **)realloc(options, capacity*sizeof(char*)); + char **moreOptions = (char **)realloc(options, capacity*sizeof(char*)); if( ! moreOptions ) { /* failed to allocate more memory */ @@ -1770,6 +1152,7 @@ void LibvlcPlaylistNPObject::parseOptions(NPObject *obj, int *i_options, char*** } options[nOptions++] = stringValue(value); + NPN_ReleaseVariantValue(&value); } *i_options = nOptions; *ppsz_options = options; @@ -1778,11 +1161,183 @@ void LibvlcPlaylistNPObject::parseOptions(NPObject *obj, int *i_options, char*** } } +/* +** implementation of libvlc subtitle object +*/ + +const NPUTF8 * const LibvlcSubtitleNPObject::propertyNames[] = +{ + "track", + "count", +}; + +enum LibvlcSubtitleNPObjectPropertyIds +{ + ID_subtitle_track, + ID_subtitle_count, +}; +COUNTNAMES(LibvlcSubtitleNPObject,propertyCount,propertyNames); + +RuntimeNPObject::InvokeResult +LibvlcSubtitleNPObject::getProperty(int index, NPVariant &result) +{ + /* is plugin still running */ + if( isPluginRunning() ) + { + VlcPlugin* p_plugin = getPrivate(); + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_subtitle_track: + { + /* get the current subtitle ID */ + int i_spu = libvlc_video_get_spu(p_md, &ex); + RETURN_ON_EXCEPTION(this,ex); + /* return it */ + INT32_TO_NPVARIANT(i_spu, result); + return INVOKERESULT_NO_ERROR; + } + case ID_subtitle_count: + { + /* get the number of subtitles available */ + int i_spu = libvlc_video_get_spu_count(p_md, &ex); + RETURN_ON_EXCEPTION(this,ex); + /* return it */ + INT32_TO_NPVARIANT(i_spu, result); + return INVOKERESULT_NO_ERROR; + } + } + } + return INVOKERESULT_GENERIC_ERROR; +} + +RuntimeNPObject::InvokeResult +LibvlcSubtitleNPObject::setProperty(int index, const NPVariant &value) +{ + /* is plugin still running */ + if( isPluginRunning() ) + { + VlcPlugin* p_plugin = getPrivate(); + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_subtitle_track: + { + if( isNumberValue(value) ) + { + /* set the new subtitle track to show */ + libvlc_video_set_spu(p_md, numberValue(value), &ex); + RETURN_ON_EXCEPTION(this,ex); + + return INVOKERESULT_NO_ERROR; + } + return INVOKERESULT_INVALID_VALUE; + } + } + } + return INVOKERESULT_GENERIC_ERROR; +} + +const NPUTF8 * const LibvlcSubtitleNPObject::methodNames[] = +{ + "description" +}; +COUNTNAMES(LibvlcSubtitleNPObject,methodCount,methodNames); + +enum LibvlcSubtitleNPObjectMethodIds +{ + ID_subtitle_description +}; + +RuntimeNPObject::InvokeResult +LibvlcSubtitleNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) +{ + /* is plugin still running */ + if( isPluginRunning() ) + { + VlcPlugin* p_plugin = getPrivate(); + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_subtitle_description: + { + if( argCount == 1) + { + char *psz_name; + int i_spuID, i_limit, i; + libvlc_track_description_t *p_spuDesc; + + /* get subtitles description */ + p_spuDesc = libvlc_video_get_spu_description(p_md, &ex); + RETURN_ON_EXCEPTION(this,ex); + if( !p_spuDesc ) + return INVOKERESULT_GENERIC_ERROR; + + /* get the number of subtitle available */ + i_limit = libvlc_video_get_spu_count(p_md, &ex); + RETURN_ON_EXCEPTION(this,ex); + + /* check if a number is given by the user + * and get the subtitle number */ + if( isNumberValue(args[0]) ) + i_spuID = numberValue(args[0]); + else + return INVOKERESULT_INVALID_VALUE; + + /* if bad number is given return invalid value */ + if ( ( i_spuID > ( i_limit -1 ) ) || ( i_spuID < 0 ) ) + return INVOKERESULT_INVALID_VALUE; + + /* get the good spuDesc */ + for( i = 0 ; i < i_spuID ; i++ ) + { + p_spuDesc = p_spuDesc->p_next; + } + psz_name = p_spuDesc->psz_name; + + /* return the name of the track chosen */ + return invokeResultString(psz_name, result); + } + return INVOKERESULT_NO_SUCH_METHOD; + } + default: + return INVOKERESULT_NO_SUCH_METHOD; + } + } + return INVOKERESULT_GENERIC_ERROR; +} + /* ** implementation of libvlc video object */ -const NPUTF8 * const LibvlcVideoNPObject::propertyNames[] = +LibvlcVideoNPObject::~LibvlcVideoNPObject() +{ + if( isValid() ) + { + if( marqueeObj ) NPN_ReleaseObject(marqueeObj); + if( logoObj ) NPN_ReleaseObject(logoObj); + if( deintObj ) NPN_ReleaseObject(deintObj); + } +} + +const NPUTF8 * const LibvlcVideoNPObject::propertyNames[] = { "fullscreen", "height", @@ -1790,7 +1345,10 @@ const NPUTF8 * const LibvlcVideoNPObject::propertyNames[] = "aspectRatio", "subtitle", "crop", - "teletext" + "teletext", + "marquee", + "logo", + "deinterlace", }; enum LibvlcVideoNPObjectPropertyIds @@ -1801,79 +1359,53 @@ enum LibvlcVideoNPObjectPropertyIds ID_video_aspectratio, ID_video_subtitle, ID_video_crop, - ID_video_teletext + ID_video_teletext, + ID_video_marquee, + ID_video_logo, + ID_video_deinterlace, }; +COUNTNAMES(LibvlcVideoNPObject,propertyCount,propertyNames); -const int LibvlcVideoNPObject::propertyCount = sizeof(LibvlcVideoNPObject::propertyNames)/sizeof(NPUTF8 *); - -RuntimeNPObject::InvokeResult LibvlcVideoNPObject::getProperty(int index, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcVideoNPObject::getProperty(int index, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); switch( index ) { case ID_video_fullscreen: { - int val = libvlc_get_fullscreen(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + int val = p_plugin->get_fullscreen(&ex); + RETURN_ON_EXCEPTION(this,ex); BOOLEAN_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_video_height: { int val = libvlc_video_get_height(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); INT32_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_video_width: { int val = libvlc_video_get_width(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); INT32_TO_NPVARIANT(val, result); return INVOKERESULT_NO_ERROR; } case ID_video_aspectratio: { NPUTF8 *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); if( !psz_aspect ) return INVOKERESULT_GENERIC_ERROR; @@ -1883,26 +1415,14 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::getProperty(int index, NPVari case ID_video_subtitle: { int i_spu = libvlc_video_get_spu(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); INT32_TO_NPVARIANT(i_spu, result); return INVOKERESULT_NO_ERROR; } case ID_video_crop: { NPUTF8 *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); if( !psz_geometry ) return INVOKERESULT_GENERIC_ERROR; @@ -1911,39 +1431,48 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::getProperty(int index, NPVari } case ID_video_teletext: { - int i_page = libvlc_video_get_teletext(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } +/* int i_page = libvlc_video_get_teletext(p_md, &ex); + RETURN_ON_EXCEPTION(this,ex); INT32_TO_NPVARIANT(i_page, result); return INVOKERESULT_NO_ERROR; +*/ + return INVOKERESULT_NO_SUCH_METHOD; + } + case ID_video_marquee: + { + InstantObj( marqueeObj ); + OBJECT_TO_NPVARIANT(NPN_RetainObject(marqueeObj), result); + return INVOKERESULT_NO_ERROR; + } + case ID_video_logo: + { + InstantObj( logoObj ); + OBJECT_TO_NPVARIANT(NPN_RetainObject(logoObj), result); + return INVOKERESULT_NO_ERROR; + } + case ID_video_deinterlace: + { + InstantObj( deintObj ); + OBJECT_TO_NPVARIANT(NPN_RetainObject(deintObj), result); + return INVOKERESULT_NO_ERROR; } } - libvlc_media_player_release(p_md); } return INVOKERESULT_GENERIC_ERROR; } -RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const NPVariant &value) +RuntimeNPObject::InvokeResult +LibvlcVideoNPObject::setProperty(int index, const NPVariant &value) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); switch( index ) { @@ -1951,20 +1480,12 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const { if( ! NPVARIANT_IS_BOOLEAN(value) ) { - libvlc_media_player_release(p_md); return INVOKERESULT_INVALID_VALUE; } int val = NPVARIANT_TO_BOOLEAN(value); - libvlc_set_fullscreen(p_md, val, &ex); - libvlc_media_player_release(p_md); - - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + p_plugin->set_fullscreen(val, &ex); + RETURN_ON_EXCEPTION(this,ex); return INVOKERESULT_NO_ERROR; } case ID_video_aspectratio: @@ -1973,45 +1494,30 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const if( ! NPVARIANT_IS_STRING(value) ) { - libvlc_media_player_release(p_md); return INVOKERESULT_INVALID_VALUE; } psz_aspect = stringValue(NPVARIANT_TO_STRING(value)); if( !psz_aspect ) { - libvlc_media_player_release(p_md); return INVOKERESULT_GENERIC_ERROR; } libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex); - delete psz_aspect; - libvlc_media_player_release(p_md); + free(psz_aspect); + RETURN_ON_EXCEPTION(this,ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } return INVOKERESULT_NO_ERROR; } case ID_video_subtitle: { if( isNumberValue(value) ) { - libvlc_video_set_spu(p_md, - numberValue(value), &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + libvlc_video_set_spu(p_md, numberValue(value), &ex); + RETURN_ON_EXCEPTION(this,ex); + return INVOKERESULT_NO_ERROR; } - libvlc_media_player_release(p_md); return INVOKERESULT_INVALID_VALUE; } case ID_video_crop: @@ -2020,49 +1526,36 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const if( ! NPVARIANT_IS_STRING(value) ) { - libvlc_media_player_release(p_md); return INVOKERESULT_INVALID_VALUE; } psz_geometry = stringValue(NPVARIANT_TO_STRING(value)); if( !psz_geometry ) { - libvlc_media_player_release(p_md); return INVOKERESULT_GENERIC_ERROR; } libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex); - delete psz_geometry; - libvlc_media_player_release(p_md); + free(psz_geometry); + RETURN_ON_EXCEPTION(this,ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } return INVOKERESULT_NO_ERROR; } case ID_video_teletext: { if( isNumberValue(value) ) { - libvlc_video_set_teletext(p_md, - numberValue(value), &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } +/* + libvlc_video_set_teletext(p_md, numberValue(value), &ex); + RETURN_ON_EXCEPTION(this,ex); + return INVOKERESULT_NO_ERROR; +*/ + return INVOKERESULT_NO_SUCH_METHOD; } - libvlc_media_player_release(p_md); return INVOKERESULT_INVALID_VALUE; } } - libvlc_media_player_release(p_md); } return INVOKERESULT_GENERIC_ERROR; } @@ -2070,96 +1563,623 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const const NPUTF8 * const LibvlcVideoNPObject::methodNames[] = { "toggleFullscreen", - "toggleTeletext" + "toggleTeletext", }; +COUNTNAMES(LibvlcVideoNPObject,methodCount,methodNames); enum LibvlcVideoNPObjectMethodIds { ID_video_togglefullscreen, - ID_video_toggleteletext + ID_video_toggleteletext, }; -const int LibvlcVideoNPObject::methodCount = sizeof(LibvlcVideoNPObject::methodNames)/sizeof(NPUTF8 *); - -RuntimeNPObject::InvokeResult LibvlcVideoNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) +RuntimeNPObject::InvokeResult +LibvlcVideoNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) { /* is plugin still running */ - if( _instance->pdata ) + if( isPluginRunning() ) { - VlcPlugin* p_plugin = reinterpret_cast(_instance->pdata); + VlcPlugin* p_plugin = getPrivate(); libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_media_player_t *p_md = libvlc_playlist_get_media_player(p_plugin->getVLC(), &ex); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); switch( index ) { case ID_video_togglefullscreen: + { if( argCount == 0 ) { - libvlc_toggle_fullscreen(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } - } - else - { - /* cannot get md, probably not playing */ - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - } - return INVOKERESULT_GENERIC_ERROR; + p_plugin->toggle_fullscreen(&ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; + } case ID_video_toggleteletext: + { if( argCount == 0 ) { libvlc_toggle_teletext(p_md, &ex); - libvlc_media_player_release(p_md); - if( libvlc_exception_raised(&ex) ) - { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); - return INVOKERESULT_GENERIC_ERROR; - } - else - { - VOID_TO_NPVARIANT(result); - return INVOKERESULT_NO_ERROR; - } + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; } - else + return INVOKERESULT_NO_SUCH_METHOD; + } + default: + return INVOKERESULT_NO_SUCH_METHOD; + } + } + return INVOKERESULT_GENERIC_ERROR; +} + +/* +** implementation of libvlc marquee object +*/ + +const NPUTF8 * const LibvlcMarqueeNPObject::propertyNames[] = +{ + "color", + "opacity", + "position", + "refresh", + "size", + "text", + "timeout", + "x", + "y", +}; + +enum LibvlcMarqueeNPObjectPropertyIds +{ + ID_marquee_color, + ID_marquee_opacity, + ID_marquee_position, + ID_marquee_refresh, + ID_marquee_size, + ID_marquee_text, + ID_marquee_timeout, + ID_marquee_x, + ID_marquee_y, +}; + +COUNTNAMES(LibvlcMarqueeNPObject,propertyCount,propertyNames); + +static const unsigned char marquee_idx[] = { + libvlc_marquee_Color, + libvlc_marquee_Opacity, + libvlc_marquee_Position, + libvlc_marquee_Refresh, + libvlc_marquee_Size, + 0, + libvlc_marquee_Timeout, + libvlc_marquee_X, + libvlc_marquee_Y, +}; + +RuntimeNPObject::InvokeResult +LibvlcMarqueeNPObject::getProperty(int index, NPVariant &result) +{ + char *psz; + + if( !isPluginRunning() ) + return INVOKERESULT_GENERIC_ERROR; + + VlcPlugin* p_plugin = getPrivate(); + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_marquee_color: + case ID_marquee_opacity: + case ID_marquee_refresh: + case ID_marquee_timeout: + case ID_marquee_size: + case ID_marquee_x: + case ID_marquee_y: + INT32_TO_NPVARIANT( + libvlc_video_get_marquee_int(p_md, marquee_idx[index], &ex), + result ); + RETURN_ON_EXCEPTION(this,ex); + return INVOKERESULT_NO_ERROR; + + case ID_marquee_position: + STRINGZ_TO_NPVARIANT( position_bynumber( + libvlc_video_get_marquee_int(p_md, libvlc_marquee_Position, &ex) ), + result ); + + RETURN_ON_EXCEPTION(this,ex); + break; + + case ID_marquee_text: + psz = libvlc_video_get_marquee_string(p_md, libvlc_marquee_Text, &ex); + if( psz ) + { + STRINGZ_TO_NPVARIANT(psz, result); + return INVOKERESULT_NO_ERROR; + } + break; + } + return INVOKERESULT_GENERIC_ERROR; +} + +RuntimeNPObject::InvokeResult +LibvlcMarqueeNPObject::setProperty(int index, const NPVariant &value) +{ + size_t i; + + if( !isPluginRunning() ) + return INVOKERESULT_GENERIC_ERROR; + + VlcPlugin* p_plugin = getPrivate(); + libvlc_exception_t ex; + libvlc_exception_init(&ex); + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_marquee_color: + case ID_marquee_opacity: + case ID_marquee_refresh: + case ID_marquee_timeout: + case ID_marquee_x: + case ID_marquee_y: + if( NPVARIANT_IS_INT32( value ) ) + { + libvlc_video_set_marquee_int(p_md, marquee_idx[index], + NPVARIANT_TO_INT32( value ), &ex); + RETURN_ON_EXCEPTION(this,ex); + return INVOKERESULT_NO_ERROR; + } + break; + + case ID_marquee_position: + if( !NPVARIANT_IS_STRING(value) || + !position_byname( NPVARIANT_TO_STRING(value).utf8characters, i ) ) + return INVOKERESULT_INVALID_VALUE; + + libvlc_video_set_marquee_int(p_md, libvlc_marquee_Position, i, &ex); + RETURN_ON_EXCEPTION(this,ex); + return INVOKERESULT_NO_ERROR; + + case ID_marquee_text: + if( NPVARIANT_IS_STRING( value ) ) + { + char *psz_text = stringValue( NPVARIANT_TO_STRING( value ) ); + libvlc_video_set_marquee_string(p_md, libvlc_marquee_Text, + psz_text, &ex); + free(psz_text); + RETURN_ON_EXCEPTION(this,ex); + return INVOKERESULT_NO_ERROR; + } + break; + } + return INVOKERESULT_NO_SUCH_METHOD; +} + +const NPUTF8 * const LibvlcMarqueeNPObject::methodNames[] = +{ + "enable", + "disable", +}; +COUNTNAMES(LibvlcMarqueeNPObject,methodCount,methodNames); + +enum LibvlcMarqueeNPObjectMethodIds +{ + ID_marquee_enable, + ID_marquee_disable, +}; + +RuntimeNPObject::InvokeResult +LibvlcMarqueeNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) +{ + if( !isPluginRunning() ) + return INVOKERESULT_GENERIC_ERROR; + + VlcPlugin* p_plugin = getPrivate(); + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_marquee_enable: + case ID_marquee_disable: + libvlc_video_set_marquee_int(p_md, libvlc_marquee_Enable, + index!=ID_marquee_disable, &ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + return INVOKERESULT_NO_ERROR; + } + return INVOKERESULT_NO_SUCH_METHOD; +} + +const NPUTF8 * const LibvlcLogoNPObject::propertyNames[] = { + "delay", + "repeat", + "opacity", + "position", + "x", + "y", +}; +enum LibvlcLogoNPObjectPropertyIds { + ID_logo_delay, + ID_logo_repeat, + ID_logo_opacity, + ID_logo_position, + ID_logo_x, + ID_logo_y, +}; +COUNTNAMES(LibvlcLogoNPObject,propertyCount,propertyNames); +static const unsigned char logo_idx[] = { + libvlc_logo_delay, + libvlc_logo_repeat, + libvlc_logo_opacity, + 0, + libvlc_logo_x, + libvlc_logo_y, +}; + +RuntimeNPObject::InvokeResult +LibvlcLogoNPObject::getProperty(int index, NPVariant &result) +{ + if( !isPluginRunning() ) + return INVOKERESULT_GENERIC_ERROR; + + VlcPlugin* p_plugin = getPrivate(); + libvlc_exception_t ex; + libvlc_exception_init(&ex); + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_logo_delay: + case ID_logo_repeat: + case ID_logo_opacity: + case ID_logo_x: + case ID_logo_y: + + INT32_TO_NPVARIANT( + libvlc_video_get_logo_int(p_md, logo_idx[index], &ex), result); + + RETURN_ON_EXCEPTION(this,ex); + break; + + case ID_logo_position: + STRINGZ_TO_NPVARIANT( position_bynumber( + libvlc_video_get_logo_int(p_md, libvlc_logo_position, &ex) ), + result ); + + RETURN_ON_EXCEPTION(this,ex); + break; + default: + return INVOKERESULT_GENERIC_ERROR; + } + return INVOKERESULT_NO_ERROR; +} + +RuntimeNPObject::InvokeResult +LibvlcLogoNPObject::setProperty(int index, const NPVariant &value) +{ + size_t i; + + if( !isPluginRunning() ) + return INVOKERESULT_GENERIC_ERROR; + + VlcPlugin* p_plugin = getPrivate(); + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_player_t *p_md = p_plugin->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_logo_delay: + case ID_logo_repeat: + case ID_logo_opacity: + case ID_logo_x: + case ID_logo_y: + if( !NPVARIANT_IS_INT32(value) ) + return INVOKERESULT_INVALID_VALUE; + + libvlc_video_set_logo_int(p_md, logo_idx[index], + NPVARIANT_TO_INT32( value ), &ex); + + RETURN_ON_EXCEPTION(this,ex); + break; + + case ID_logo_position: + if( !NPVARIANT_IS_STRING(value) || + !position_byname( NPVARIANT_TO_STRING(value).utf8characters, i ) ) + return INVOKERESULT_INVALID_VALUE; + + libvlc_video_set_logo_int(p_md, libvlc_logo_position, i, &ex); + + RETURN_ON_EXCEPTION(this,ex); + break; + default: + return INVOKERESULT_GENERIC_ERROR; + } + return INVOKERESULT_NO_ERROR; +} + + +const NPUTF8 * const LibvlcLogoNPObject::methodNames[] = { + "enable", + "disable", + "file", +}; +enum LibvlcLogoNPObjectMethodIds { + ID_logo_enable, + ID_logo_disable, + ID_logo_file, +}; +COUNTNAMES(LibvlcLogoNPObject,methodCount,methodNames); + +RuntimeNPObject::InvokeResult +LibvlcLogoNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) +{ + char *buf, *h; + size_t i, len; + + if( !isPluginRunning() ) + return INVOKERESULT_GENERIC_ERROR; + + libvlc_exception_t ex; + libvlc_exception_init(&ex); + libvlc_media_player_t *p_md = getPrivate()->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_logo_enable: + case ID_logo_disable: + if( argCount != 0 ) + return INVOKERESULT_GENERIC_ERROR; + + libvlc_video_set_logo_int(p_md, libvlc_logo_enable, + index != ID_logo_disable, &ex); + RETURN_ON_EXCEPTION(this,ex); + VOID_TO_NPVARIANT(result); + break; + + case ID_logo_file: + if( argCount == 0 ) + return INVOKERESULT_GENERIC_ERROR; + + for( len=0,i=0;i()->getMD(&ex); + RETURN_ON_EXCEPTION(this,ex); + + switch( index ) + { + case ID_deint_disable: + libvlc_video_set_deinterlace(p_md, 0, "", &ex); + RETURN_ON_EXCEPTION(this,ex); + break; + + case ID_deint_enable: + if( argCount != 1 || !NPVARIANT_IS_STRING( args[0] ) ) + return INVOKERESULT_INVALID_VALUE; + + psz = stringValue( NPVARIANT_TO_STRING( args[0] ) ); + libvlc_video_set_deinterlace(p_md, 1, psz, &ex); + free(psz); + RETURN_ON_EXCEPTION(this,ex); + break; + + default: + return INVOKERESULT_NO_SUCH_METHOD; + } + return INVOKERESULT_NO_ERROR; +} + + + +/* +** implementation of libvlc event object +*/ + +const NPUTF8 * const LibvlcEventNPObject::propertyNames[] = +{ +}; + +enum LibvlcEventNPObjectPropertyIds +{ +}; +COUNTNAMES(LibvlcEventNPObject,propertyCount,propertyNames); + +const NPUTF8 * const LibvlcEventNPObject::methodNames[] = +{ + "addListener", + "removeListeners", +}; +COUNTNAMES(LibvlcEventNPObject,methodCount,methodNames); + +enum LibvlcEventNPObjectMethodIds +{ + ID_event_addListener, + ID_event_removeListeners, +}; + +bool LibvlcEventNPObject::parseArgs(const NPVariant *args, uint32_t argCount, + eventtypes_bitmap_t &eventToGet) +{ + if (argCount > 2) + eventToGet.clear(); + + for (int argIndex = 2; argIndex < argCount; argIndex++) + { + if (NPVARIANT_IS_STRING(args[argIndex])) + { + if (!eventToGet.add_event(NPVARIANT_TO_STRING(args[argIndex]).utf8characters)) + return false; + } + else if (NPVARIANT_IS_OBJECT(args[argIndex])) + { + if (!parseEventArray(NPVARIANT_TO_OBJECT(args[argIndex]), eventToGet, _instance)) + return false; + } + else + return false; + } + return true; +} + +RuntimeNPObject::InvokeResult +LibvlcEventNPObject::invoke(int index, const NPVariant *args, + uint32_t argCount, NPVariant &result) +{ + /* is plugin still running */ + if( isPluginRunning() ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + switch( index ) + { + case ID_event_addListener: + if (argCount >= 2) { - /* cannot get md, probably not playing */ - if( libvlc_exception_raised(&ex) ) + // Checks if the first argument is a NPObject + if (!NPVARIANT_IS_OBJECT(args[0])) + return INVOKERESULT_NO_SUCH_METHOD; + + // Checks if the browser has the NPAPI version 0.19 at least. + if (!VlcPlugin::canUseEventListener()) { - NPN_SetException(this, libvlc_exception_get_message(&ex)); - libvlc_exception_clear(&ex); + NPN_SetException(this, strdup(ERROR_API_VERSION)); + return INVOKERESULT_GENERIC_ERROR; } - return INVOKERESULT_GENERIC_ERROR; + + VlcPlugin* p_plugin = getPrivate(); + + // Gets the binary field corresponding to the events the + // listener must listen to if specified. + // Else, listen to all events. + eventtypes_bitmap_t eventToGet; + eventToGet.set_all_events(); + + if (!parseArgs(args, argCount, eventToGet)) + { + NPN_SetException(this, strdup(ERROR_EVENT_NOT_FOUND)); + return INVOKERESULT_GENERIC_ERROR; + } + + NPObject *listener = NPVARIANT_TO_OBJECT(args[0]); + NPN_RetainObject(listener); + + EventListener *eventListener = new EventListener(); + eventListener->listener = listener; + eventListener->id = copyNPVariant(args[1]); + eventListener->eventMap = eventToGet; + + p_plugin->eventToCatch.add_event(eventToGet); + + p_plugin->eventListeners.push_back(eventListener); + + return INVOKERESULT_NO_ERROR; } return INVOKERESULT_NO_SUCH_METHOD; - default: - return INVOKERESULT_NO_SUCH_METHOD; + case ID_event_removeListeners: + if (argCount == 0) + { + VlcPlugin* p_plugin = getPrivate(); + p_plugin->eventListeners.clear(); + p_plugin->eventToCatch.clear(); + return INVOKERESULT_NO_ERROR; + } + return INVOKERESULT_NO_SUCH_METHOD; + default: + ; } } return INVOKERESULT_GENERIC_ERROR; } -