]> git.sesse.net Git - vlc/blobdiff - modules/control/http/rpn.c
Change default aspect to 16:9.
[vlc] / modules / control / http / rpn.c
index bec30bb9eceb720244961c7bbe066d875d3c3a98..eb7aeee7b79d13e4e766f55e5c1a00bf6fd695e0 100644 (file)
 #endif
 
 #include "http.h"
-#include "vlc_url.h"
-#include "vlc_meta.h"
-#include "vlc_strings.h"
+#include <vlc_url.h>
+#include <vlc_meta.h>
+#include <vlc_strings.h>
 
 static vlc_object_t *GetVLCObject( intf_thread_t *p_intf,
                                    const char *psz_object,
                                    bool *pb_need_release )
 {
     intf_sys_t    *p_sys = p_intf->p_sys;
-    int i_object_type = 0;
     vlc_object_t *p_object = NULL;
     *pb_need_release = false;
 
     if( !strcmp( psz_object, "VLC_OBJECT_LIBVLC" ) )
         p_object = VLC_OBJECT(p_intf->p_libvlc);
-    else if( !strcmp( psz_object, "VLC_OBJECT_INTF" ) )
-        p_object = VLC_OBJECT(p_intf);
     else if( !strcmp( psz_object, "VLC_OBJECT_PLAYLIST" ) )
         p_object = VLC_OBJECT(p_sys->p_playlist);
     else if( !strcmp( psz_object, "VLC_OBJECT_INPUT" ) )
         p_object = VLC_OBJECT(p_sys->p_input);
-    else if( !strcmp( psz_object, "VLC_OBJECT_VOUT" ) )
-        i_object_type = VLC_OBJECT_VOUT;
-    else if( !strcmp( psz_object, "VLC_OBJECT_AOUT" ) )
-        i_object_type = VLC_OBJECT_AOUT;
-    else
-        msg_Warn( p_intf, "unknown object type (%s)", psz_object );
-
-    if( p_object == NULL && i_object_type )
+    else if( p_sys->p_input )
     {
-        *pb_need_release = true;
-        p_object = vlc_object_find( p_intf, i_object_type, FIND_ANYWHERE );
+        if( !strcmp( psz_object, "VLC_OBJECT_VOUT" ) )
+            p_object = VLC_OBJECT( input_GetVout( p_sys->p_input ) );
+        else if( !strcmp( psz_object, "VLC_OBJECT_AOUT" ) )
+            p_object = VLC_OBJECT( input_GetAout( p_sys->p_input ) );
+        if( p_object )
+            *pb_need_release = true;
     }
+    else
+        msg_Warn( p_intf, "unknown object type (%s)", psz_object );
 
     return p_object;
 }
@@ -100,7 +96,6 @@ char *SSPop( rpn_stack_t *st )
 int SSPopN( rpn_stack_t *st, mvar_t  *vars )
 {
     char *name;
-    char *value;
 
     char *end;
     int  i;
@@ -109,7 +104,7 @@ int SSPopN( rpn_stack_t *st, mvar_t  *vars )
     i = strtol( name, &end, 0 );
     if( end == name )
     {
-        value = mvar_GetValue( vars, name );
+        const char *value = mvar_GetValue( vars, name );
         i = atoi( value );
     }
     free( name );
@@ -169,7 +164,7 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
         /* 1. Integer function */
         if( !strcmp( s, "!" ) )
         {
-            SSPushN( st, ~SSPopN( st, vars ) );
+            SSPushN( st, !SSPopN( st, vars ) );
         }
         else if( !strcmp( s, "^" ) )
         {
@@ -348,7 +343,7 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
         }
         else if( !strcmp( s, "url_extract" ) )
         {
-            char *url = mvar_GetValue( vars, "url_value" );
+            const char *url = mvar_GetValue( vars, "url_value" );
             char *name = SSPop( st );
             char *value = ExtractURIString( url, name );
             if( value != NULL )
@@ -365,12 +360,13 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
         else if( !strcmp( s, "url_encode" ) )
         {
             char *url = SSPop( st );
-            char *value = vlc_UrlEncode( url );
+            char *value = encode_URI_component( url );
             free( url );
             SSPush( st, value );
             free( value );
         }
-        else if( !strcmp( s, "xml_encode" ) )
+        else if( !strcmp( s, "xml_encode" )
+              || !strcmp( s, "htmlspecialchars" ) )
         {
             char *url = SSPop( st );
             char *value = convert_xml_special_chars( url );
@@ -423,17 +419,6 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
             free( psz_src );
             free( psz_dest );
         }
-        else if( !strcmp( s, "htmlspecialchars" ) )
-        {
-            char *psz_src = SSPop( st );
-            char *psz_dest;
-
-            psz_dest = convert_xml_special_chars( psz_src );
-
-            SSPush( st, psz_dest );
-            free( psz_src );
-            free( psz_dest );
-        }
         else if( !strcmp( s, "realpath" ) )
         {
             char *psz_src = SSPop( st );
@@ -483,7 +468,7 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
         else if( !strcmp( s, "value" ) )
         {
             char *name  = SSPop( st );
-            char *value = mvar_GetValue( vars, name );
+            const char *value = mvar_GetValue( vars, name );
 
             SSPush( st, value );
 
@@ -495,31 +480,33 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
             int i_id = SSPopN( st, vars );
             int i_ret;
 
+            playlist_Lock( p_sys->p_playlist );
             i_ret = playlist_Control( p_sys->p_playlist, PLAYLIST_VIEWPLAY,
-                                      true, NULL,
+                                      pl_Locked, NULL,
                                       playlist_ItemGetById( p_sys->p_playlist,
-                                      i_id, true ) );
+                                      i_id ) );
+            playlist_Unlock( p_sys->p_playlist );
             msg_Dbg( p_intf, "requested playlist item: %i", i_id );
             SSPushN( st, i_ret );
         }
         else if( !strcmp( s, "vlc_stop" ) )
         {
-            playlist_Control( p_sys->p_playlist, PLAYLIST_STOP, true );
+            playlist_Control( p_sys->p_playlist, PLAYLIST_STOP, pl_Unlocked );
             msg_Dbg( p_intf, "requested playlist stop" );
         }
         else if( !strcmp( s, "vlc_pause" ) )
         {
-            playlist_Control( p_sys->p_playlist, PLAYLIST_PAUSE, true );
+            playlist_Control( p_sys->p_playlist, PLAYLIST_PAUSE, pl_Unlocked );
             msg_Dbg( p_intf, "requested playlist pause" );
         }
         else if( !strcmp( s, "vlc_next" ) )
         {
-            playlist_Control( p_sys->p_playlist, PLAYLIST_SKIP, true, 1 );
+            playlist_Control( p_sys->p_playlist, PLAYLIST_SKIP, pl_Unlocked, 1 );
             msg_Dbg( p_intf, "requested playlist next" );
         }
         else if( !strcmp( s, "vlc_previous" ) )
         {
-            playlist_Control( p_sys->p_playlist, PLAYLIST_SKIP, true, -1 );
+            playlist_Control( p_sys->p_playlist, PLAYLIST_SKIP, pl_Unlocked, -1 );
             msg_Dbg( p_intf, "requested playlist previous" );
         }
         else if( !strcmp( s, "vlc_seek" ) )
@@ -627,7 +614,7 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
                 case VLC_VAR_INTEGER:
                 case VLC_VAR_HOTKEY:
                     val.i_int = SSPopN( st, vars );
-                    msg_Dbg( p_intf, "requested %s var change: %s->%d",
+                    msg_Dbg( p_intf, "requested %s var change: %s->%"PRIu64,
                              psz_object, psz_variable, val.i_int );
                     break;
                 case VLC_VAR_STRING:
@@ -654,8 +641,7 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
 
                 if( !b_error )
                     var_Set( p_object, psz_variable, val );
-                if( psz_value != NULL )
-                    free( psz_value );
+                free( psz_value );
             }
             else
                 msg_Warn( p_intf, "vlc_var_set called without an object" );
@@ -824,8 +810,7 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
             }
             i_result = config_SaveConfigFile( p_intf, psz_module );
 
-            if( psz_module != NULL )
-                free( psz_module );
+            free( psz_module );
             SSPushN( st, i_result );
         }
         else if( !strcmp( s, "vlc_config_reset" ) )
@@ -852,12 +837,21 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
             {
                 i_ret = playlist_AddInput( p_sys->p_playlist, p_input,
                                    PLAYLIST_APPEND, PLAYLIST_END, true,
-                                   false);
-                vlc_gc_decref( p_input );
+                                   pl_Unlocked );
                 if( i_ret == VLC_SUCCESS )
