⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
            {                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;    }}/**************************************************************************** * HttpCallback: **************************************************************************** * a file with b_html is parsed and all "macro" replaced ****************************************************************************/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, "Content-Type: text/html\n" );    p += sprintf( p, "<html xmlns=\"http://www.w3.org/1999/xhtml\">\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, "<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];    char stats[20];#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, I64Fi, val.i_time / 1000000LL );        var_Get( p_sys->p_input, "length", &val);        sprintf( length, I64Fi, val.i_time / 1000000LL );        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() );#ifndef HAVE_SHARED_LIBVLC    E_(mvar_AppendNewVar)( p_args->vars, "vlc_changeset", VLC_Changeset() );#endif    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_(mvar_AppendNewVar)( p_args->vars, "charset", ((intf_sys_t *)p_args->p_intf->p_sys)->psz_charset );    /* Stats */#define p_sys p_args->p_intf->p_sys    if( p_sys->p_input )    {        input_item_t *p_item = p_sys->p_input->input.p_item;        if( p_item )        {            vlc_mutex_lock( &p_item->p_stats->lock );#define STATS_INT( n ) sprintf( stats, "%d", p_item->p_stats->i_ ## n ); \                       E_(mvar_AppendNewVar)( p_args->vars, #n, stats );#define STATS_FLOAT( n ) sprintf( stats, "%f", p_item->p_stats->f_ ## n ); \                       E_(mvar_AppendNewVar)( p_args->vars, #n, stats );            STATS_INT( read_bytes )            STATS_FLOAT( input_bitrate )            STATS_INT( demux_read_bytes )            STATS_FLOAT( demux_bitrate )            STATS_INT( decoded_video )            STATS_INT( displayed_pictures )            STATS_INT( lost_pictures )            STATS_INT( decoded_audio )            STATS_INT( played_abuffers )            STATS_INT( lost_abuffers )            STATS_INT( sent_packets )            STATS_INT( sent_bytes )            STATS_FLOAT( send_bitrate )#undef STATS_INT#undef STATS_FLOAT            vlc_mutex_unlock( &p_item->p_stats->lock );        }    }#undef p_sys    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 );}int  E_(HttpCallback)( httpd_file_sys_t *p_args,                       httpd_file_t *p_file,                       uint8_t *_p_request,                       uint8_t **_pp_data, int *pi_data ){    char *p_request = (char *)_p_request;    char **pp_data = (char **)_pp_data;    FILE *f;    /* FIXME: do we need character encoding translation here? */    if( ( f = fopen( p_args->file, "r" ) ) == NULL )    {        Callback404( p_args, pp_data, pi_data );        return VLC_SUCCESS;    }    if( !p_args->b_html )    {        E_(FileLoad)( f, pp_data, pi_data );    }    else    {        int  i_buffer;        char *p_buffer;        /* first we load in a temporary buffer */        E_(FileLoad)( f, &p_buffer, &i_buffer );        ParseExecute( p_args, p_buffer, i_buffer, p_request, pp_data, pi_data );        free( p_buffer );    }    fclose( f );    return VLC_SUCCESS;}/**************************************************************************** * HandlerCallback: **************************************************************************** * call the external handler and parse vlc macros if Content-Type is HTML ****************************************************************************/int  E_(HandlerCallback)( httpd_handler_sys_t *p_args,                          httpd_handler_t *p_handler, char *_p_url,                          uint8_t *_p_request, int i_type,                          uint8_t *_p_in, int i_in,                          char *psz_remote_addr, char *psz_remote_host,                          uint8_t **_pp_data, int *pi_data ){    char *p_url = (char *)_p_url;    char *p_request = (char *)_p_request;    char **pp_data = (char **)_pp_data;    char *p_in = (char *)p_in;    int i_request = p_request != NULL ? strlen( p_request ) : 0;    char *p;    int i_env = 0;    char **ppsz_env = NULL;    char *psz_tmp;    char sep;    int  i_buffer;    char *p_buffer;    char *psz_cwd, *psz_file = NULL;    int i_ret;#ifdef WIN32    sep = '\\';#else    sep = '/';#endif    /* Create environment for the CGI */    TAB_APPEND( i_env, ppsz_env, strdup("GATEWAY_INTERFACE=CGI/1.1") );    TAB_APPEND( i_env, ppsz_env, strdup("SERVER_PROTOCOL=HTTP/1.1") );    TAB_APPEND( i_env, ppsz_env, strdup("SERVER_SOFTWARE=" COPYRIGHT_MESSAGE) );    switch( i_type )    {    case HTTPD_MSG_GET:        TAB_APPEND( i_env, ppsz_env, strdup("REQUEST_METHOD=GET") );        break;    case HTTPD_MSG_POST:        TAB_APPEND( i_env, ppsz_env, strdup("REQUEST_METHOD=POST") );        break;    case HTTPD_MSG_HEAD:        TAB_APPEND( i_env, ppsz_env, strdup("REQUEST_METHOD=HEAD") );        break;    default:        break;    }    if( i_request )    {        psz_tmp = malloc( sizeof("QUERY_STRING=") + i_request );        sprintf( psz_tmp, "QUERY_STRING=%s", p_request );        TAB_APPEND( i_env, ppsz_env, psz_tmp );        psz_tmp = malloc( sizeof("REQUEST_URI=?") + strlen(p_url)                           + i_request );        sprintf( psz_tmp, "REQUEST_URI=%s?%s", p_url, p_request );        TAB_APPEND( i_env, ppsz_env, psz_tmp );    }    else    {        psz_tmp = malloc( sizeof("REQUEST_URI=") + strlen(p_url) );        sprintf( psz_tmp, "REQUEST_URI=%s", p_url );        TAB_APPEND( i_env, ppsz_env, psz_tmp );    }    psz_tmp = malloc( sizeof("SCRIPT_NAME=") + strlen(p_url) );    sprintf( psz_tmp, "SCRIPT_NAME=%s", p_url );    TAB_APPEND( i_env, ppsz_env, psz_tmp );#define p_sys p_args->file.p_intf->p_sys    psz_tmp = malloc( sizeof("SERVER_NAME=") + strlen(p_sys->psz_address) );    sprintf( psz_tmp, "SERVER_NAME=%s", p_sys->psz_address );    TAB_APPEND( i_env, ppsz_env, psz_tmp );    psz_tmp = malloc( sizeof("SERVER_PORT=") + 5 );    sprintf( psz_tmp, "SERVER_PORT=%u", p_sys->i_port );    TAB_APPEND( i_env, ppsz_env, psz_tmp );#undef p_sys    p = getenv( "PATH" );    if( p != NULL )    {        psz_tmp = malloc( sizeof("PATH=") + strlen(p) );        sprintf( psz_tmp, "PATH=%s", p );        TAB_APPEND( i_env, ppsz_env, psz_tmp );    }#ifdef WIN32    p = getenv( "windir" );    if( p != NULL )    {        psz_tmp = malloc( sizeof("SYSTEMROOT=") + strlen(p) );        sprintf( psz_tmp, "SYSTEMROOT=%s", p );        TAB_APPEND( i_env, ppsz_env, psz_tmp );    }#endif    if( psz_remote_addr != NULL && *psz_remote_addr )    {        psz_tmp = malloc( sizeof("REMOTE_ADDR=") + strlen(psz_remote_addr) );        sprintf( psz_tmp, "REMOTE_ADDR=%s", psz_remote_addr );        TAB_APPEND( i_env, ppsz_env, psz_tmp );    }    if( psz_remote_host != NULL && *psz_remote_host )    {        psz_tmp = malloc( sizeof("REMOTE_HOST=") + strlen(psz_remote_host) );        sprintf( psz_tmp, "REMOTE_HOST=%s", psz_remote_host );        TAB_APPEND( i_env, ppsz_env, psz_tmp );    }    if( i_in )    {        p = p_in;        for ( ; ; )        {            if( !strncasecmp( p, "Content-Type: ", strlen("Content-Type: ") ) )            {                char *end = strchr( p, '\r' );                if( end == NULL )                    break;                *end = '\0';                psz_tmp = malloc( sizeof("CONTENT_TYPE=") + strlen(p) );                sprintf( psz_tmp, "CONTENT_TYPE=%s", p );                TAB_APPEND( i_env, ppsz_env, psz_tmp );                *end = '\r';            }            if( !strncasecmp( p, "Content-Length: ",                              strlen("Content-Length: ") ) )            {                char *end = strchr( p, '\r' );                if( end == NULL )                    break;                *end = '\0';                psz_tmp = malloc( sizeof("CONTENT_LENGTH=") + strlen(p) );                sprintf( psz_tmp, "CONTENT_LENGTH=%s", p );                TAB_APPEND( i_env, ppsz_env, psz_tmp );                *end = '\r';            }            p = strchr( p, '\n' );            if( p == NULL || p[1] == '\r' )            {                p = NULL;                break;            }            p++;        }    }    psz_file = strrchr( p_args->file.file, sep );    if( psz_file != NULL )    {        psz_file++;        psz_tmp = malloc( sizeof("SCRIPT_FILENAME=") + strlen(psz_file) );        sprintf( psz_tmp, "SCRIPT_FILENAME=%s", psz_file );        TAB_APPEND( i_env, ppsz_env, psz_tmp );        TAB_APPEND( p_args->p_association->i_argc,                    p_args->p_association->ppsz_argv, psz_file );    }    TAB_APPEND( i_env, ppsz_env, NULL );    TAB_APPEND( p_args->p_association->i_argc, p_args->p_association->ppsz_argv,                NULL );    psz_tmp = strdup( p_args->file.file );    p = strrchr( psz_tmp, sep );    if( p != NULL )    {        *p = '\0';        psz_cwd = psz_tmp;    }    else    {        free( psz_tmp );        psz_cwd = NULL;    }    i_ret = vlc_execve( p_args->file.p_intf, p_args->p_association->i_argc,                        p_args->p_association->ppsz_argv, ppsz_env, psz_cwd,                        (char *)p_in, i_in, &p_buffer, &i_buffer );    TAB_REMOVE( p_args->p_association->i_argc, p_args->p_association->ppsz_argv,                NULL );    TAB_REMOVE( p_args->p_association->i_argc, p_args->p_association->ppsz_argv,                psz_file );    if( psz_cwd != NULL )        free( psz_cwd );    while( i_env )        TAB_REMOVE( i_env, ppsz_env, ppsz_env[0] );    if( i_ret == -1 )    {        Callback404( (httpd_file_sys_t *)p_args, pp_data, pi_data );        return VLC_SUCCESS;    }    p = p_buffer;    while( strncasecmp( p, "Content-Type: text/html",                        strlen("Content-Type: text/html") ) )    {        p = strchr( p, '\n' );        if( p == NULL || p[1] == '\r' )        {            p = NULL;            break;        }        p++;    }    if( p == NULL )    {        *pp_data = p_buffer;        *pi_data = i_buffer;    }    else    {        ParseExecute( (httpd_file_sys_t *)p_args, p_buffer, i_buffer,                      p_request, pp_data, pi_data );        free( p_buffer );    }    return VLC_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -