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

📄 modules.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 5 页
字号:
    module_cache_t **pp_cache = 0;    int32_t i_file_size, i_marker;    psz_homedir = p_this->p_vlc->psz_homedir;    if( !psz_homedir )    {        msg_Err( p_this, "psz_homedir is null" );        return;    }    i_size = asprintf( &psz_filename, "%s/%s/%s/%s", psz_homedir, CONFIG_DIR,                       PLUGINSCACHE_DIR, CacheName() );    if( i_size <= 0 )    {        msg_Err( p_this, "out of memory" );        return;    }    if( p_this->p_libvlc->p_module_bank->b_cache_delete )    {#if !defined( UNDER_CE )        unlink( psz_filename );#else        wchar_t psz_wf[MAX_PATH];        MultiByteToWideChar( CP_ACP, 0, psz_filename, -1, psz_wf, MAX_PATH );        DeleteFile( psz_wf );#endif        msg_Dbg( p_this, "removing plugins cache file %s", psz_filename );        return;    }    msg_Dbg( p_this, "loading plugins cache file %s", psz_filename );    file = fopen( psz_filename, "rb" );    if( !file )    {        msg_Warn( p_this, "could not open plugins cache file %s for reading",                  psz_filename );        free( psz_filename );        return;    }    free( psz_filename );    /* Check the file size */    i_read = fread( &i_file_size, sizeof(char), sizeof(i_file_size), file );    if( i_read != sizeof(i_file_size) )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache "                  "(too short)" );        fclose( file );        return;    }    fseek( file, 0, SEEK_END );    if( ftell( file ) != i_file_size )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache "                  "(corrupted size)" );        fclose( file );        return;    }    fseek( file, sizeof(i_file_size), SEEK_SET );    /* Check the file is a plugins cache */    i_size = sizeof(PLUGINSCACHE_DIR COPYRIGHT_MESSAGE) - 1;    i_read = fread( p_cachestring, sizeof(char), i_size, file );    if( i_read != i_size ||        memcmp( p_cachestring, PLUGINSCACHE_DIR COPYRIGHT_MESSAGE, i_size ) )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache" );        fclose( file );        return;    }    /* Check Sub-version number */    i_read = fread( &i_marker, sizeof(char), sizeof(i_marker), file );    if( i_read != sizeof(i_marker) || i_marker != CACHE_SUBVERSION_NUM )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache "                  "(corrupted header)" );        fclose( file );        return;    }    /* Check the language hasn't changed */    sprintf( p_lang, "%5.5s", _("C") ); i_size = 5;    i_read = fread( p_cachelang, sizeof(char), i_size, file );    if( i_read != i_size || memcmp( p_cachelang, p_lang, i_size ) )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache "                  "(language changed)" );        fclose( file );        return;    }    /* Check header marker */    i_read = fread( &i_marker, sizeof(char), sizeof(i_marker), file );    if( i_read != sizeof(i_marker) ||        i_marker != ftell( file ) - (int)sizeof(i_marker) )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache "                  "(corrupted header)" );        fclose( file );        return;    }    p_this->p_libvlc->p_module_bank->i_loaded_cache = 0;    fread( &i_cache, sizeof(char), sizeof(i_cache), file );    if( i_cache )        pp_cache = p_this->p_libvlc->p_module_bank->pp_loaded_cache =                   malloc( i_cache * sizeof(void *) );#define LOAD_IMMEDIATE(a) \    if( fread( &a, sizeof(char), sizeof(a), file ) != sizeof(a) ) goto error#define LOAD_STRING(a) \    { if( fread( &i_size, sizeof(char), sizeof(i_size), file ) \          != sizeof(i_size) ) goto error; \      if( i_size && i_size < 16384 ) { \          a = malloc( i_size ); \          if( fread( a, sizeof(char), i_size, file ) != (size_t)i_size ) \              goto error; \          if( a[i_size-1] ) { \              free( a ); a = 0; \              goto error; } \      } else a = 0; \    } while(0)    for( i = 0; i < i_cache; i++ )    {        int16_t i_size;        int i_submodules;        pp_cache[i] = malloc( sizeof(module_cache_t) );        p_this->p_libvlc->p_module_bank->i_loaded_cache++;        /* Load common info */        LOAD_STRING( pp_cache[i]->psz_file );        LOAD_IMMEDIATE( pp_cache[i]->i_time );        LOAD_IMMEDIATE( pp_cache[i]->i_size );        LOAD_IMMEDIATE( pp_cache[i]->b_junk );        if( pp_cache[i]->b_junk ) continue;        pp_cache[i]->p_module = vlc_object_create( p_this, VLC_OBJECT_MODULE );        /* Load additional infos */        LOAD_STRING( pp_cache[i]->p_module->psz_object_name );        LOAD_STRING( pp_cache[i]->p_module->psz_shortname );        LOAD_STRING( pp_cache[i]->p_module->psz_longname );        LOAD_STRING( pp_cache[i]->p_module->psz_program );        for( j = 0; j < MODULE_SHORTCUT_MAX; j++ )        {            LOAD_STRING( pp_cache[i]->p_module->pp_shortcuts[j] ); // FIX        }        LOAD_STRING( pp_cache[i]->p_module->psz_capability );        LOAD_IMMEDIATE( pp_cache[i]->p_module->i_score );        LOAD_IMMEDIATE( pp_cache[i]->p_module->i_cpu );        LOAD_IMMEDIATE( pp_cache[i]->p_module->b_unloadable );        LOAD_IMMEDIATE( pp_cache[i]->p_module->b_reentrant );        LOAD_IMMEDIATE( pp_cache[i]->p_module->b_submodule );        /* Config stuff */        if( CacheLoadConfig( pp_cache[i]->p_module, file ) != VLC_SUCCESS )            goto error;        LOAD_STRING( pp_cache[i]->p_module->psz_filename );        LOAD_IMMEDIATE( i_submodules );        while( i_submodules-- )        {            module_t *p_module = vlc_object_create( p_this, VLC_OBJECT_MODULE);            vlc_object_attach( p_module, pp_cache[i]->p_module );            p_module->b_submodule = VLC_TRUE;            LOAD_STRING( p_module->psz_object_name );            LOAD_STRING( p_module->psz_shortname );            LOAD_STRING( p_module->psz_longname );            LOAD_STRING( p_module->psz_program );            for( j = 0; j < MODULE_SHORTCUT_MAX; j++ )            {                LOAD_STRING( p_module->pp_shortcuts[j] ); // FIX            }            LOAD_STRING( p_module->psz_capability );            LOAD_IMMEDIATE( p_module->i_score );            LOAD_IMMEDIATE( p_module->i_cpu );            LOAD_IMMEDIATE( p_module->b_unloadable );            LOAD_IMMEDIATE( p_module->b_reentrant );        }    }    fclose( file );    return; error:    msg_Warn( p_this, "plugins cache not loaded (corrupted)" );    /* TODO: cleanup */    p_this->p_libvlc->p_module_bank->i_loaded_cache = 0;    fclose( file );    return;}int CacheLoadConfig( module_t *p_module, FILE *file ){    int i, j, i_lines;    int16_t i_size;    /* Calculate the structure length */    LOAD_IMMEDIATE( p_module->i_config_items );    LOAD_IMMEDIATE( p_module->i_bool_items );    LOAD_IMMEDIATE( i_lines );    /* Allocate memory */    p_module->p_config =        (module_config_t *)malloc( sizeof(module_config_t) * (i_lines + 1));    if( p_module->p_config == NULL )    {        msg_Err( p_module, "config error: can't duplicate p_config" );        return VLC_ENOMEM;    }    /* Do the duplication job */    for( i = 0; i < i_lines ; i++ )    {        LOAD_IMMEDIATE( p_module->p_config[i] );        LOAD_STRING( p_module->p_config[i].psz_type );        LOAD_STRING( p_module->p_config[i].psz_name );        LOAD_STRING( p_module->p_config[i].psz_text );        LOAD_STRING( p_module->p_config[i].psz_longtext );        LOAD_STRING( p_module->p_config[i].psz_current );        LOAD_STRING( p_module->p_config[i].psz_value_orig );        p_module->p_config[i].psz_value =            p_module->p_config[i].psz_value_orig ?                strdup( p_module->p_config[i].psz_value_orig ) : 0;        p_module->p_config[i].i_value = p_module->p_config[i].i_value_orig;        p_module->p_config[i].f_value = p_module->p_config[i].f_value_orig;        p_module->p_config[i].i_value_saved = p_module->p_config[i].i_value;        p_module->p_config[i].f_value_saved = p_module->p_config[i].f_value;        p_module->p_config[i].psz_value_saved = 0;        p_module->p_config[i].b_dirty = VLC_FALSE;        p_module->p_config[i].p_lock = &p_module->object_lock;        if( p_module->p_config[i].i_list )        {            if( p_module->p_config[i].ppsz_list )            {                p_module->p_config[i].ppsz_list =                    malloc( (p_module->p_config[i].i_list+1) * sizeof(char *));                if( p_module->p_config[i].ppsz_list )                {                    for( j = 0; j < p_module->p_config[i].i_list; j++ )                        LOAD_STRING( p_module->p_config[i].ppsz_list[j] );                    p_module->p_config[i].ppsz_list[j] = NULL;                }            }            if( p_module->p_config[i].ppsz_list_text )            {                p_module->p_config[i].ppsz_list_text =                    malloc( (p_module->p_config[i].i_list+1) * sizeof(char *));                if( p_module->p_config[i].ppsz_list_text )                {                  for( j = 0; j < p_module->p_config[i].i_list; j++ )                      LOAD_STRING( p_module->p_config[i].ppsz_list_text[j] );                  p_module->p_config[i].ppsz_list_text[j] = NULL;                }            }            if( p_module->p_config[i].pi_list )            {                p_module->p_config[i].pi_list =                    malloc( (p_module->p_config[i].i_list + 1) * sizeof(int) );                if( p_module->p_config[i].pi_list )                {                    for( j = 0; j < p_module->p_config[i].i_list; j++ )                        LOAD_IMMEDIATE( p_module->p_config[i].pi_list[j] );                }            }        }        if( p_module->p_config[i].i_action )        {            p_module->p_config[i].ppf_action =                malloc( p_module->p_config[i].i_action * sizeof(void *) );            p_module->p_config[i].ppsz_action_text =                malloc( p_module->p_config[i].i_action * sizeof(char *) );            for( j = 0; j < p_module->p_config[i].i_action; j++ )            {                p_module->p_config[i].ppf_action[j] = 0;                LOAD_STRING( p_module->p_config[i].ppsz_action_text[j] );            }        }        LOAD_IMMEDIATE( p_module->p_config[i].pf_callback );    }    p_module->p_config[i].i_type = CONFIG_HINT_END;    return VLC_SUCCESS; error:    return VLC_EGENERIC;}/***************************************************************************** * SavePluginsCache: saves the plugins cache to a file *****************************************************************************/static void CacheSave( vlc_object_t *p_this ){    static char const psz_tag[] =        "Signature: 8a477f597d28d172789f06886806bc55\r\n"        "# This file is a cache directory tag created by VLC.\r\n"        "# For information about cache directory tags, see:\r\n"        "#   http://www.brynosaurus.com/cachedir/\r\n";    char *psz_filename, *psz_homedir;    FILE *file;    int i, j, i_cache;    module_cache_t **pp_cache;    int32_t i_file_size = 0;    psz_homedir = p_this->p_vlc->psz_homedir;    if( !psz_homedir )    {        msg_Err( p_this, "psz_homedir is null" );        return;    }    psz_filename =       (char *)malloc( sizeof("/" CONFIG_DIR "/" PLUGINSCACHE_DIR "/" ) +                       strlen(psz_homedir) + strlen(CacheName()) );    if( !psz_filename )    {        msg_Err( p_this, "out of memory" );        return;    }    sprintf( psz_filename, "%s/%s", psz_homedir, CONFIG_DIR );    config_CreateDir( p_this, psz_filename );    strcat( psz_filename, "/" PLUGINSCACHE_DIR );    config_CreateDir( p_this, psz_filename );    strcat( psz_filename, "/CACHEDIR.TAG" );    file = fopen( psz_filename, "wb" );    if( file )    {        fwrite( psz_tag, 1, strlen(psz_tag), file );        fclose( file );    }    sprintf( psz_filename, "%s/%s/%s/%s", psz_homedir, CONFIG_DIR,             PLUGINSCACHE_DIR, CacheName() );    msg_Dbg( p_this, "saving plugins cache file %s", psz_filename );    file = fopen( psz_filename, "wb" );    if( !file )    {        msg_Warn( p_this, "could not open plugins cache file %s for writing",                  psz_filename );        free( psz_filename );        return;    }    free( psz_filename );    /* Empty space for file size */    fwrite( &i_file_size, sizeof(char), sizeof(i_file_size), file );    /* Contains version number */    fprintf( file, "%s", PLUGINSCACHE_DIR COPYRIGHT_MESSAGE );    /* Sub-version number (to avoid breakage in the dev version when cache     * structure changes) */    i_file_size = CACHE_SUBVERSION_NUM;    fwrite( &i_file_size, sizeof(char), sizeof(i_file_size), file );    /* Language */    fprintf( file, "%5.5s", _("C") );    /* Header marker */    i_file_size = ftell( file );    fwrite( &i_file_size, sizeof(char), sizeof(i_file_size), file );    i_cache = p_this->p_libvlc->p_module_b

⌨️ 快捷键说明

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