+                {
+                    playlist_item_t *p_item;
                     msg_Dbg( p_intf, "requested mrl add: %s", mrl );
+                    playlist_Lock( p_sys->p_playlist );
+                    p_item = playlist_ItemGetByInput( p_sys->p_playlist,
+                                                      p_input );
+                    if( p_item )
+                        i_ret = p_item->i_id;
+                    playlist_Unlock( p_sys->p_playlist );
+                }
                 else
                     msg_Warn( p_intf, "adding mrl %s failed", mrl );
+                vlc_gc_decref( p_input );
             }
             free( psz_uri );
             SSPushN( st, i_ret );
@@ -867,18 +861,19 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
         }
         else if( !strcmp( s, "playlist_empty" ) )
         {
-            playlist_Clear( p_sys->p_playlist, false );
+            playlist_Clear( p_sys->p_playlist, pl_Unlocked );
             msg_Dbg( p_intf, "requested playlist empty" );
         }
         else if( !strcmp( s, "playlist_delete" ) )
         {
             int i_id = SSPopN( st, vars );
+            playlist_Lock( p_sys->p_playlist );
             playlist_item_t *p_item = playlist_ItemGetById( p_sys->p_playlist,
-                                                            i_id, false );
+                                                            i_id );
             if( p_item )
             {
                 playlist_DeleteFromInput( p_sys->p_playlist,
-                                          p_item->p_input->i_id, false );
+                                          p_item->p_input, pl_Locked );
                 msg_Dbg( p_intf, "requested playlist delete: %d", i_id );
             }
             else
@@ -886,6 +881,7 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
                 msg_Dbg( p_intf, "couldn't find playlist item to delete (%d)",
                          i_id );
             }
+            playlist_Unlock( p_sys->p_playlist );
         }
         else if( !strcmp( s, "playlist_move" ) )
         {
@@ -946,38 +942,38 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
             char *psz_vol = SSPop( st );
             int i_value;
             audio_volume_t i_volume;
-            aout_VolumeGet( p_intf, &i_volume );
+            aout_VolumeGet( p_sys->p_playlist, &i_volume );
             if( psz_vol[0] == '+' )
             {
                 i_value = atoi( psz_vol );
                 if( (i_volume + i_value) > AOUT_VOLUME_MAX )
-                    aout_VolumeSet( p_intf, AOUT_VOLUME_MAX );
+                    aout_VolumeSet( p_sys->p_playlist, AOUT_VOLUME_MAX );
                 else
-                    aout_VolumeSet( p_intf, i_volume + i_value );
+                    aout_VolumeSet( p_sys->p_playlist, i_volume + i_value );
             }
             else if( psz_vol[0] == '-' )
             {
                 i_value = atoi( psz_vol );
                 if( (i_volume + i_value) < AOUT_VOLUME_MIN )
-                    aout_VolumeSet( p_intf, AOUT_VOLUME_MIN );
+                    aout_VolumeSet( p_sys->p_playlist, AOUT_VOLUME_MIN );
                 else
-                    aout_VolumeSet( p_intf, i_volume + i_value );
+                    aout_VolumeSet( p_sys->p_playlist, i_volume + i_value );
             }
             else if( strstr( psz_vol, "%") != NULL )
             {
                 i_value = atoi( psz_vol );
                 if( i_value < 0 ) i_value = 0;
                 if( i_value > 400 ) i_value = 400;
-                aout_VolumeSet( p_intf, (i_value * (AOUT_VOLUME_MAX - AOUT_VOLUME_MIN))/400+AOUT_VOLUME_MIN);
+                aout_VolumeSet( p_sys->p_playlist, (i_value * (AOUT_VOLUME_MAX - AOUT_VOLUME_MIN))/400+AOUT_VOLUME_MIN);
             }
             else
             {
                 i_value = atoi( psz_vol );
                 if( i_value > AOUT_VOLUME_MAX ) i_value = AOUT_VOLUME_MAX;
                 if( i_value < AOUT_VOLUME_MIN ) i_value = AOUT_VOLUME_MIN;
-                aout_VolumeSet( p_intf, i_value );
+                aout_VolumeSet( p_sys->p_playlist, i_value );
             }
-            aout_VolumeGet( p_intf, &i_volume );
+            aout_VolumeGet( p_sys->p_playlist, &i_volume );
             free( psz_vol );
         }
         else if( !strcmp( s, "vlc_get_meta" ) )
