Push lots of copy/paste code into a macro, and en passant squash two small bugs.
authorJP Dinger <jpd@m2x.nl>
Fri, 27 Feb 2009 10:44:31 +0000 (11:44 +0100)
committerJean-Paul Saman <jean-paul.saman@m2x.nl>
Sat, 7 Mar 2009 16:00:18 +0000 (17:00 +0100)
Signed-off-by: Jean-Paul Saman <jean-paul.saman@m2x.nl>
projects/mozilla/control/npolibvlc.cpp

index cbd622a..989ebb4 100644 (file)
 #include "vlcplugin.h"
 #include "npolibvlc.h"
 
+/*
+** Local helper macros and function
+*/
 #define COUNTNAMES(a,b,c) const int a::b = sizeof(a::c)/sizeof(NPUTF8 *)
+#define RETURN_ON_EXCEPTION(ex) \
+    do { if( libvlc_exception_raised(&ex) ) \
+    { \
+        NPN_SetException(this, libvlc_exception_get_message(&ex)); \
+        libvlc_exception_clear(&ex); \
+        return INVOKERESULT_GENERIC_ERROR; \
+    } } while(false)
 
 /*
 ** implementation of libvlc root object
@@ -233,24 +243,14 @@ LibvlcAudioNPObject::getProperty(int index, NPVariant &result)
             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;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 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;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 INT32_TO_NPVARIANT(volume, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -258,32 +258,17 @@ LibvlcAudioNPObject::getProperty(int index, NPVariant &result)
             {
                 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;
-                }
+                RETURN_ON_EXCEPTION(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(ex);
                 INT32_TO_NPVARIANT(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(ex);
                 INT32_TO_NPVARIANT(channel, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -311,12 +296,7 @@ LibvlcAudioNPObject::setProperty(int index, const NPVariant &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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
                     return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_INVALID_VALUE;
@@ -325,12 +305,7 @@ LibvlcAudioNPObject::setProperty(int index, const NPVariant &value)
                 {
                     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(ex);
                     return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_INVALID_VALUE;
@@ -339,21 +314,11 @@ LibvlcAudioNPObject::setProperty(int index, const NPVariant &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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
                     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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
                     return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_INVALID_VALUE;
@@ -362,12 +327,7 @@ LibvlcAudioNPObject::setProperty(int index, const NPVariant &value)
                 {
                     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(ex);
                     return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_INVALID_VALUE;
@@ -406,17 +366,9 @@ LibvlcAudioNPObject::invoke(int index, const NPVariant *args,
                 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);
-                        return INVOKERESULT_GENERIC_ERROR;
-                    }
-                    else
-                    {
-                        VOID_TO_NPVARIANT(result);
-                        return INVOKERESULT_NO_ERROR;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
+                    VOID_TO_NPVARIANT(result);
+                    return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_NO_SUCH_METHOD;
             default:
@@ -488,12 +440,7 @@ LibvlcInputNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 DOUBLE_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -501,12 +448,7 @@ LibvlcInputNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 DOUBLE_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -514,12 +456,7 @@ LibvlcInputNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 DOUBLE_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -527,12 +464,7 @@ LibvlcInputNPObject::getProperty(int index, NPVariant &result)
             {
                 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;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 INT32_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -540,12 +472,7 @@ LibvlcInputNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 DOUBLE_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -553,12 +480,7 @@ LibvlcInputNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 DOUBLE_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -566,12 +488,7 @@ LibvlcInputNPObject::getProperty(int index, NPVariant &result)
             {
                 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;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 BOOLEAN_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -595,12 +512,7 @@ LibvlcInputNPObject::setProperty(int index, const NPVariant &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;
-        }
+        RETURN_ON_EXCEPTION(ex);
 
         switch( index )
         {
@@ -615,12 +527,7 @@ LibvlcInputNPObject::setProperty(int index, const NPVariant &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(ex);
                 return INVOKERESULT_NO_ERROR;
             }
             case ID_input_time:
@@ -638,12 +545,7 @@ LibvlcInputNPObject::setProperty(int index, const NPVariant &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(ex);
                 return INVOKERESULT_NO_ERROR;
             }
             case ID_input_rate:
@@ -661,12 +563,7 @@ LibvlcInputNPObject::setProperty(int index, const NPVariant &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(ex);
                 return INVOKERESULT_NO_ERROR;
             }
             default:
@@ -861,12 +758,7 @@ LibvlcMessageIteratorNPObject::getProperty(int index, NPVariant &result)
 
                     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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
                 }
                 else
                 {
@@ -915,26 +807,19 @@ LibvlcMessageIteratorNPObject::invoke(int index, const NPVariant *args,
                         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
+                        RETURN_ON_EXCEPTION(ex);
+
+                        LibvlcMessageNPObject* message =
+                            static_cast<LibvlcMessageNPObject*>(
+                            NPN_CreateObject(_instance, RuntimeNPClass<
+                            LibvlcMessageNPObject>::getClass()));
+                        if( message )
                         {
-                            LibvlcMessageNPObject* message =
-                                static_cast<LibvlcMessageNPObject*>(
-                                  NPN_CreateObject(_instance, RuntimeNPClass<
-                                  LibvlcMessageNPObject>::getClass()));
-                            if( message )
-                            {
-                                message->setMessage(buffer);
-                                OBJECT_TO_NPVARIANT(message, result);
-                                return INVOKERESULT_NO_ERROR;
-                            }
-                            return INVOKERESULT_OUT_OF_MEMORY;
+                            message->setMessage(buffer);
+                            OBJECT_TO_NPVARIANT(message, result);
+                            return INVOKERESULT_NO_ERROR;
                         }
+                        return INVOKERESULT_OUT_OF_MEMORY;
                     }
                     return INVOKERESULT_GENERIC_ERROR;
                 }
@@ -979,12 +864,7 @@ LibvlcMessagesNPObject::getProperty(int index, NPVariant &result)
                     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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
                 }
                 else
                 {
@@ -1032,12 +912,7 @@ LibvlcMessagesNPObject::invoke(int index, const NPVariant *args,
                     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_ON_EXCEPTION(ex);
                     }
                     return INVOKERESULT_NO_ERROR;
                 }
@@ -1121,12 +996,7 @@ LibvlcLogNPObject::getProperty(int index, NPVariant &result)
                 {
                     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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
                 }
                 else
                 {
@@ -1165,33 +1035,18 @@ LibvlcLogNPObject::setProperty(int index, const NPVariant &value)
                         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;
-                            }
+                            RETURN_ON_EXCEPTION(ex);
                             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;
-                        }
+                        RETURN_ON_EXCEPTION(ex);
                     }
                     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_ON_EXCEPTION(ex);
                     }
                     return INVOKERESULT_NO_ERROR;
                 }
@@ -1241,12 +1096,7 @@ LibvlcPlaylistItemsNPObject::getProperty(int index, NPVariant &result)
                 libvlc_playlist_lock(p_plugin->getVLC());
                 int val = libvlc_playlist_items_count(p_plugin->getVLC(), &ex);
                 libvlc_playlist_unlock(p_plugin->getVLC());
-                if( libvlc_exception_raised(&ex) )
-                {
-                    NPN_SetException(this, libvlc_exception_get_message(&ex));
-                    libvlc_exception_clear(&ex);
-                    return INVOKERESULT_GENERIC_ERROR;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 INT32_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -1287,17 +1137,9 @@ LibvlcPlaylistItemsNPObject::invoke(int index, const NPVariant *args,
                 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_ON_EXCEPTION(ex);
+                    VOID_TO_NPVARIANT(result);
+                    return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_NO_SUCH_METHOD;
             case ID_playlistitems_remove:
@@ -1305,17 +1147,9 @@ LibvlcPlaylistItemsNPObject::invoke(int index, const NPVariant *args,
                 {
                     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_ON_EXCEPTION(ex);
+                    VOID_TO_NPVARIANT(result);
+                    return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_NO_SUCH_METHOD;
             default:
@@ -1370,12 +1204,7 @@ LibvlcPlaylistNPObject::getProperty(int index, NPVariant &result)
                 libvlc_playlist_lock(p_plugin->getVLC());
                 int val = libvlc_playlist_items_count(p_plugin->getVLC(), &ex);
                 libvlc_playlist_unlock(p_plugin->getVLC());
-                if( libvlc_exception_raised(&ex) )
-                {
-                    NPN_SetException(this, libvlc_exception_get_message(&ex));
-                    libvlc_exception_clear(&ex);
-                    return INVOKERESULT_GENERIC_ERROR;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 INT32_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -1384,12 +1213,7 @@ LibvlcPlaylistNPObject::getProperty(int index, NPVariant &result)
                 libvlc_playlist_lock(p_plugin->getVLC());
                 int val = libvlc_playlist_isplaying(p_plugin->getVLC(), &ex);
                 libvlc_playlist_unlock(p_plugin->getVLC());
-                if( libvlc_exception_raised(&ex) )
-                {
-                    NPN_SetException(this, libvlc_exception_get_message(&ex));
-                    libvlc_exception_clear(&ex);
-                    return INVOKERESULT_GENERIC_ERROR;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 BOOLEAN_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -1537,33 +1361,17 @@ LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args,
                 }
                 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(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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
+                    VOID_TO_NPVARIANT(result);
+                    return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_NO_SUCH_METHOD;
             case ID_playlist_playItem:
@@ -1571,102 +1379,54 @@ LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args,
                 {
                     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;
-                    }
+                    RETURN_ON_EXCEPTION(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;
-                    }
+                    RETURN_ON_EXCEPTION(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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
+                    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;
-                    }
+                    RETURN_ON_EXCEPTION(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;
-                    }
+                    RETURN_ON_EXCEPTION(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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
+                    VOID_TO_NPVARIANT(result);
+                    return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_NO_SUCH_METHOD;
             case ID_playlist_removeitem: /* deprecated */
