📄 npolibvlc.cpp
字号:
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<VlcPlugin*>(_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<VlcPlugin*>(_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 *);enum LibvlcPlaylistNPObjectPropertyIds{ ID_playlist_itemcount, ID_playlist_isplaying, ID_playlist_items,};RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::getProperty(int index, NPVariant &result){ /* is plugin still running */ if( _instance->pdata ) { VlcPlugin* p_plugin = reinterpret_cast<VlcPlugin*>(_instance->pdata); libvlc_exception_t ex; libvlc_exception_init(&ex); 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; } 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; } 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<LibvlcPlaylistItemsNPObject>::getClass()); OBJECT_TO_NPVARIANT(NPN_RetainObject(playlistItemsObj), result); return INVOKERESULT_NO_ERROR; } default: ; } } return INVOKERESULT_GENERIC_ERROR;}const NPUTF8 * const LibvlcPlaylistNPObject::methodNames[] ={ "add", "play", "playItem", "togglePause", "stop", "next", "prev", "clear", /* deprecated */ "removeItem", /* deprecated */};const int LibvlcPlaylistNPObject::methodCount = sizeof(LibvlcPlaylistNPObject::methodNames)/sizeof(NPUTF8 *);enum LibvlcPlaylistNPObjectMethodIds{ ID_playlist_add, ID_playlist_play, ID_playlist_playItem, ID_playlist_togglepause, ID_playlist_stop, ID_playlist_next, ID_playlist_prev, ID_playlist_clear, ID_playlist_removeitem};RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result){ /* is plugin still running */ if( _instance->pdata ) { VlcPlugin* p_plugin = reinterpret_cast<VlcPlugin*>(_instance->pdata); libvlc_exception_t ex; libvlc_exception_init(&ex); switch( index ) { case ID_playlist_add: { if( (argCount < 1) || (argCount > 3) ) return INVOKERESULT_NO_SUCH_METHOD; char *url = NULL; // 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 return INVOKERESULT_NO_SUCH_METHOD; char *name = NULL; // grab name if available if( argCount > 1 ) { if( NPVARIANT_IS_NULL(args[1]) ) { // do nothing } else if( NPVARIANT_IS_STRING(args[1]) ) { name = stringValue(NPVARIANT_TO_STRING(args[1])); } else { delete url; return INVOKERESULT_INVALID_VALUE; } } int i_options = 0; char** ppsz_options = NULL; // grab options if available if( argCount > 2 ) { if( NPVARIANT_IS_NULL(args[2]) ) { // do nothing } else if( NPVARIANT_IS_STRING(args[2]) ) { 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); } else { delete url; delete name; return INVOKERESULT_INVALID_VALUE; } } int item = libvlc_playlist_add_extended(p_plugin->getVLC(), url, name, i_options, const_cast<const char **>(ppsz_options), &ex); delete url; delete name; for( int i=0; i< i_options; ++i ) { delete ppsz_options[i]; } delete 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; } } 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; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -