]> git.sesse.net Git - vlc/blobdiff - mozilla/control/npolibvlc.cpp
mozilla: backporting from 0.8.6
[vlc] / mozilla / control / npolibvlc.cpp
index 60f9a0c26bb550624a4975cb96ede0248f951402..15837078ce50ffff0d2f049da96ea1dc6903cd21 100755 (executable)
@@ -61,6 +61,7 @@ const NPUTF8 * const LibvlcRootNPObject::propertyNames[] =
 {\r
     "audio",\r
     "input",\r
+    "log",\r
     "playlist",\r
     "video",\r
     "VersionInfo",\r
@@ -70,38 +71,54 @@ const int LibvlcRootNPObject::propertyCount = sizeof(LibvlcRootNPObject::propert
 \r
 enum LibvlcRootNPObjectPropertyIds\r
 {\r
-    ID_audio = 0,\r
-    ID_input,\r
-    ID_playlist,\r
-    ID_video,\r
-    ID_VersionInfo,\r
+    ID_root_audio = 0,\r
+    ID_root_input,\r
+    ID_root_log,\r
+    ID_root_playlist,\r
+    ID_root_video,\r
+    ID_root_VersionInfo,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcRootNPObject::getProperty(int index, NPVariant &result)\r
 {\r
-    switch( index )\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
     {\r
-        case ID_audio:\r
-            OBJECT_TO_NPVARIANT(NPN_RetainObject(audioObj), result);\r
-            return INVOKERESULT_NO_ERROR;\r
-        case ID_input:\r
-            OBJECT_TO_NPVARIANT(NPN_RetainObject(inputObj), result);\r
-            return INVOKERESULT_NO_ERROR;\r
-        case ID_playlist:\r
-            OBJECT_TO_NPVARIANT(NPN_RetainObject(playlistObj), result);\r
-            return INVOKERESULT_NO_ERROR;\r
-        case ID_video:\r
-            OBJECT_TO_NPVARIANT(NPN_RetainObject(videoObj), result);\r
-            return INVOKERESULT_NO_ERROR;\r
-        case ID_VersionInfo:\r
-            NPUTF8 *versionStr = NULL;\r
-\r
-            versionStr = strdup( VLC_Version() );\r
-            if (!versionStr)\r
-                return INVOKERESULT_GENERIC_ERROR;\r
-\r
-            STRINGZ_TO_NPVARIANT(versionStr, result);\r
-            return INVOKERESULT_NO_ERROR;\r
+        switch( index )\r
+        {\r
+            case ID_root_audio:\r
+                OBJECT_TO_NPVARIANT(NPN_RetainObject(audioObj), result);\r
+                return INVOKERESULT_NO_ERROR;\r
+            case ID_root_input:\r
+                OBJECT_TO_NPVARIANT(NPN_RetainObject(inputObj), result);\r
+                return INVOKERESULT_NO_ERROR;\r
+            case ID_root_log:\r
+                OBJECT_TO_NPVARIANT(NPN_RetainObject(logObj), result);\r
+                return INVOKERESULT_NO_ERROR;\r
+            case ID_root_playlist:\r
+                OBJECT_TO_NPVARIANT(NPN_RetainObject(playlistObj), result);\r
+                return INVOKERESULT_NO_ERROR;\r
+            case ID_root_video:\r
+                OBJECT_TO_NPVARIANT(NPN_RetainObject(videoObj), result);\r
+                return INVOKERESULT_NO_ERROR;\r
+            case ID_root_VersionInfo:\r
+            {\r
+                int len = strlen(VLC_Version());\r
+                NPUTF8 *retval =(NPUTF8*)NPN_MemAlloc(len);\r
+                if( retval )\r
+                {\r
+                    memcpy(retval, VLC_Version(), len);\r
+                    STRINGN_TO_NPVARIANT(retval, len, result);\r
+                }\r
+                else\r
+                {\r
+                    NULL_TO_NPVARIANT(result);\r
+                }\r
+                return INVOKERESULT_NO_ERROR;\r
+            }\r
+            default:\r
+                ;\r
+        }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
 }\r
@@ -115,7 +132,7 @@ const int LibvlcRootNPObject::methodCount = sizeof(LibvlcRootNPObject::methodNam
 \r
 enum LibvlcRootNPObjectMethodIds\r
 {\r
-    ID_version,\r
+    ID_root_versionInfo,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcRootNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)\r
@@ -128,21 +145,25 @@ RuntimeNPObject::InvokeResult LibvlcRootNPObject::invoke(int index, const NPVari
 \r
         switch( index )\r
         {\r
-            case ID_version:\r
+            case ID_root_versionInfo:\r
                 if( argCount == 0 )\r
                 {\r
-                    NPUTF8 *versionStr = NULL;\r
-\r
-                    versionStr = strdup( VLC_Version() );\r
-                    if (!versionStr)\r
-                        return INVOKERESULT_GENERIC_ERROR;\r
-\r
-                    STRINGZ_TO_NPVARIANT(versionStr, result);\r
+                    int len = strlen(VLC_Version());\r
+                    NPUTF8 *retval =(NPUTF8*)NPN_MemAlloc(len);\r
+                    if( retval )\r
+                    {\r
+                        memcpy(retval, VLC_Version(), len);\r
+                        STRINGN_TO_NPVARIANT(retval, len, result);\r
+                    }\r
+                    else\r
+                    {\r
+                        NULL_TO_NPVARIANT(result);\r
+                    }\r
                     return INVOKERESULT_NO_ERROR;\r
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
             default:\r
-                return INVOKERESULT_NO_SUCH_METHOD;\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -162,8 +183,8 @@ const int LibvlcAudioNPObject::propertyCount = sizeof(LibvlcAudioNPObject::prope
 \r
 enum LibvlcAudioNPObjectPropertyIds\r
 {\r
-    ID_mute,\r
-    ID_volume,\r
+    ID_audio_mute,\r
+    ID_audio_volume,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVariant &result)\r
@@ -176,7 +197,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari
 \r
         switch( index )\r
         {\r
-            case ID_mute:\r
+            case ID_audio_mute:\r
             {\r
                 vlc_bool_t muted = libvlc_audio_get_mute(p_plugin->getVLC(), &ex);\r
                 if( libvlc_exception_raised(&ex) )\r
@@ -188,7 +209,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari
                 BOOLEAN_TO_NPVARIANT(muted, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_volume:\r
+            case ID_audio_volume:\r
             {\r
                 int volume = libvlc_audio_get_volume(p_plugin->getVLC(), &ex);\r
                 if( libvlc_exception_raised(&ex) )\r
@@ -200,6 +221,8 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::getProperty(int index, NPVari
                 INT32_TO_NPVARIANT(volume, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -215,7 +238,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
 \r
         switch( index )\r
         {\r
-            case ID_mute:\r
+            case ID_audio_mute:\r
                 if( NPVARIANT_IS_BOOLEAN(value) )\r
                 {\r
                     libvlc_audio_set_mute(p_plugin->getVLC(),\r
@@ -229,7 +252,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
                     return INVOKERESULT_NO_ERROR;\r
                 }\r
                 return INVOKERESULT_INVALID_VALUE;\r
-            case ID_volume:\r
+            case ID_audio_volume:\r
                 if( isNumberValue(value) )\r
                 {\r
                     libvlc_audio_set_volume(p_plugin->getVLC(),\r
@@ -243,6 +266,8 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::setProperty(int index, const
                     return INVOKERESULT_NO_ERROR;\r
                 }\r
                 return INVOKERESULT_INVALID_VALUE;\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -257,7 +282,7 @@ const int LibvlcAudioNPObject::methodCount = sizeof(LibvlcAudioNPObject::methodN
 \r
 enum LibvlcAudioNPObjectMethodIds\r
 {\r
-    ID_togglemute,\r
+    ID_audio_togglemute,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcAudioNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)\r
@@ -270,7 +295,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::invoke(int index, const NPVar
 \r
         switch( index )\r
         {\r
-            case ID_togglemute:\r
+            case ID_audio_togglemute:\r
                 if( argCount == 0 )\r
                 {\r
                     libvlc_audio_toggle_mute(p_plugin->getVLC(), &ex);\r
@@ -288,7 +313,7 @@ RuntimeNPObject::InvokeResult LibvlcAudioNPObject::invoke(int index, const NPVar
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
             default:\r
-                return INVOKERESULT_NO_SUCH_METHOD;\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -313,13 +338,13 @@ const int LibvlcInputNPObject::propertyCount = sizeof(LibvlcInputNPObject::prope
 \r
 enum LibvlcInputNPObjectPropertyIds\r
 {\r
-    ID_length,\r
-    ID_position,\r
-    ID_time,\r
-    ID_state,\r
-    ID_rate,\r
-    ID_fps,\r
-    ID_hasvout,\r
+    ID_input_length,\r
+    ID_input_position,\r
+    ID_input_time,\r
+    ID_input_state,\r
+    ID_input_rate,\r
+    ID_input_fps,\r
+    ID_input_hasvout,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVariant &result)\r
@@ -333,7 +358,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
         libvlc_input_t *p_input = libvlc_playlist_get_input(p_plugin->getVLC(), &ex);\r
         if( libvlc_exception_raised(&ex) )\r
         {\r
-            if( index != ID_state )\r
+            if( index != ID_input_state )\r
             {\r
                 NPN_SetException(this, libvlc_exception_get_message(&ex));\r
                 libvlc_exception_clear(&ex);\r
@@ -349,7 +374,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
 \r
         switch( index )\r
         {\r
-            case ID_length:\r
+            case ID_input_length:\r
             {\r
                 double val = (double)libvlc_input_get_length(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -362,7 +387,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
                 DOUBLE_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_position:\r
+            case ID_input_position:\r
             {\r
                 double val = libvlc_input_get_position(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -375,7 +400,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
                 DOUBLE_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_time:\r
+            case ID_input_time:\r
             {\r
                 double val = (double)libvlc_input_get_time(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -388,7 +413,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
                 DOUBLE_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_state:\r
+            case ID_input_state:\r
             {\r
                 int val = libvlc_input_get_state(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -401,7 +426,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
                 INT32_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_rate:\r
+            case ID_input_rate:\r
             {\r
                 float val = libvlc_input_get_rate(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -414,7 +439,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
                 DOUBLE_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_fps:\r
+            case ID_input_fps:\r
             {\r
                 double val = libvlc_input_get_fps(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -427,7 +452,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
                 DOUBLE_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_hasvout:\r
+            case ID_input_hasvout:\r
             {\r
                 vlc_bool_t val = libvlc_input_has_vout(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -440,6 +465,8 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::getProperty(int index, NPVari
                 BOOLEAN_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
+            default:\r
+                ;\r
         }\r
         libvlc_input_free(p_input);\r
     }\r
@@ -464,7 +491,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const
 \r
         switch( index )\r
         {\r
-            case ID_position:\r
+            case ID_input_position:\r
             {\r
                 if( ! NPVARIANT_IS_DOUBLE(value) )\r
                 {\r
@@ -483,7 +510,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const
                 }\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_time:\r
+            case ID_input_time:\r
             {\r
                 vlc_int64_t val;\r
                 if( NPVARIANT_IS_INT32(value) )\r
@@ -506,7 +533,7 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const
                 }\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_rate:\r
+            case ID_input_rate:\r
             {\r
                 float val;\r
                 if( NPVARIANT_IS_INT32(value) )\r
@@ -529,6 +556,8 @@ RuntimeNPObject::InvokeResult LibvlcInputNPObject::setProperty(int index, const
                 }\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
+            default:\r
+                ;\r
         }\r
         libvlc_input_free(p_input);\r
     }\r
@@ -559,93 +588,99 @@ const int LibvlcMessageNPObject::propertyCount = sizeof(LibvlcMessageNPObject::p
 \r
 enum LibvlcMessageNPObjectPropertyIds\r
 {\r
-    ID_severity,\r
-    ID_type,\r
-    ID_name,\r
-    ID_header,\r
-    ID_message,\r
+    ID_message_severity,\r
+    ID_message_type,\r
+    ID_message_name,\r
+    ID_message_header,\r
+    ID_message_message,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcMessageNPObject::getProperty(int index, NPVariant &result)\r
 {\r
-    switch( index )\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
     {\r
-        case ID_severity:\r
-        {\r
-            INT32_TO_NPVARIANT(_msg.i_severity, result);\r
-            return INVOKERESULT_NO_ERROR;\r
-        }\r
-        case ID_type:\r
+        switch( index )\r
         {\r
-            if( _msg.psz_type )\r
-            {\r
-                int len = strlen(_msg.psz_type);\r
-                NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);\r
-                if( retval )\r
-                {\r
-                    memcpy(retval, _msg.psz_type, len);\r
-                    STRINGN_TO_NPVARIANT(retval, len, result);\r
-                }\r
-            }\r
-            else\r
+            case ID_message_severity:\r
             {\r
-                NULL_TO_NPVARIANT(result);\r
+                INT32_TO_NPVARIANT(_msg.i_severity, result);\r
+                return INVOKERESULT_NO_ERROR;\r
             }\r
-            return INVOKERESULT_NO_ERROR;\r
-        }\r
-        case ID_name:\r
-        {\r
-            if( _msg.psz_name )\r
+            case ID_message_type:\r
             {\r
-                int len = strlen(_msg.psz_name);\r
-                NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);\r
-                if( retval )\r
+                if( _msg.psz_type )\r
                 {\r
-                    memcpy(retval, _msg.psz_name, len);\r
-                    STRINGN_TO_NPVARIANT(retval, len, result);\r
+                    int len = strlen(_msg.psz_type);\r
+                    NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);\r
+                    if( retval )\r
+                    {\r
+                        memcpy(retval, _msg.psz_type, len);\r
+                        STRINGN_TO_NPVARIANT(retval, len, result);\r
+                    }\r
                 }\r
-            }\r
-            else\r
-            {\r
-                NULL_TO_NPVARIANT(result);\r
-            }\r
-            return INVOKERESULT_NO_ERROR;\r
-        }\r
-        case ID_header:\r
-        {\r
-            if( _msg.psz_header )\r
-            {\r
-                int len = strlen(_msg.psz_header);\r
-                NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);\r
-                if( retval )\r
+                else\r
                 {\r
-                    memcpy(retval, _msg.psz_header, len);\r
-                    STRINGN_TO_NPVARIANT(retval, len, result);\r
+                    NULL_TO_NPVARIANT(result);\r
                 }\r
+                return INVOKERESULT_NO_ERROR;\r
             }\r
-            else\r
+            case ID_message_name:\r
             {\r
-                NULL_TO_NPVARIANT(result);\r
+                if( _msg.psz_name )\r
+                {\r
+                    int len = strlen(_msg.psz_name);\r
+                    NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);\r
+                    if( retval )\r
+                    {\r
+                        memcpy(retval, _msg.psz_name, len);\r
+                        STRINGN_TO_NPVARIANT(retval, len, result);\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    NULL_TO_NPVARIANT(result);\r
+                }\r
+                return INVOKERESULT_NO_ERROR;\r
             }\r
-            return INVOKERESULT_NO_ERROR;\r
-        }\r
-        case ID_message:\r
-        {\r
-            if( _msg.psz_message )\r
+            case ID_message_header:\r
             {\r
-                int len = strlen(_msg.psz_message);\r
-                NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);\r
-                if( retval )\r
+                if( _msg.psz_header )\r
                 {\r
-                    memcpy(retval, _msg.psz_message, len);\r
-                    STRINGN_TO_NPVARIANT(retval, len, result);\r
+                    int len = strlen(_msg.psz_header);\r
+                    NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);\r
+                    if( retval )\r
+                    {\r
+                        memcpy(retval, _msg.psz_header, len);\r
+                        STRINGN_TO_NPVARIANT(retval, len, result);\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    NULL_TO_NPVARIANT(result);\r
                 }\r
+                return INVOKERESULT_NO_ERROR;\r
             }\r
-            else\r
+            case ID_message_message:\r
             {\r
-                NULL_TO_NPVARIANT(result);\r
+                if( _msg.psz_message )\r
+                {\r
+                    int len = strlen(_msg.psz_message);\r
+                    NPUTF8* retval = (NPUTF8*)NPN_MemAlloc(len);\r
+                    if( retval )\r
+                    {\r
+                        memcpy(retval, _msg.psz_message, len);\r
+                        STRINGN_TO_NPVARIANT(retval, len, result);\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    NULL_TO_NPVARIANT(result);\r
+                }\r
+                return INVOKERESULT_NO_ERROR;\r
             }\r
-            return INVOKERESULT_NO_ERROR;\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -662,17 +697,27 @@ const int LibvlcMessageNPObject::methodCount = sizeof(LibvlcMessageNPObject::met
 ** implementation of libvlc message iterator object\r
 */\r
 \r
-void LibvlcMessageIteratorNPObject::setLog(LibvlcLogNPObject* p_vlclog)\r
+LibvlcMessageIteratorNPObject::LibvlcMessageIteratorNPObject(NPP instance, const NPClass *aClass) :\r
+    RuntimeNPObject(instance, aClass),\r
+    _p_iter(NULL)\r
 {\r
-    _p_vlclog = p_vlclog;\r
-    if( p_vlclog->_p_log )\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
     {\r
-        _p_iter = libvlc_log_get_iterator(p_vlclog->_p_log, NULL);\r
+        libvlc_log_t *p_log = p_plugin->getLog();\r
+        if( p_log )\r
+        {\r
+            _p_iter = libvlc_log_get_iterator(p_log, NULL);\r
+        }\r
     }\r
-    else\r
-        _p_iter = NULL;\r
 };\r
 \r
+LibvlcMessageIteratorNPObject::~LibvlcMessageIteratorNPObject()\r
+{\r
+    if( _p_iter )\r
+        libvlc_log_iterator_free(_p_iter, NULL);\r
+}\r
+\r
 const NPUTF8 * const LibvlcMessageIteratorNPObject::propertyNames[] = \r
 {\r
     "hasNext",\r
@@ -682,33 +727,39 @@ const int LibvlcMessageIteratorNPObject::propertyCount = sizeof(LibvlcMessageIte
 \r
 enum LibvlcMessageIteratorNPObjectPropertyIds\r
 {\r
-    ID_hasNext,\r
+    ID_messageiterator_hasNext,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::getProperty(int index, NPVariant &result)\r
 {\r
-    switch( index )\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
     {\r
-        case ID_hasNext:\r
+        switch( index )\r
         {\r
-            if( _p_iter &&  _p_vlclog->_p_log )\r
+            case ID_messageiterator_hasNext:\r
             {\r
-                libvlc_exception_t ex;\r
-                libvlc_exception_init(&ex);\r
+                if( _p_iter && p_plugin->getLog() )\r
+                {\r
+                    libvlc_exception_t ex;\r
+                    libvlc_exception_init(&ex);\r
 \r
-                BOOLEAN_TO_NPVARIANT(libvlc_log_iterator_has_next(_p_iter, &ex), result);\r
-                if( libvlc_exception_raised(&ex) )\r
+                    BOOLEAN_TO_NPVARIANT(libvlc_log_iterator_has_next(_p_iter, &ex), result);\r
+                    if( libvlc_exception_raised(&ex) )\r
+                    {\r
+                        NPN_SetException(this, libvlc_exception_get_message(&ex));\r
+                        libvlc_exception_clear(&ex);\r
+                        return INVOKERESULT_GENERIC_ERROR;\r
+                    }\r
+                }\r
+                else\r
                 {\r
-                    NPN_SetException(this, libvlc_exception_get_message(&ex));\r
-                    libvlc_exception_clear(&ex);\r
-                    return INVOKERESULT_GENERIC_ERROR;\r
+                    BOOLEAN_TO_NPVARIANT(0, result);\r
                 }\r
+                return INVOKERESULT_NO_ERROR;\r
             }\r
-            else\r
-            {\r
-                BOOLEAN_TO_NPVARIANT(0, result);\r
-            }\r
-            return INVOKERESULT_NO_ERROR;\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -728,7 +779,8 @@ enum LibvlcMessageIteratorNPObjectMethodIds
 \r
 RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)\r
 {\r
-    if( _p_iter &&  _p_vlclog->_p_log )\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
     {\r
         libvlc_exception_t ex;\r
         libvlc_exception_init(&ex);\r
@@ -738,32 +790,37 @@ RuntimeNPObject::InvokeResult LibvlcMessageIteratorNPObject::invoke(int index, c
             case ID_messageiterator_next:\r
                 if( argCount == 0 )\r
                 {\r
-                    struct libvlc_log_message_t buffer;\r
+                    if( _p_iter && p_plugin->getLog() )\r
+                    {\r
+                        struct libvlc_log_message_t buffer;\r
 \r
-                    buffer.sizeof_msg = sizeof(buffer);\r
+                        buffer.sizeof_msg = sizeof(buffer);\r
 \r
-                    libvlc_log_iterator_next(_p_iter, &buffer, &ex);\r
-                    if( libvlc_exception_raised(&ex) )\r
-                    {\r
-                        NPN_SetException(this, libvlc_exception_get_message(&ex));\r
-                        libvlc_exception_clear(&ex);\r
-                        return INVOKERESULT_GENERIC_ERROR;\r
-                    }\r
-                    else\r
-                    {\r
-                        LibvlcMessageNPObject* message =\r
-                            static_cast<LibvlcMessageNPObject*>(NPN_CreateObject(_instance, RuntimeNPClass<LibvlcMessageNPObject>::getClass()));\r
-                        if( message )\r
+                        libvlc_log_iterator_next(_p_iter, &buffer, &ex);\r
+                        if( libvlc_exception_raised(&ex) )\r
                         {\r
-                            message->setMessage(buffer);\r
-                            OBJECT_TO_NPVARIANT(message, result);\r
-                            return INVOKERESULT_NO_ERROR;\r
+                            NPN_SetException(this, libvlc_exception_get_message(&ex));\r
+                            libvlc_exception_clear(&ex);\r
+                            return INVOKERESULT_GENERIC_ERROR;\r
+                        }\r
+                        else\r
+                        {\r
+                            LibvlcMessageNPObject* message =\r
+                                static_cast<LibvlcMessageNPObject*>(NPN_CreateObject(_instance, RuntimeNPClass<LibvlcMessageNPObject>::getClass()));\r
+                            if( message )\r
+                            {\r
+                                message->setMessage(buffer);\r
+                                OBJECT_TO_NPVARIANT(message, result);\r
+                                return INVOKERESULT_NO_ERROR;\r
+                            }\r
+                            return INVOKERESULT_OUT_OF_MEMORY;\r
                         }\r
-                        return INVOKERESULT_OUT_OF_MEMORY;\r
                     }\r
+                    return INVOKERESULT_GENERIC_ERROR;\r
                 }\r
-            default:\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -782,34 +839,40 @@ const int LibvlcMessagesNPObject::propertyCount = sizeof(LibvlcMessagesNPObject:
 \r
 enum LibvlcMessagesNPObjectPropertyIds\r
 {\r
-    ID_count,\r
+    ID_messages_count,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcMessagesNPObject::getProperty(int index, NPVariant &result)\r
 {\r
-    switch( index )\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
     {\r
-        case ID_count:\r
+        switch( index )\r
         {\r
-            libvlc_log_t *p_log = _p_vlclog->_p_log;\r
-            if( p_log )\r
+            case ID_messages_count:\r
             {\r
-                libvlc_exception_t ex;\r
-                libvlc_exception_init(&ex);\r
+                libvlc_log_t *p_log = p_plugin->getLog();\r
+                if( p_log )\r
+                {\r
+                    libvlc_exception_t ex;\r
+                    libvlc_exception_init(&ex);\r
 \r
-                INT32_TO_NPVARIANT(libvlc_log_count(p_log, &ex), result);\r
-                if( libvlc_exception_raised(&ex) )\r
+                    INT32_TO_NPVARIANT(libvlc_log_count(p_log, &ex), result);\r
+                    if( libvlc_exception_raised(&ex) )\r
+                    {\r
+                        NPN_SetException(this, libvlc_exception_get_message(&ex));\r
+                        libvlc_exception_clear(&ex);\r
+                        return INVOKERESULT_GENERIC_ERROR;\r
+                    }\r
+                }\r
+                else\r
                 {\r
-                    NPN_SetException(this, libvlc_exception_get_message(&ex));\r
-                    libvlc_exception_clear(&ex);\r
-                    return INVOKERESULT_GENERIC_ERROR;\r
+                    INT32_TO_NPVARIANT(0, result);\r
                 }\r
+                return INVOKERESULT_NO_ERROR;\r
             }\r
-            else\r
-            {\r
-                INT32_TO_NPVARIANT(0, result);\r
-            }\r
-            return INVOKERESULT_NO_ERROR;\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -826,59 +889,75 @@ const int LibvlcMessagesNPObject::methodCount = sizeof(LibvlcMessagesNPObject::m
 enum LibvlcMessagesNPObjectMethodIds\r
 {\r
     ID_messages_clear,\r
-    ID_iterator,\r
+    ID_messages_iterator,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcMessagesNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)\r
 {\r
-    libvlc_exception_t ex;\r
-    libvlc_exception_init(&ex);\r
-\r
-    switch( index )\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
     {\r
-        case ID_messages_clear:\r
-            if( argCount == 0 )\r
-            {\r
-                libvlc_log_t *p_log = _p_vlclog->_p_log;\r
-                if( p_log )\r
+        libvlc_exception_t ex;\r
+        libvlc_exception_init(&ex);\r
+\r
+        switch( index )\r
+        {\r
+            case ID_messages_clear:\r
+                if( argCount == 0 )\r
                 {\r
-                    libvlc_log_clear(p_log, &ex);\r
-                    if( libvlc_exception_raised(&ex) )\r
+                    libvlc_log_t *p_log = p_plugin->getLog();\r
+                    if( p_log )\r
                     {\r
-                        NPN_SetException(this, libvlc_exception_get_message(&ex));\r
-                        libvlc_exception_clear(&ex);\r
-                        return INVOKERESULT_GENERIC_ERROR;\r
+                        libvlc_log_clear(p_log, &ex);\r
+                        if( libvlc_exception_raised(&ex) )\r
+                        {\r
+                            NPN_SetException(this, libvlc_exception_get_message(&ex));\r
+                            libvlc_exception_clear(&ex);\r
+                            return INVOKERESULT_GENERIC_ERROR;\r
+                        }\r
                     }\r
+                    return INVOKERESULT_NO_ERROR;\r
                 }\r
-                return INVOKERESULT_NO_ERROR;\r
-            }\r
-            return INVOKERESULT_NO_SUCH_METHOD;\r
+                return INVOKERESULT_NO_SUCH_METHOD;\r
 \r
-        case ID_iterator:\r
-            if( argCount == 0 )\r
-            {\r
-                LibvlcMessageIteratorNPObject* iter =\r
-                    static_cast<LibvlcMessageIteratorNPObject*>(NPN_CreateObject(_instance, RuntimeNPClass<LibvlcMessageIteratorNPObject>::getClass()));\r
-                if( iter )\r
+            case ID_messages_iterator:\r
+                if( argCount == 0 )\r
                 {\r
-                    iter->setLog(_p_vlclog);\r
-                    OBJECT_TO_NPVARIANT(iter, result);\r
-                    return INVOKERESULT_NO_ERROR;\r
+                    LibvlcMessageIteratorNPObject* iter =\r
+                        static_cast<LibvlcMessageIteratorNPObject*>(NPN_CreateObject(_instance, RuntimeNPClass<LibvlcMessageIteratorNPObject>::getClass()));\r
+                    if( iter )\r
+                    {\r
+                        OBJECT_TO_NPVARIANT(iter, result);\r
+                        return INVOKERESULT_NO_ERROR;\r
+                    }\r
+                    return INVOKERESULT_OUT_OF_MEMORY;\r
                 }\r
-                return INVOKERESULT_OUT_OF_MEMORY;\r
-            }\r
-            return INVOKERESULT_NO_SUCH_METHOD;\r
+                return INVOKERESULT_NO_SUCH_METHOD;\r
 \r
-        default:\r
-            return INVOKERESULT_NO_SUCH_METHOD;\r
+            default:\r
+                ;\r
+        }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
 }\r
+\r
  \r
 /*\r
 ** implementation of libvlc message object\r
 */\r
 \r
+\r
+LibvlcLogNPObject::LibvlcLogNPObject(NPP instance, const NPClass *aClass) :\r
+    RuntimeNPObject(instance, aClass)\r
+{\r
+    _p_vlcmessages = static_cast<LibvlcMessagesNPObject*>(NPN_CreateObject(instance, RuntimeNPClass<LibvlcMessagesNPObject>::getClass()));\r
+};\r
+    \r
+LibvlcLogNPObject::~LibvlcLogNPObject()\r
+{\r
+    NPN_ReleaseObject(_p_vlcmessages);\r
+};\r
+\r
 const NPUTF8 * const LibvlcLogNPObject::propertyNames[] = \r
 {\r
     "messages",\r
@@ -889,8 +968,8 @@ const int LibvlcLogNPObject::propertyCount = sizeof(LibvlcLogNPObject::propertyN
 \r
 enum LibvlcLogNPObjectPropertyIds\r
 {\r
-    ID_messages,\r
-    ID_verbosity,\r
+    ID_log_messages,\r
+    ID_log_verbosity,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcLogNPObject::getProperty(int index, NPVariant &result)\r
@@ -903,14 +982,14 @@ RuntimeNPObject::InvokeResult LibvlcLogNPObject::getProperty(int index, NPVarian
 \r
         switch( index )\r
         {\r
-            case ID_messages:\r
+            case ID_log_messages:\r
             {\r
                 OBJECT_TO_NPVARIANT(NPN_RetainObject(_p_vlcmessages), result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_verbosity:\r
+            case ID_log_verbosity:\r
             {\r
-                if( _p_log )\r
+                if( p_plugin->getLog() )\r
                 {\r
                     INT32_TO_NPVARIANT(libvlc_get_log_verbosity(p_plugin->getVLC(),\r
                                                                     &ex), result);\r
@@ -928,6 +1007,8 @@ RuntimeNPObject::InvokeResult LibvlcLogNPObject::getProperty(int index, NPVarian
                 }\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -943,22 +1024,24 @@ RuntimeNPObject::InvokeResult LibvlcLogNPObject::setProperty(int index, const NP
 \r
         switch( index )\r
         {\r
-            case ID_verbosity:\r
+            case ID_log_verbosity:\r
                 if( isNumberValue(value) )\r
                 {\r
                     libvlc_instance_t* p_libvlc = p_plugin->getVLC();\r
+                    libvlc_log_t *p_log = p_plugin->getLog();\r
                     int verbosity = numberValue(value);\r
                     if( verbosity >= 0 )\r
                     {\r
-                        if( ! _p_log )\r
+                        if( ! p_log )\r
                         {\r
-                            _p_log = libvlc_log_open(p_libvlc, &ex);\r
+                            p_log = libvlc_log_open(p_libvlc, &ex);\r
                             if( libvlc_exception_raised(&ex) )\r
                             {\r
                                 NPN_SetException(this, libvlc_exception_get_message(&ex));\r
                                 libvlc_exception_clear(&ex);\r
                                 return INVOKERESULT_GENERIC_ERROR;\r
                             }\r
+                            p_plugin->setLog(p_log);\r
                         }\r
                         libvlc_set_log_verbosity(p_libvlc, (unsigned)verbosity, &ex);\r
                         if( libvlc_exception_raised(&ex) )\r
@@ -968,11 +1051,11 @@ RuntimeNPObject::InvokeResult LibvlcLogNPObject::setProperty(int index, const NP
                             return INVOKERESULT_GENERIC_ERROR;\r
                         }\r
                     }\r
-                    else if( _p_log )\r
+                    else if( p_log )\r
                     {\r
                         /* close log  when verbosity is set to -1 */\r
-                        libvlc_log_close(_p_log, &ex);\r
-                        _p_log = NULL;\r
+                        p_plugin->setLog(NULL);\r
+                        libvlc_log_close(p_log, &ex);\r
                         if( libvlc_exception_raised(&ex) )\r
                         {\r
                             NPN_SetException(this, libvlc_exception_get_message(&ex));\r
@@ -983,6 +1066,8 @@ RuntimeNPObject::InvokeResult LibvlcLogNPObject::setProperty(int index, const NP
                     return INVOKERESULT_NO_ERROR;\r
                 }\r
                 return INVOKERESULT_INVALID_VALUE;\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -995,23 +1080,146 @@ const NPUTF8 * const LibvlcLogNPObject::methodNames[] =
 \r
 const int LibvlcLogNPObject::methodCount = sizeof(LibvlcLogNPObject::methodNames)/sizeof(NPUTF8 *);\r
 \r
+/*\r
+** implementation of libvlc playlist items object\r
+*/\r
+\r
+const NPUTF8 * const LibvlcPlaylistItemsNPObject::propertyNames[] = \r
+{\r
+    "count",\r
+};\r
+\r
+const int LibvlcPlaylistItemsNPObject::propertyCount = sizeof(LibvlcPlaylistItemsNPObject::propertyNames)/sizeof(NPUTF8 *);\r
+\r
+enum LibvlcPlaylistItemsNPObjectPropertyIds\r
+{\r
+    ID_playlistitems_count,\r
+};\r
+\r
+RuntimeNPObject::InvokeResult LibvlcPlaylistItemsNPObject::getProperty(int index, NPVariant &result)\r
+{\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
+    {\r
+        libvlc_exception_t ex;\r
+        libvlc_exception_init(&ex);\r
+\r
+        switch( index )\r
+        {\r
+            case ID_playlistitems_count:\r
+            {\r
+                int val = libvlc_playlist_items_count(p_plugin->getVLC(), &ex);\r
+                if( libvlc_exception_raised(&ex) )\r
+                {\r
+                    NPN_SetException(this, libvlc_exception_get_message(&ex));\r
+                    libvlc_exception_clear(&ex);\r
+                    return INVOKERESULT_GENERIC_ERROR;\r
+                }\r
+                INT32_TO_NPVARIANT(val, result);\r
+                return INVOKERESULT_NO_ERROR;\r
+            }\r
+            default:\r
+                ;\r
+        }\r
+    }\r
+    return INVOKERESULT_GENERIC_ERROR;\r
+}\r
+\r
+const NPUTF8 * const LibvlcPlaylistItemsNPObject::methodNames[] =\r
+{\r
+    "clear",\r
+    "remove",\r
+};\r
+\r
+const int LibvlcPlaylistItemsNPObject::methodCount = sizeof(LibvlcPlaylistItemsNPObject::methodNames)/sizeof(NPUTF8 *);\r
+\r
+enum LibvlcPlaylistItemsNPObjectMethodIds\r
+{\r
+    ID_playlistitems_clear,\r
+    ID_playlistitems_remove,\r
+};\r
+\r
+RuntimeNPObject::InvokeResult LibvlcPlaylistItemsNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)\r
+{\r
+    VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata);\r
+    if( p_plugin )\r
+    {\r
+        libvlc_exception_t ex;\r
+        libvlc_exception_init(&ex);\r
+\r
+        switch( index )\r
+        {\r
+            case ID_playlistitems_clear:\r
+                if( argCount == 0 )\r
+                {\r
+                    libvlc_playlist_clear(p_plugin->getVLC(), &ex);\r
+                    if( libvlc_exception_raised(&ex) )\r
+                    {\r
+                        NPN_SetException(this, libvlc_exception_get_message(&ex));\r
+                        libvlc_exception_clear(&ex);\r
+                        return INVOKERESULT_GENERIC_ERROR;\r
+                    }\r
+                    else\r
+                    {\r
+                        VOID_TO_NPVARIANT(result);\r
+                        return INVOKERESULT_NO_ERROR;\r
+                    }\r
+                }\r
+                return INVOKERESULT_NO_SUCH_METHOD;\r
+            case ID_playlistitems_remove:\r
+                if( (argCount == 1) && isNumberValue(args[0]) )\r
+                {\r
+                    libvlc_playlist_delete_item(p_plugin->getVLC(), numberValue(args[0]), &ex);\r
+                    if( libvlc_exception_raised(&ex) )\r
+                    {\r
+                        NPN_SetException(this, libvlc_exception_get_message(&ex));\r
+                        libvlc_exception_clear(&ex);\r
+                        return INVOKERESULT_GENERIC_ERROR;\r
+                    }\r
+                    else\r
+                    {\r
+                        VOID_TO_NPVARIANT(result);\r
+                        return INVOKERESULT_NO_ERROR;\r
+                    }\r
+                }\r
+                return INVOKERESULT_NO_SUCH_METHOD;\r
+            default:\r
+                ;\r
+        }\r
+    }\r
+    return INVOKERESULT_GENERIC_ERROR;\r
+}\r
+\r
 /*\r
 ** implementation of libvlc playlist object\r
 */\r
 \r
 \r
+LibvlcPlaylistNPObject::LibvlcPlaylistNPObject(NPP instance, const NPClass *aClass) :\r
+    RuntimeNPObject(instance, aClass)\r
+{\r
+    _p_vlcplaylistitems = static_cast<LibvlcPlaylistItemsNPObject*>(NPN_CreateObject(instance, RuntimeNPClass<LibvlcPlaylistItemsNPObject>::getClass()));\r
+};\r
+    \r
+LibvlcPlaylistNPObject::~LibvlcPlaylistNPObject()\r
+{\r
+    NPN_ReleaseObject(_p_vlcplaylistitems);\r
+};\r
+\r
 const NPUTF8 * const LibvlcPlaylistNPObject::propertyNames[] = \r
 {\r
-    "itemCount",\r
+    "itemCount", /* deprecated */\r
     "isPlaying",\r
+    "items",\r
 };\r
 \r
 const int LibvlcPlaylistNPObject::propertyCount = sizeof(LibvlcPlaylistNPObject::propertyNames)/sizeof(NPUTF8 *);\r
 \r
 enum LibvlcPlaylistNPObjectPropertyIds\r
 {\r
-    ID_itemcount,\r
-    ID_isplaying,\r
+    ID_playlist_itemcount,\r
+    ID_playlist_isplaying,\r
+    ID_playlist_items,\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::getProperty(int index, NPVariant &result)\r
@@ -1024,7 +1232,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::getProperty(int index, NPV
 \r
         switch( index )\r
         {\r
-            case ID_itemcount:\r
+            case ID_playlist_itemcount: /* deprecated */\r
             {\r
                 int val = libvlc_playlist_items_count(p_plugin->getVLC(), &ex);\r
                 if( libvlc_exception_raised(&ex) )\r
@@ -1036,7 +1244,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::getProperty(int index, NPV
                 INT32_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_isplaying:\r
+            case ID_playlist_isplaying:\r
             {\r
                 int val = libvlc_playlist_isplaying(p_plugin->getVLC(), &ex);\r
                 if( libvlc_exception_raised(&ex) )\r
@@ -1048,6 +1256,13 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::getProperty(int index, NPV
                 BOOLEAN_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
+            case ID_playlist_items:\r
+            {\r
+                OBJECT_TO_NPVARIANT(NPN_RetainObject(_p_vlcplaylistitems), result);\r
+                return INVOKERESULT_NO_ERROR;\r
+            }\r
+            default:\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -1062,23 +1277,23 @@ const NPUTF8 * const LibvlcPlaylistNPObject::methodNames[] =
     "stop",\r
     "next",\r
     "prev",\r
-    "clear",\r
-    "removeItem"\r
+    "clear", /* deprecated */\r
+    "removeItem", /* deprecated */\r
 };\r
 \r
 const int LibvlcPlaylistNPObject::methodCount = sizeof(LibvlcPlaylistNPObject::methodNames)/sizeof(NPUTF8 *);\r
 \r
 enum LibvlcPlaylistNPObjectMethodIds\r
 {\r
-    ID_add,\r
-    ID_play,\r
-    ID_playItem,\r
-    ID_togglepause,\r
-    ID_stop,\r
-    ID_next,\r
-    ID_prev,\r
-    ID_clear,\r
-    ID_removeitem\r
+    ID_playlist_add,\r
+    ID_playlist_play,\r
+    ID_playlist_playItem,\r
+    ID_playlist_togglepause,\r
+    ID_playlist_stop,\r
+    ID_playlist_next,\r
+    ID_playlist_prev,\r
+    ID_playlist_clear,\r
+    ID_playlist_removeitem\r
 };\r
 \r
 RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result)\r
@@ -1091,7 +1306,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
 \r
         switch( index )\r
         {\r
-            case ID_add:\r
+            case ID_playlist_add:\r
             {\r
                 if( (argCount < 1) || (argCount > 3) )\r
                     return INVOKERESULT_NO_SUCH_METHOD;\r
@@ -1105,10 +1320,11 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     if( s )\r
                     {\r
                         url = p_plugin->getAbsoluteURL(s);\r
-                        delete s;\r
-                        if( ! url )\r
-                            // what happened ?\r
-                            return INVOKERESULT_GENERIC_ERROR;\r
+                        if( url )\r
+                            delete s;\r
+                        else\r
+                            // problem with combining url, use argument\r
+                            url = s;\r
                     }\r
                     else\r
                         return INVOKERESULT_OUT_OF_MEMORY;\r
@@ -1181,7 +1397,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     return INVOKERESULT_NO_ERROR;\r
                 }\r
             }\r
-            case ID_play:\r
+            case ID_playlist_play:\r
                 if( argCount == 0 )\r
                 {\r
                     libvlc_playlist_play(p_plugin->getVLC(), -1, 0, NULL, &ex);\r
@@ -1198,7 +1414,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     }\r
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
-            case ID_playItem:\r
+            case ID_playlist_playItem:\r
                 if( (argCount == 1) && isNumberValue(args[0]) )\r
                 {\r
                     libvlc_playlist_play(p_plugin->getVLC(), numberValue(args[0]), 0, NULL, &ex);\r
@@ -1215,7 +1431,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     }\r
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
-            case ID_togglepause:\r
+            case ID_playlist_togglepause:\r
                 if( argCount == 0 )\r
                 {\r
                     libvlc_playlist_pause(p_plugin->getVLC(), &ex);\r
@@ -1232,7 +1448,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     }\r
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
-            case ID_stop:\r
+            case ID_playlist_stop:\r
                 if( argCount == 0 )\r
                 {\r
                     libvlc_playlist_stop(p_plugin->getVLC(), &ex);\r
@@ -1249,7 +1465,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     }\r
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
-            case ID_next:\r
+            case ID_playlist_next:\r
                 if( argCount == 0 )\r
                 {\r
                     libvlc_playlist_next(p_plugin->getVLC(), &ex);\r
@@ -1266,7 +1482,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     }\r
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
-            case ID_prev:\r
+            case ID_playlist_prev:\r
                 if( argCount == 0 )\r
                 {\r
                     libvlc_playlist_prev(p_plugin->getVLC(), &ex);\r
@@ -1283,7 +1499,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     }\r
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
-            case ID_clear:\r
+            case ID_playlist_clear: /* deprecated */\r
                 if( argCount == 0 )\r
                 {\r
                     libvlc_playlist_clear(p_plugin->getVLC(), &ex);\r
@@ -1300,7 +1516,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                     }\r
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
-            case ID_removeitem:\r
+            case ID_playlist_removeitem: /* deprecated */\r
                 if( (argCount == 1) && isNumberValue(args[0]) )\r
                 {\r
                     libvlc_playlist_delete_item(p_plugin->getVLC(), numberValue(args[0]), &ex);\r
@@ -1318,7 +1534,7 @@ RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NP
                 }\r
                 return INVOKERESULT_NO_SUCH_METHOD;\r
             default:\r
-                return INVOKERESULT_NO_SUCH_METHOD;\r
+                ;\r
         }\r
     }\r
     return INVOKERESULT_GENERIC_ERROR;\r
@@ -1465,10 +1681,10 @@ const NPUTF8 * const LibvlcVideoNPObject::propertyNames[] =
 \r
 enum LibvlcVideoNPObjectPropertyIds\r
 {\r
-    ID_fullscreen,\r
-    ID_height,\r
-    ID_width,\r
-    ID_aspectratio\r
+    ID_video_fullscreen,\r
+    ID_video_height,\r
+    ID_video_width,\r
+    ID_video_aspectratio\r
 };\r
 \r
 const int LibvlcVideoNPObject::propertyCount = sizeof(LibvlcVideoNPObject::propertyNames)/sizeof(NPUTF8 *);\r
@@ -1491,7 +1707,7 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::getProperty(int index, NPVari
 \r
         switch( index )\r
         {\r
-            case ID_fullscreen:\r
+            case ID_video_fullscreen:\r
             {\r
                 int val = libvlc_get_fullscreen(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -1504,7 +1720,7 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::getProperty(int index, NPVari
                 BOOLEAN_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_height:\r
+            case ID_video_height:\r
             {\r
                 int val = libvlc_video_get_height(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -1517,7 +1733,7 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::getProperty(int index, NPVari
                 INT32_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_width:\r
+            case ID_video_width:\r
             {\r
                 int val = libvlc_video_get_width(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -1530,7 +1746,7 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::getProperty(int index, NPVari
                 INT32_TO_NPVARIANT(val, result);\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_aspectratio:\r
+            case ID_video_aspectratio:\r
             {\r
                 NPUTF8 *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex);\r
                 libvlc_input_free(p_input);\r
@@ -1570,7 +1786,7 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const
 \r
         switch( index )\r
         {\r
-            case ID_fullscreen:\r
+            case ID_video_fullscreen:\r
             {\r
                 if( ! NPVARIANT_IS_BOOLEAN(value) )\r
                 {\r
@@ -1589,7 +1805,7 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::setProperty(int index, const
                 }\r
                 return INVOKERESULT_NO_ERROR;\r
             }\r
-            case ID_aspectratio:\r
+            case ID_video_aspectratio:\r
             {\r
                 char *psz_aspect = NULL;\r
 \r
@@ -1629,7 +1845,7 @@ const NPUTF8 * const LibvlcVideoNPObject::methodNames[] =
 \r
 enum LibvlcVideoNPObjectMethodIds\r
 {\r
-    ID_togglefullscreen,\r
+    ID_video_togglefullscreen,\r
 };\r
 \r
 const int LibvlcVideoNPObject::methodCount = sizeof(LibvlcVideoNPObject::methodNames)/sizeof(NPUTF8 *);\r
@@ -1652,7 +1868,7 @@ RuntimeNPObject::InvokeResult LibvlcVideoNPObject::invoke(int index, const NPVar
 \r
         switch( index )\r
         {\r
-            case ID_togglefullscreen:\r
+            case ID_video_togglefullscreen:\r
                 if( argCount == 0 )\r
                 {\r
                     libvlc_toggle_fullscreen(p_input, &ex);\r