@@ -1005,6 +1001,54 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
                 {
                     psz_val = input_item_GetGenre( p_item );
                 }
+                else if( !strcmp( psz_meta, "COPYRIGHT" ) )
+                {
+                     psz_val = input_item_GetCopyright( p_item );
+                }
+                else if( !strcmp( psz_meta, "TRACK_NUMBER" ) )
+                {
+                    psz_val = input_item_GetTrackNum( p_item );
+                }
+                else if( !strcmp( psz_meta, "DESCRIPTION" ) )
+                {
+                    psz_val = input_item_GetDescription( p_item );
+                }
+                else if( !strcmp( psz_meta, "RATING" ) )
+                {
+                    psz_val = input_item_GetRating( p_item );
+                }
+                else if( !strcmp( psz_meta, "DATE" ) )
+                {
+                    psz_val = input_item_GetDate( p_item );
+                }
+                else if( !strcmp( psz_meta, "URL" ) )
+                {
+                    psz_val = input_item_GetURL( p_item );
+                }
+                else if( !strcmp( psz_meta, "LANGUAGE" ) )
+                {
+                    psz_val = input_item_GetLanguage( p_item );
+                }
+                else if( !strcmp( psz_meta, "NOW_PLAYING" ) )
+                {
+                    psz_val = input_item_GetNowPlaying( p_item );
+                }
+                else if( !strcmp( psz_meta, "PUBLISHER" ) )
+                {
+                    psz_val = input_item_GetPublisher( p_item );
+                }
+                else if( !strcmp( psz_meta, "ENCODED_BY" ) )
+                {
+                    psz_val = input_item_GetEncodedBy( p_item );
+                }
+                else if( !strcmp( psz_meta, "ART_URL" ) )
+                {
+                    psz_val = input_item_GetEncodedBy( p_item );
+                }
+                else if( !strcmp( psz_meta, "TRACK_ID" ) )
+                {
+                    psz_val = input_item_GetTrackID( p_item );
+                }
 #undef p_item
             }
             if( psz_val == NULL ) psz_val = strdup( "" );
@@ -1030,9 +1074,9 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
             while( strcmp( psz_elt = SSPop( st ), "" )
                    && strcmp( psz_elt, ";" ) )
             {
-                char *psz_buf =
-                    (char *)malloc( strlen( psz_cmd ) + strlen( psz_elt ) + 2 );
-                sprintf( psz_buf, "%s %s", psz_cmd, psz_elt );
+                char* psz_buf;
+                if( asprintf( &psz_buf, "%s %s", psz_cmd, psz_elt ) == -1 )
+                    psz_buf = NULL;
                 free( psz_cmd );
                 free( psz_elt );
                 psz_cmd = psz_buf;
@@ -1047,11 +1091,9 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
             }
             else
             {
-                psz_error = malloc( strlen(vlm_answer->psz_name) +
-                                    strlen(vlm_answer->psz_value) +
-                                    strlen( " : ") + 1 );
-                sprintf( psz_error , "%s : %s" , vlm_answer->psz_name,
-                                                 vlm_answer->psz_value );
+                if( asprintf( &psz_error , "%s : %s" , vlm_answer->psz_name,
+                              vlm_answer->psz_value ) == -1 )
+                    psz_error = NULL;
             }
 
             mvar_AppendNewVar( vars, "vlm_error", psz_error );
@@ -1068,13 +1110,10 @@ void EvaluateRPN( intf_thread_t *p_intf, mvar_t  *vars,
         {
             if( p_sys->p_input )
             {
-                vout_thread_t *p_vout;
-                p_vout = vlc_object_find( p_sys->p_input,
-                                          VLC_OBJECT_VOUT, FIND_CHILD );
-
+                vout_thread_t *p_vout = input_GetVout( p_sys->p_input );
                 if( p_vout )
                 {
-                    vout_Control( p_vout, VOUT_SNAPSHOT );
+                    var_TriggerCallback( p_vout, "video-snapshot" );
                     vlc_object_release( p_vout );
                     msg_Dbg( p_intf, "requested snapshot" );
                 }