@@ -1674,17 +1434,9 @@ LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args,
                 {
                     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_ON_EXCEPTION(ex);
+                    VOID_TO_NPVARIANT(result);
+                    return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_NO_SUCH_METHOD;
             default:
@@ -1862,12 +1614,7 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
         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;
-        }
+        RETURN_ON_EXCEPTION(ex);
 
         switch( index )
         {
@@ -1875,12 +1622,7 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
             {
                 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;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 BOOLEAN_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -1888,12 +1630,7 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 INT32_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -1901,12 +1638,7 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 INT32_TO_NPVARIANT(val, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -1914,12 +1646,7 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 if( !psz_aspect )
                     return INVOKERESULT_GENERIC_ERROR;
 
@@ -1930,12 +1657,7 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 INT32_TO_NPVARIANT(i_spu, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -1943,12 +1665,7 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
             {
                 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(ex);
                 if( !psz_geometry )
                     return INVOKERESULT_GENERIC_ERROR;
 
@@ -1959,12 +1676,7 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
             {
                 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;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 INT32_TO_NPVARIANT(i_page, result);
                 return INVOKERESULT_NO_ERROR;
             }
@@ -1985,12 +1697,7 @@ LibvlcVideoNPObject::setProperty(int index, const NPVariant &value)
         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;
-        }
+        RETURN_ON_EXCEPTION(ex);
 
         switch( index )
         {
@@ -2006,12 +1713,7 @@ LibvlcVideoNPObject::setProperty(int index, const NPVariant &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;
-                }
+                RETURN_ON_EXCEPTION(ex);
                 return INVOKERESULT_NO_ERROR;
             }
             case ID_video_aspectratio:
@@ -2034,13 +1736,8 @@ LibvlcVideoNPObject::setProperty(int index, const NPVariant &value)
                 libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex);
                 free(psz_aspect);
                 libvlc_media_player_release(p_md);
+                RETURN_ON_EXCEPTION(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:
@@ -2050,12 +1747,8 @@ LibvlcVideoNPObject::setProperty(int index, const NPVariant &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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
+
                     return INVOKERESULT_NO_ERROR;
                 }
                 libvlc_media_player_release(p_md);
@@ -2081,13 +1774,8 @@ LibvlcVideoNPObject::setProperty(int index, const NPVariant &value)
                 libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex);
                 free(psz_geometry);
                 libvlc_media_player_release(p_md);
+                RETURN_ON_EXCEPTION(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:
@@ -2097,12 +1785,8 @@ LibvlcVideoNPObject::setProperty(int index, const NPVariant &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;
-                    }
+                    RETURN_ON_EXCEPTION(ex);
+
                     return INVOKERESULT_NO_ERROR;
                 }
                 libvlc_media_player_release(p_md);
@@ -2139,12 +1823,7 @@ LibvlcVideoNPObject::invoke(int index, const NPVariant *args,
         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;
-        }
+        RETURN_ON_EXCEPTION(ex);
 
         switch( index )
         {
@@ -2153,27 +1832,9 @@ LibvlcVideoNPObject::invoke(int index, const NPVariant *args,
                 {
                     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;
+                    RETURN_ON_EXCEPTION(ex);
+                    VOID_TO_NPVARIANT(result);
+                    return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_NO_SUCH_METHOD;
             case ID_video_toggleteletext:
@@ -2181,27 +1842,9 @@ LibvlcVideoNPObject::invoke(int index, const NPVariant *args,
                 {
                     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;
-                    }
-                }
-                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;
+                    RETURN_ON_EXCEPTION(ex);
+                    VOID_TO_NPVARIANT(result);
+                    return INVOKERESULT_NO_ERROR;
                 }
                 return INVOKERESULT_NO_SUCH_METHOD;
             default: