+
+/*
+** 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<VlcPlugin>();
+ 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<VlcPlugin>();
+ 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<VlcPlugin>();
+ 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<VlcPlugin>();
+ 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<VlcPlugin>();
+ 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<VlcPlugin>()->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<argCount;++i )
+ {
+ if( !NPVARIANT_IS_STRING(args[i]) )
+ return INVOKERESULT_INVALID_VALUE;
+ len+=NPVARIANT_TO_STRING(args[i]).utf8length+1;
+ }
+
+ buf = (char *)malloc( len+1 );
+ if( !buf )
+ return INVOKERESULT_OUT_OF_MEMORY;
+
+ for( h=buf,i=0;i<argCount;++i )
+ {
+ if(i) *h++=';';
+ len=NPVARIANT_TO_STRING(args[i]).utf8length;
+ memcpy(h,NPVARIANT_TO_STRING(args[i]).utf8characters,len);
+ h+=len;
+ }
+ *h='\0';
+
+ libvlc_video_set_logo_string(p_md, libvlc_logo_file, buf, &ex);
+ free( buf );
+ RETURN_ON_EXCEPTION(this,ex);
+ VOID_TO_NPVARIANT(result);
+ break;
+ default:
+ return INVOKERESULT_NO_SUCH_METHOD;
+ }
+ return INVOKERESULT_NO_ERROR;
+}
+
+
+const NPUTF8 * const LibvlcDeinterlaceNPObject::propertyNames[] = {
+};
+enum LibvlcDeinterlaceNPObjectPropertyIds {
+};
+COUNTNAMES(LibvlcDeinterlaceNPObject,propertyCount,propertyNames);
+
+RuntimeNPObject::InvokeResult
+LibvlcDeinterlaceNPObject::getProperty(int index, NPVariant &result)
+{
+ return INVOKERESULT_GENERIC_ERROR;
+}
+
+RuntimeNPObject::InvokeResult
+LibvlcDeinterlaceNPObject::setProperty(int index, const NPVariant &value)
+{
+ return INVOKERESULT_GENERIC_ERROR;
+}
+
+
+const NPUTF8 * const LibvlcDeinterlaceNPObject::methodNames[] = {
+ "enable",
+ "disable",
+};
+enum LibvlcDeinterlaceNPObjectMethodIds {
+ ID_deint_enable,
+ ID_deint_disable,
+};
+COUNTNAMES(LibvlcDeinterlaceNPObject,methodCount,methodNames);
+
+RuntimeNPObject::InvokeResult
+LibvlcDeinterlaceNPObject::invoke(int index, const NPVariant *args,
+ uint32_t argCount, NPVariant &result)
+{
+ char *psz;
+
+ if( !isPluginRunning() )
+ return INVOKERESULT_GENERIC_ERROR;
+
+ libvlc_exception_t ex;
+ libvlc_exception_init(&ex);
+ libvlc_media_player_t *p_md = getPrivate<VlcPlugin>()->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)
+ {
+ // 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, strdup(ERROR_API_VERSION));
+ return INVOKERESULT_GENERIC_ERROR;
+ }
+
+ VlcPlugin* p_plugin = getPrivate<VlcPlugin>();
+
+ // 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;
+ case ID_event_removeListeners:
+ if (argCount == 0)
+ {
+ VlcPlugin* p_plugin = getPrivate<VlcPlugin>();
+ p_plugin->eventListeners.clear();
+ p_plugin->eventToCatch.clear();
+ return INVOKERESULT_NO_ERROR;
+ }
+ return INVOKERESULT_NO_SUCH_METHOD;
+ default:
+ ;
+ }
+ }
+ return INVOKERESULT_GENERIC_ERROR;
+}