X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fhttp%2Fmacro.c;h=e8b0b307e42dd61450569397235d6da66a53c65a;hb=449fd28aaf007c6411251dae9d0dbfdc65b135d1;hp=46b3f2fc1895f2d9dd15beb80ec064b53e3c3747;hpb=4413d7506da4da060e4d9957c5632081ca4b09bb;p=vlc diff --git a/modules/control/http/macro.c b/modules/control/http/macro.c index 46b3f2fc18..e8b0b307e4 100644 --- a/modules/control/http/macro.c +++ b/modules/control/http/macro.c @@ -22,11 +22,15 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include "http.h" #include "macros.h" +#include "vlc_url.h" -int E_(MacroParse)( macro_t *m, char *psz_src ) +static int MacroParse( macro_t *m, char *psz_src ) { char *dup = strdup( (char *)psz_src ); char *src = dup; @@ -106,14 +110,14 @@ int E_(MacroParse)( macro_t *m, char *psz_src ) #undef EXTRACT } -void E_(MacroClean)( macro_t *m ) +static void MacroClean( macro_t *m ) { free( m->id ); free( m->param1 ); free( m->param2 ); } -int E_(StrToMacroType)( char *name ) +static int StrToMacroType( const char *name ) { int i; @@ -131,7 +135,7 @@ int E_(StrToMacroType)( char *name ) return MVLC_UNKNOWN; } -void E_(MacroDo)( httpd_file_sys_t *p_args, +static void MacroDo( httpd_file_sys_t *p_args, macro_t *m, char *p_request, int i_request, char **pp_data, int *pi_data, @@ -166,7 +170,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, } \ } - switch( E_(StrToMacroType)( m->id ) ) + switch( StrToMacroType( m->id ) ) { case MVLC_CONTROL: if( i_request <= 0 ) @@ -179,7 +183,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, msg_Warn( p_intf, "unauthorized control=%s", control ); break; } - switch( E_(StrToMacroType)( control ) ) + switch( StrToMacroType( control ) ) { case MVLC_PLAY: { @@ -195,26 +199,31 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, msg_Dbg( p_intf, "requested playlist play" ); break; } - playlist_Control( p_sys->p_playlist, PLAYLIST_ITEMPLAY, + playlist_Control( p_sys->p_playlist, PLAYLIST_VIEWPLAY, + true, NULL, playlist_ItemGetById( p_sys->p_playlist, - i_item ) ); + i_item, true ) ); msg_Dbg( p_intf, "requested playlist item: %i", i_item ); break; } case MVLC_STOP: - playlist_Control( p_sys->p_playlist, PLAYLIST_STOP ); + playlist_Control( p_sys->p_playlist, PLAYLIST_STOP, + true ); msg_Dbg( p_intf, "requested playlist stop" ); break; case MVLC_PAUSE: - playlist_Control( p_sys->p_playlist, PLAYLIST_PAUSE ); + playlist_Control( p_sys->p_playlist, PLAYLIST_PAUSE, + true ); msg_Dbg( p_intf, "requested playlist pause" ); break; case MVLC_NEXT: - playlist_Control( p_sys->p_playlist, PLAYLIST_SKIP, 1 ); + playlist_Control( p_sys->p_playlist, PLAYLIST_SKIP, + true, 1 ); msg_Dbg( p_intf, "requested playlist next" ); break; case MVLC_PREVIOUS: - playlist_Control( p_sys->p_playlist, PLAYLIST_SKIP, -1 ); + playlist_Control( p_sys->p_playlist, PLAYLIST_SKIP, + true, -1 ); msg_Dbg( p_intf, "requested playlist previous" ); break; case MVLC_FULLSCREEN: @@ -236,7 +245,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, { char value[30]; E_(ExtractURIValue)( p_request, "seek_value", value, 30 ); - E_(DecodeEncodedURI)( value ); + decode_URI( value ); E_(HandleSeek)( p_intf, value ); break; } @@ -248,7 +257,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, E_(ExtractURIValue)( p_request, "value", vol, 8 ); aout_VolumeGet( p_intf, &i_volume ); - E_(DecodeEncodedURI)( vol ); + decode_URI( vol ); if( vol[0] == '+' ) { @@ -301,30 +310,52 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, /* playlist management */ case MVLC_ADD: { - char mrl[1024], psz_name[1024]; - playlist_item_t *p_item; + char mrl[1024], psz_name[1024], tmp[1024]; + char *p, *str; + input_item_t *p_input; - E_(ExtractURIValue)( p_request, "mrl", mrl, 1024 ); - E_(DecodeEncodedURI)( mrl ); + E_(ExtractURIValue)( p_request, "mrl", tmp, 1024 ); + decode_URI( tmp ); E_(ExtractURIValue)( p_request, "name", psz_name, 1024 ); - E_(DecodeEncodedURI)( psz_name ); + decode_URI( psz_name ); if( !*psz_name ) { - memcpy( psz_name, mrl, 1024 ); + memcpy( psz_name, tmp, 1024 ); + } + /* addslashes for backward compatibility with the old + * http intf */ + p = mrl; str = tmp; + while( *str != '\0' ) + { + if( *str == '"' || *str == '\'' || *str == '\\' ) + { + *p++ = '\\'; + } + *p++ = *str; + str++; } - p_item = E_(MRLParse)( p_intf, mrl, psz_name ); + *p = '\0'; + + p_input = E_(MRLParse)( p_intf, mrl, psz_name ); - if( !p_item || !p_item->input.psz_uri || - !*p_item->input.psz_uri ) + char *psz_uri = input_item_GetURI( p_input ); + if( !p_input || !psz_uri || !*psz_uri ) { msg_Dbg( p_intf, "invalid requested mrl: %s", mrl ); } else { - playlist_AddItem( p_sys->p_playlist, p_item, - PLAYLIST_APPEND, PLAYLIST_END ); - msg_Dbg( p_intf, "requested mrl add: %s", mrl ); + int i_ret = playlist_AddInput( p_sys->p_playlist, + p_input, + PLAYLIST_APPEND, PLAYLIST_END, true, + false); + vlc_gc_decref( p_input ); + if( i_ret == VLC_SUCCESS ) + msg_Dbg( p_intf, "requested mrl add: %s", mrl ); + else + msg_Warn( p_intf, "adding mrl %s failed", mrl ); } + free( psz_uri ); break; } @@ -351,14 +382,15 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, int i; for( i = 0; i < i_nb_items; i++ ) { - playlist_LockDelete( p_sys->p_playlist, p_items[i] ); + playlist_DeleteFromInput( p_sys->p_playlist, + p_items[i], false ); msg_Dbg( p_intf, "requested playlist delete: %d", p_items[i] ); p_items[i] = -1; } } - if( p_items ) free( p_items ); + free( p_items ); break; } case MVLC_KEEP: @@ -380,28 +412,32 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, i_nb_items++; } - for( i = p_sys->p_playlist->i_size - 1 ; i >= 0; i-- ) + for( i = p_sys->p_playlist->items.i_size - 1 ; i >= 0; i-- ) { /* Check if the item is in the keep list */ for( j = 0 ; j < i_nb_items ; j++ ) { if( p_items[j] == - p_sys->p_playlist->pp_items[i]->input.i_id ) break; + ARRAY_VAL(p_sys->p_playlist->items,i) + ->i_id) + break; } if( j == i_nb_items ) { - playlist_LockDelete( p_sys->p_playlist, p_sys->p_playlist->pp_items[i]->input.i_id ); + playlist_DeleteFromInput( p_sys->p_playlist, + p_sys->p_playlist->items.p_elems[i]->i_id, + false ); msg_Dbg( p_intf, "requested playlist delete: %d", i ); } } - if( p_items ) free( p_items ); + free( p_items ); break; } case MVLC_EMPTY: { - playlist_LockClear( p_sys->p_playlist ); + playlist_Clear( p_sys->p_playlist, false ); msg_Dbg( p_intf, "requested playlist empty" ); break; } @@ -423,8 +459,9 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, if( !strcmp( type , "title" ) ) { - playlist_RecursiveNodeSort( p_sys->p_playlist, /*playlist_ItemGetById( p_sys->p_playlist, i_item ),*/ - p_sys->p_playlist->pp_views[0]->p_root, + playlist_RecursiveNodeSort( p_sys->p_playlist, + /* Ugly hack,but not worse than before ... */ + p_sys->p_playlist->p_root_onelevel, SORT_TITLE_NODES_FIRST, ( i_order == 0 ) ? ORDER_NORMAL : ORDER_REVERSE ); msg_Dbg( p_intf, "requested playlist sort by title (%d)" , i_order ); @@ -432,15 +469,15 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, else if( !strcmp( type , "author" ) ) { playlist_RecursiveNodeSort( p_sys->p_playlist, /*playlist_ItemGetById( p_sys->p_playlist, i_item ),*/ - p_sys->p_playlist->pp_views[0]->p_root, - SORT_AUTHOR, + p_sys->p_playlist->p_root_onelevel, + SORT_ARTIST, ( i_order == 0 ) ? ORDER_NORMAL : ORDER_REVERSE ); msg_Dbg( p_intf, "requested playlist sort by author (%d)" , i_order ); } else if( !strcmp( type , "shuffle" ) ) { playlist_RecursiveNodeSort( p_sys->p_playlist, /*playlist_ItemGetById( p_sys->p_playlist, i_item ),*/ - p_sys->p_playlist->pp_views[0]->p_root, + p_sys->p_playlist->p_root_onelevel, SORT_RANDOM, ( i_order == 0 ) ? ORDER_NORMAL : ORDER_REVERSE ); msg_Dbg( p_intf, "requested playlist shuffle"); @@ -458,6 +495,8 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, E_(ExtractURIValue)( p_request, "psz_newpos", psz_newpos, 6 ); i_pos = atoi( psz_pos ); i_newpos = atoi( psz_newpos ); + /* FIXME FIXME TODO TODO XXX XXX + ( duplicate from rpn.c ) if ( i_pos < i_newpos ) { playlist_Move( p_sys->p_playlist, i_pos, i_newpos + 1 ); @@ -467,6 +506,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, playlist_Move( p_sys->p_playlist, i_pos, i_newpos ); } msg_Dbg( p_intf, "requested move playlist item %d to %d", i_pos, i_newpos); + FIXME FIXME TODO TODO XXX XXX */ break; } @@ -487,7 +527,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, case MVLC_SHUTDOWN: { msg_Dbg( p_intf, "requested shutdown" ); - p_intf->p_vlc->b_die = VLC_TRUE; + vlc_object_kill( p_intf->p_libvlc ); break; } /* vlm */ @@ -514,7 +554,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, if( p_intf->p_sys->p_vlm == NULL ) break; E_(ExtractURIValue)( p_request, "name", name, 512 ); - if( E_(StrToMacroType)( control ) == MVLC_VLM_NEW ) + if( StrToMacroType( control ) == MVLC_VLM_NEW ) { char type[20]; E_(ExtractURIValue)( p_request, "type", type, 20 ); @@ -530,7 +570,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, char val[512]; E_(ExtractURIValue)( p_request, vlm_properties[i], val, 512 ); - E_(DecodeEncodedURI)( val ); + decode_URI( val ); if( strlen( val ) > 0 && i >= 4 ) { p += sprintf( p, " %s %s", vlm_properties[i], val ); @@ -595,13 +635,13 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, if( p_intf->p_sys->p_vlm == NULL ) break; E_(ExtractURIValue)( p_request, "name", name, 512 ); - if( E_(StrToMacroType)( control ) == MVLC_VLM_PLAY ) + if( StrToMacroType( control ) == MVLC_VLM_PLAY ) sprintf( psz, "control %s play", name ); - else if( E_(StrToMacroType)( control ) == MVLC_VLM_PAUSE ) + else if( StrToMacroType( control ) == MVLC_VLM_PAUSE ) sprintf( psz, "control %s pause", name ); - else if( E_(StrToMacroType)( control ) == MVLC_VLM_STOP ) + else if( StrToMacroType( control ) == MVLC_VLM_STOP ) sprintf( psz, "control %s stop", name ); - else if( E_(StrToMacroType)( control ) == MVLC_VLM_SEEK ) + else if( StrToMacroType( control ) == MVLC_VLM_SEEK ) { char percent[20]; E_(ExtractURIValue)( p_request, "percent", percent, 512 ); @@ -626,9 +666,9 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, if( p_intf->p_sys->p_vlm == NULL ) break; E_(ExtractURIValue)( p_request, "file", file, 512 ); - E_(DecodeEncodedURI)( file ); + decode_URI( file ); - if( E_(StrToMacroType)( control ) == MVLC_VLM_LOAD ) + if( StrToMacroType( control ) == MVLC_VLM_LOAD ) sprintf( psz, "load %s", file ); else sprintf( psz, "save %s", file ); @@ -661,9 +701,9 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, break; } E_(ExtractURIValue)( p_request, m->param1, value, 512 ); - E_(DecodeEncodedURI)( value ); + decode_URI( value ); - switch( E_(StrToMacroType)( m->param2 ) ) + switch( StrToMacroType( m->param2 ) ) { case MVLC_INT: i = atoi( value ); @@ -694,7 +734,7 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, break; } - switch( E_(StrToMacroType)( m->param2 ) ) + switch( StrToMacroType( m->param2 ) ) { case MVLC_INT: i = config_GetInt( p_intf, m->param1 ); @@ -703,16 +743,15 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, case MVLC_FLOAT: f = config_GetFloat( p_intf, m->param1 ); div = lldiv( f * 1000000 , 1000000 ); - sprintf( value, I64Fd".%06u", div.quot, + sprintf( value, "%lld.%06u", div.quot, (unsigned int)div.rem ); break; case MVLC_STRING: psz = config_GetPsz( p_intf, m->param1 ); if( psz != NULL ) { - strncpy( value, psz,sizeof( value ) ); + strlcpy( value, psz,sizeof( value ) ); free( psz ); - value[sizeof( value ) - 1] = '\0'; } else *value = '\0'; @@ -721,7 +760,6 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, default: snprintf( value, sizeof( value ), "invalid type(%s) in set", m->param2 ); - value[sizeof( value ) - 1] = '\0'; break; } PRINTS( "%s", value ); @@ -771,7 +809,8 @@ void E_(MacroDo)( httpd_file_sys_t *p_args, #undef ALLOC } -char *E_(MacroSearch)( char *src, char *end, int i_mvlc, vlc_bool_t b_after ) +static +char *MacroSearch( char *src, char *end, int i_mvlc, bool b_after ) { int i_id; int i_level = 0; @@ -783,9 +822,9 @@ char *E_(MacroSearch)( char *src, char *end, int i_mvlc, vlc_bool_t b_after ) int i_skip; macro_t m; - i_skip = E_(MacroParse)( &m, src ); + i_skip = MacroParse( &m, src ); - i_id = E_(StrToMacroType)( m.id ); + i_id = StrToMacroType( m.id ); switch( i_id ) { @@ -800,7 +839,7 @@ char *E_(MacroSearch)( char *src, char *end, int i_mvlc, vlc_bool_t b_after ) break; } - E_(MacroClean)( &m ); + MacroClean( &m ); if( ( i_mvlc == MVLC_END && i_level == -1 ) || ( i_mvlc != MVLC_END && i_level == 0 && i_mvlc == i_id ) ) @@ -851,11 +890,11 @@ void E_(Execute)( httpd_file_sys_t *p_args, { macro_t m; - src += E_(MacroParse)( &m, src ); + src += MacroParse( &m, src ); //msg_Dbg( p_intf, "macro_id=%s", m.id ); - switch( E_(StrToMacroType)( m.id ) ) + switch( StrToMacroType( m.id ) ) { case MVLC_INCLUDE: { @@ -891,8 +930,8 @@ void E_(Execute)( httpd_file_sys_t *p_args, if( ( f = fopen( psz_file, "r" ) ) == NULL ) { msg_Warn( p_args->p_intf, - "unable to include file %s (%s)", - psz_file, strerror(errno) ); + "unable to include file %s (%m)", + psz_file ); break; } @@ -908,7 +947,7 @@ void E_(Execute)( httpd_file_sys_t *p_args, } case MVLC_IF: { - vlc_bool_t i_test; + bool i_test; char *endif; E_(EvaluateRPN)( p_intf, p_args->vars, &p_args->stack, m.param1 ); @@ -920,15 +959,15 @@ void E_(Execute)( httpd_file_sys_t *p_args, { i_test = 0; } - endif = E_(MacroSearch)( src, end, MVLC_END, VLC_TRUE ); + endif = MacroSearch( src, end, MVLC_END, true ); if( i_test == 0 ) { - char *start = E_(MacroSearch)( src, endif, MVLC_ELSE, VLC_TRUE ); + char *start = MacroSearch( src, endif, MVLC_ELSE, true ); if( start ) { - char *stop = E_(MacroSearch)( start, endif, MVLC_END, VLC_FALSE ); + char *stop = MacroSearch( start, endif, MVLC_END, false ); if( stop ) { E_(Execute)( p_args, p_request, i_request, @@ -939,9 +978,9 @@ void E_(Execute)( httpd_file_sys_t *p_args, else if( i_test == 1 ) { char *stop; - if( ( stop = E_(MacroSearch)( src, endif, MVLC_ELSE, VLC_FALSE ) ) == NULL ) + if( ( stop = MacroSearch( src, endif, MVLC_ELSE, false ) ) == NULL ) { - stop = E_(MacroSearch)( src, endif, MVLC_END, VLC_FALSE ); + stop = MacroSearch( src, endif, MVLC_END, false ); } if( stop ) { @@ -955,9 +994,9 @@ void E_(Execute)( httpd_file_sys_t *p_args, } case MVLC_FOREACH: { - char *endfor = E_(MacroSearch)( src, end, MVLC_END, VLC_TRUE ); + char *endfor = MacroSearch( src, end, MVLC_END, true ); char *start = src; - char *stop = E_(MacroSearch)( src, end, MVLC_END, VLC_FALSE ); + char *stop = MacroSearch( src, end, MVLC_END, false ); if( stop ) { @@ -989,7 +1028,7 @@ void E_(Execute)( httpd_file_sys_t *p_args, } else if( !strcmp( m.param2, "information" ) ) { - index = E_(mvar_InfoSetNew)( p_intf, m.param1, + index = E_(mvar_InfoSetNew)( m.param1, p_intf->p_sys->p_input ); } else if( !strcmp( m.param2, "program" ) @@ -1058,12 +1097,12 @@ void E_(Execute)( httpd_file_sys_t *p_args, break; } default: - E_(MacroDo)( p_args, &m, p_request, i_request, - pp_data, pi_data, &dst ); + MacroDo( p_args, &m, p_request, i_request, + pp_data, pi_data, &dst ); break; } - E_(MacroClean)( &m ); + MacroClean( &m ); continue; }