+static void Callback404( httpd_file_sys_t *p_args, char **pp_data,
+ int *pi_data )
+{
+ char *p = *pp_data = malloc( 10240 );
+ if( !p )
+ {
+ return;
+ }
+ p += sprintf( p, "<html>\n" );
+ p += sprintf( p, "<head>\n" );
+ p += sprintf( p, "<title>Error loading %s</title>\n", p_args->file );
+ p += sprintf( p, "</head>\n" );
+ p += sprintf( p, "<body>\n" );
+ p += sprintf( p, "<h1><center>Error loading %s for %s</center></h1>\n", p_args->file, p_args->name );
+ p += sprintf( p, "<hr />\n" );
+ p += sprintf( p, "<a href=\"http://www.videolan.org/\">VideoLAN</a>\n" );
+ p += sprintf( p, "</body>\n" );
+ p += sprintf( p, "</html>\n" );
+
+ *pi_data = strlen( *pp_data );
+}
+
+static void ParseExecute( httpd_file_sys_t *p_args, char *p_buffer,
+ int i_buffer, char *p_request,
+ char **pp_data, int *pi_data )
+{
+ int i_request = p_request != NULL ? strlen( p_request ) : 0;
+ char *dst;
+ vlc_value_t val;
+ char position[4]; /* percentage */
+ char time[12]; /* in seconds */
+ char length[12]; /* in seconds */
+ audio_volume_t i_volume;
+ char volume[5];
+ char state[8];
+
+#define p_sys p_args->p_intf->p_sys
+ if( 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, "%d" , (int)(val.i_time / 1000000) );
+ var_Get( p_sys->p_input, "length", &val);
+ sprintf( length, "%d" , (int)(val.i_time / 1000000) );
+
+ var_Get( p_sys->p_input, "state", &val );
+ if( val.i_int == PLAYING_S )
+ {
+ sprintf( state, "playing" );
+ }
+ else if( val.i_int == PAUSE_S )
+ {
+ sprintf( state, "paused" );
+ }
+ else
+ {
+ sprintf( state, "stop" );
+ }
+ }
+ else
+ {
+ sprintf( position, "%d", 0 );
+ sprintf( time, "%d", 0 );
+ sprintf( length, "%d", 0 );
+ sprintf( state, "stop" );
+ }
+#undef p_sys
+
+ aout_VolumeGet( p_args->p_intf, &i_volume );
+ sprintf( volume, "%d", (int)i_volume );
+
+ p_args->vars = E_(mvar_New)( "variables", "" );
+ E_(mvar_AppendNewVar)( p_args->vars, "url_param",
+ i_request > 0 ? "1" : "0" );
+ E_(mvar_AppendNewVar)( p_args->vars, "url_value", p_request );
+ E_(mvar_AppendNewVar)( p_args->vars, "version", VLC_Version() );
+ E_(mvar_AppendNewVar)( p_args->vars, "copyright", COPYRIGHT_MESSAGE );
+ E_(mvar_AppendNewVar)( p_args->vars, "vlc_compile_by", VLC_CompileBy() );
+ E_(mvar_AppendNewVar)( p_args->vars, "vlc_compile_host",
+ VLC_CompileHost() );
+ E_(mvar_AppendNewVar)( p_args->vars, "vlc_compile_domain",
+ VLC_CompileDomain() );
+ E_(mvar_AppendNewVar)( p_args->vars, "vlc_compiler", VLC_Compiler() );
+ E_(mvar_AppendNewVar)( p_args->vars, "vlc_changeset", VLC_Changeset() );
+ E_(mvar_AppendNewVar)( p_args->vars, "stream_position", position );
+ E_(mvar_AppendNewVar)( p_args->vars, "stream_time", time );
+ 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_(SSInit)( &p_args->stack );
+
+ /* allocate output */
+ *pi_data = i_buffer + 1000;
+ dst = *pp_data = malloc( *pi_data );
+
+ /* we parse executing all <vlc /> macros */
+ E_(Execute)( p_args, p_request, i_request, pp_data, pi_data, &dst,
+ &p_buffer[0], &p_buffer[i_buffer] );
+
+ *dst = '\0';
+ *pi_data = dst - *pp_data;
+
+ E_(SSClean)( &p_args->stack );
+ E_(mvar_Delete)( p_args->vars );
+}
+