X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fhttp%2Fhttp.c;h=42a70ba6f41fb92daf7e19e04e9a04e9c773db1a;hb=97897eeeb22b1238e56632b16cda1a0375ae7708;hp=ae6c94e85f04ae711668edb3b2a7d6ce67334a3a;hpb=411fcacf42c0869de79b607b81ad30454aae392d;p=vlc diff --git a/modules/control/http/http.c b/modules/control/http/http.c index ae6c94e85f..42a70ba6f4 100644 --- a/modules/control/http/http.c +++ b/modules/control/http/http.c @@ -22,6 +22,9 @@ * 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" @@ -39,9 +42,6 @@ static void Close( vlc_object_t * ); "machine, enter 127.0.0.1" ) #define SRC_TEXT N_( "Source directory" ) #define SRC_LONGTEXT N_( "Source directory" ) -#define CHARSET_TEXT N_( "Charset" ) -#define CHARSET_LONGTEXT N_( \ - "Charset declared in Content-Type header (default UTF-8)." ) #define HANDLERS_TEXT N_( "Handlers" ) #define HANDLERS_LONGTEXT N_( \ "List of handler extensions and executable paths (for instance: " \ @@ -66,18 +66,18 @@ vlc_module_begin(); set_description( _("HTTP remote control interface") ); set_category( CAT_INTERFACE ); set_subcategory( SUBCAT_INTERFACE_MAIN ); - add_string ( "http-host", NULL, NULL, HOST_TEXT, HOST_LONGTEXT, VLC_TRUE ); - add_string ( "http-src", NULL, NULL, SRC_TEXT, SRC_LONGTEXT, VLC_TRUE ); - add_string ( "http-charset", "UTF-8", NULL, CHARSET_TEXT, CHARSET_LONGTEXT, VLC_TRUE ); + add_string ( "http-host", NULL, NULL, HOST_TEXT, HOST_LONGTEXT, true ); + add_string ( "http-src", NULL, NULL, SRC_TEXT, SRC_LONGTEXT, true ); + add_obsolete_string ( "http-charset" ); #if defined( HAVE_FORK ) || defined( WIN32 ) - add_string ( "http-handlers", NULL, NULL, HANDLERS_TEXT, HANDLERS_LONGTEXT, VLC_TRUE ); + add_string ( "http-handlers", NULL, NULL, HANDLERS_TEXT, HANDLERS_LONGTEXT, true ); #endif - add_bool ( "http-album-art", VLC_FALSE, NULL, ART_TEXT, ART_LONGTEXT, VLC_TRUE ); + add_bool ( "http-album-art", false, NULL, ART_TEXT, ART_LONGTEXT, true ); set_section( N_("HTTP SSL" ), 0 ); - add_string ( "http-intf-cert", NULL, NULL, CERT_TEXT, CERT_LONGTEXT, VLC_TRUE ); - add_string ( "http-intf-key", NULL, NULL, KEY_TEXT, KEY_LONGTEXT, VLC_TRUE ); - add_string ( "http-intf-ca", NULL, NULL, CA_TEXT, CA_LONGTEXT, VLC_TRUE ); - add_string ( "http-intf-crl", NULL, NULL, CRL_TEXT, CRL_LONGTEXT, VLC_TRUE ); + add_string ( "http-intf-cert", NULL, NULL, CERT_TEXT, CERT_LONGTEXT, true ); + add_string ( "http-intf-key", NULL, NULL, KEY_TEXT, KEY_LONGTEXT, true ); + add_string ( "http-intf-ca", NULL, NULL, CA_TEXT, CA_LONGTEXT, true ); + add_string ( "http-intf-crl", NULL, NULL, CRL_TEXT, CRL_LONGTEXT, true ); set_capability( "interface", 0 ); set_callbacks( Open, Close ); vlc_module_end(); @@ -86,7 +86,6 @@ vlc_module_end(); /***************************************************************************** * Local prototypes *****************************************************************************/ -static void Run ( intf_thread_t *p_intf ); int E_(ArtCallback)( httpd_handler_sys_t *p_args, httpd_handler_t *p_handler, char *_p_url, uint8_t *_p_request, int i_type, @@ -134,9 +133,9 @@ static int Open( vlc_object_t *p_this ) const char *psz_cert = NULL, *psz_key = NULL, *psz_ca = NULL, *psz_crl = NULL; int i_port = 0; - char *psz_src; + char *psz_src = NULL; - psz_address = var_GetNonEmptyString(p_intf->p_libvlc, "http-host"); + psz_address = var_CreateGetNonEmptyString( p_intf, "http-host" ); if( psz_address != NULL ) { char *psz_parser = strchr( psz_address, ':' ); @@ -154,58 +153,14 @@ static int Open( vlc_object_t *p_this ) { return( VLC_ENOMEM ); } - p_sys->p_playlist = NULL; + + p_sys->p_playlist = pl_Yield( p_this ); p_sys->p_input = NULL; p_sys->p_vlm = NULL; p_sys->psz_address = psz_address; p_sys->i_port = i_port; p_sys->p_art_handler = NULL; - /* determine Content-Type value for HTML pages */ - psz_src = config_GetPsz( p_intf, "http-charset" ); - if( psz_src == NULL || !*psz_src ) - { - if( psz_src != NULL ) free( psz_src ); - psz_src = strdup("UTF-8"); - } - - p_sys->psz_html_type = malloc( 20 + strlen( psz_src ) ); - if( p_sys->psz_html_type == NULL ) - { - free( p_sys->psz_address ); - free( p_sys ); - free( psz_src ); - return VLC_ENOMEM ; - } - sprintf( p_sys->psz_html_type, "text/html; charset=%s", psz_src ); - msg_Dbg( p_intf, "using charset=%s", psz_src ); - - if( strcmp( psz_src, "UTF-8" ) ) - { - char psz_encoding[strlen( psz_src ) + sizeof( "//translit")]; - sprintf( psz_encoding, "%s//translit", psz_src); - - p_sys->iconv_from_utf8 = vlc_iconv_open( psz_encoding, "UTF-8" ); - if( p_sys->iconv_from_utf8 == (vlc_iconv_t)-1 ) - msg_Warn( p_intf, "unable to perform charset conversion to %s", - psz_encoding ); - else - { - p_sys->iconv_to_utf8 = vlc_iconv_open( "UTF-8", psz_src ); - if( p_sys->iconv_to_utf8 == (vlc_iconv_t)-1 ) - msg_Warn( p_intf, - "unable to perform charset conversion from %s", - psz_src ); - } - } - else - { - p_sys->iconv_from_utf8 = p_sys->iconv_to_utf8 = (vlc_iconv_t)-1; - } - - p_sys->psz_charset = psz_src; - psz_src = NULL; - /* determine file handler associations */ p_sys->i_handlers = 0; p_sys->pp_handlers = NULL; @@ -246,8 +201,7 @@ static int Open( vlc_object_t *p_this ) TAB_APPEND( p_sys->i_handlers, p_sys->pp_handlers, p_handler ); } } - if( psz_src != NULL ) - free( psz_src ); + free( psz_src ); #endif /* determine SSL configuration */ @@ -277,7 +231,7 @@ static int Open( vlc_object_t *p_this ) if( p_sys->p_httpd_host == NULL ) { msg_Err( p_intf, "cannot listen on %s:%d", psz_address, i_port ); - free( p_sys->psz_html_type ); + pl_Release( p_this ); free( p_sys->psz_address ); free( p_sys ); return VLC_EGENERIC; @@ -308,19 +262,20 @@ static int Open( vlc_object_t *p_this ) if( ( psz_src == NULL ) || ( *psz_src == '\0' ) ) { - static char const* ppsz_paths[] = { + const char *data_path = config_GetDataDir (); + char buf[strlen (data_path) + sizeof ("/http")]; + snprintf (buf, sizeof (buf), "%s/http", data_path); + + const char const* ppsz_paths[] = { "share/http", "../share/http", - DATA_PATH"/http", + buf, NULL }; unsigned i; - if( psz_src != NULL ) - { - free( psz_src ); - psz_src = NULL; - } + free( psz_src ); + psz_src = NULL; for( i = 0; ppsz_paths[i] != NULL; i++ ) if( !DirectoryCheck( ppsz_paths[i] ) ) @@ -351,7 +306,6 @@ static int Open( vlc_object_t *p_this ) goto failed; } - p_intf->pf_run = Run; free( psz_src ); if( config_GetInt( p_intf, "http-album-art" ) ) @@ -380,12 +334,8 @@ failed: free( p_sys->pp_files ); httpd_HostDelete( p_sys->p_httpd_host ); free( p_sys->psz_address ); - free( p_sys->psz_html_type ); - if( p_sys->iconv_from_utf8 != (vlc_iconv_t)-1 ) - vlc_iconv_close( p_sys->iconv_from_utf8 ); - if( p_sys->iconv_to_utf8 != (vlc_iconv_t)-1 ) - vlc_iconv_close( p_sys->iconv_to_utf8 ); free( p_sys ); + pl_Release( p_this ); return VLC_EGENERIC; } @@ -418,10 +368,7 @@ static void Close ( vlc_object_t *p_this ) free( p_sys->pp_files[i]->name ); free( p_sys->pp_files[i] ); } - if( p_sys->pp_files ) - { - free( p_sys->pp_files ); - } + free( p_sys->pp_files ); for( i = 0; i < p_sys->i_handlers; i++ ) { http_association_t *p_handler = p_sys->pp_handlers[i]; @@ -439,59 +386,8 @@ static void Close ( vlc_object_t *p_this ) httpd_HandlerDelete( p_sys->p_art_handler ); httpd_HostDelete( p_sys->p_httpd_host ); free( p_sys->psz_address ); - free( p_sys->psz_html_type ); - - if( p_sys->iconv_from_utf8 != (vlc_iconv_t)-1 ) - vlc_iconv_close( p_sys->iconv_from_utf8 ); - if( p_sys->iconv_to_utf8 != (vlc_iconv_t)-1 ) - vlc_iconv_close( p_sys->iconv_to_utf8 ); free( p_sys ); -} - -/***************************************************************************** - * Run: http interface thread - *****************************************************************************/ -static void Run( intf_thread_t *p_intf ) -{ - intf_sys_t *p_sys = p_intf->p_sys; - - while( !intf_ShouldDie( p_intf ) ) - { - /* get the playlist */ - if( p_sys->p_playlist == NULL ) - { - p_sys->p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - } - - /* Manage the input part */ - if( p_sys->p_input == NULL ) - { - if( p_sys->p_playlist ) - { - p_sys->p_input = p_sys->p_playlist->p_input; - } - } - else if( p_sys->p_input->b_dead || p_sys->p_input->b_die ) - { - p_sys->p_input = NULL; - } - - - /* Wait a bit */ - msleep( INTF_IDLE_SLEEP ); - } - - if( p_sys->p_input ) - { - vlc_object_release( p_sys->p_input ); - p_sys->p_input = NULL; - } - - if( p_sys->p_playlist ) - { - vlc_object_release( p_sys->p_playlist ); - p_sys->p_playlist = NULL; - } + pl_Release( p_this ); } /**************************************************************************** @@ -525,6 +421,7 @@ static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer, int i_buffer, char *p_request, char **pp_data, int *pi_data ) { + intf_sys_t *p_sys = p_args->p_intf->p_sys; int i_request = p_request != NULL ? strlen( p_request ) : 0; char *dst; vlc_value_t val; @@ -536,15 +433,18 @@ static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer, const char *state; char stats[20]; -#define p_sys p_args->p_intf->p_sys + assert( p_sys->p_input == NULL ); + /* FIXME: proper locking anyone? */ + p_sys->p_input = p_sys->p_playlist->p_input; if( p_sys->p_input ) { + vlc_object_yield( p_sys->p_input ); var_Get( p_sys->p_input, "position", &val); sprintf( position, "%d" , (int)((val.f_float) * 100.0)); var_Get( p_sys->p_input, "time", &val); - sprintf( time, I64Fi, (int64_t)val.i_time / I64C(1000000) ); + sprintf( time, "%"PRIi64, (int64_t)val.i_time / I64C(1000000) ); var_Get( p_sys->p_input, "length", &val); - sprintf( length, I64Fi, (int64_t)val.i_time / I64C(1000000) ); + sprintf( length, "%"PRIi64, (int64_t)val.i_time / I64C(1000000) ); var_Get( p_sys->p_input, "state", &val ); if( val.i_int == PLAYING_S ) @@ -575,7 +475,6 @@ static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer, sprintf( length, "%d", 0 ); state = "stop"; } -#undef p_sys aout_VolumeGet( p_args->p_intf, &i_volume ); sprintf( volume, "%d", (int)i_volume ); @@ -598,10 +497,9 @@ static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer, E_(mvar_AppendNewVar)( p_args->vars, "stream_length", length ); E_(mvar_AppendNewVar)( p_args->vars, "volume", volume ); E_(mvar_AppendNewVar)( p_args->vars, "stream_state", state ); - E_(mvar_AppendNewVar)( p_args->vars, "charset", ((intf_sys_t *)p_args->p_intf->p_sys)->psz_charset ); + E_(mvar_AppendNewVar)( p_args->vars, "charset", "UTF-8" ); /* Stats */ -#define p_sys p_args->p_intf->p_sys if( p_sys->p_input ) { /* FIXME: Workarround a stupid assert in input_GetItem */ @@ -634,7 +532,6 @@ static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer, vlc_mutex_unlock( &p_item->p_stats->lock ); } } -#undef p_sys E_(SSInit)( &p_args->stack ); @@ -649,6 +546,11 @@ static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer, *dst = '\0'; *pi_data = dst - *pp_data; + if( p_sys->p_input != NULL ) + { + vlc_object_release( p_sys->p_input ); + p_sys->p_input = NULL; + } E_(SSClean)( &p_args->stack ); E_(mvar_Delete)( p_args->vars ); } @@ -658,6 +560,7 @@ int E_(HttpCallback)( httpd_file_sys_t *p_args, uint8_t *_p_request, uint8_t **_pp_data, int *pi_data ) { + VLC_UNUSED(p_file); char *p_request = (char *)_p_request; char **pp_data = (char **)_pp_data; FILE *f; @@ -702,6 +605,7 @@ int E_(HandlerCallback)( httpd_handler_sys_t *p_args, char *psz_remote_addr, char *psz_remote_host, uint8_t **_pp_data, int *pi_data ) { + VLC_UNUSED(p_handler); VLC_UNUSED(_p_in); char *p_url = (char *)_p_url; char *p_request = (char *)_p_request; char **pp_data = (char **)_pp_data; @@ -883,8 +787,7 @@ int E_(HandlerCallback)( httpd_handler_sys_t *p_args, NULL ); TAB_REMOVE( p_args->p_association->i_argc, p_args->p_association->ppsz_argv, psz_file ); - if( psz_cwd != NULL ) - free( psz_cwd ); + free( psz_cwd ); while( i_env ) TAB_REMOVE( i_env, ppsz_env, ppsz_env[0] ); @@ -929,6 +832,10 @@ int E_(ArtCallback)( httpd_handler_sys_t *p_args, char *psz_remote_addr, char *psz_remote_host, uint8_t **pp_data, int *pi_data ) { + VLC_UNUSED(p_handler); VLC_UNUSED(_p_url); VLC_UNUSED(i_type); + VLC_UNUSED(p_in); VLC_UNUSED(i_in); VLC_UNUSED(psz_remote_addr); + VLC_UNUSED(psz_remote_host); + char *psz_art = NULL; intf_thread_t *p_intf = p_args->file.p_intf; intf_sys_t *p_sys = p_intf->p_sys; @@ -943,7 +850,7 @@ int E_(ArtCallback)( httpd_handler_sys_t *p_args, if( i_id ) { playlist_item_t *p_pl_item = playlist_ItemGetById( p_sys->p_playlist, - i_id, VLC_FALSE ); + i_id, false ); if( p_pl_item ) p_item = p_pl_item->p_input; }