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

📄 cache.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
    p_module->confsize = i_lines;    /* Do the duplication job */    for (size_t 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_oldname );        LOAD_IMMEDIATE( p_module->p_config[i].b_removed );        if (IsConfigStringType (p_module->p_config[i].i_type))        {            LOAD_STRING (p_module->p_config[i].orig.psz);            p_module->p_config[i].value.psz =                    (p_module->p_config[i].orig.psz != NULL)                        ? strdup (p_module->p_config[i].orig.psz) : NULL;            p_module->p_config[i].saved.psz = NULL;        }        else        {            memcpy (&p_module->p_config[i].value, &p_module->p_config[i].orig,                    sizeof (p_module->p_config[i].value));            memcpy (&p_module->p_config[i].saved, &p_module->p_config[i].orig,                    sizeof (p_module->p_config[i].saved));        }        p_module->p_config[i].b_dirty = false;        p_module->p_config[i].p_lock = &(vlc_internals(p_module)->lock);        if( p_module->p_config[i].i_list )        {            if( p_module->p_config[i].ppsz_list )            {                int j;                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 )            {                int j;                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 (int 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 (int 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 );    }    return VLC_SUCCESS; error:    return VLC_EGENERIC;}/***************************************************************************** * SavePluginsCache: saves the plugins cache to a file *****************************************************************************/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_cachedir = config_GetCacheDir();    FILE *file;    int i, j, i_cache;    module_cache_t **pp_cache;    uint32_t i_file_size = 0;    libvlc_global_data_t *p_libvlc_global = vlc_global();    if( !psz_cachedir ) /* XXX: this should never happen */    {        msg_Err( p_this, "unable to get cache directory" );        return;    }    char psz_filename[sizeof(DIR_SEP) + 32 + strlen(psz_cachedir)];    config_CreateDir( p_this, psz_cachedir );    snprintf( psz_filename, sizeof( psz_filename ),              "%s"DIR_SEP"CACHEDIR.TAG", psz_cachedir );    file = utf8_fopen( psz_filename, "wb" );    if (file != NULL)    {        if (fwrite (psz_tag, 1, sizeof (psz_tag) - 1, file) != 1)            clearerr (file); /* what else can we do? */        fclose( file );    }    snprintf( psz_filename, sizeof( psz_filename ),              "%s"DIR_SEP CACHENAME_FORMAT, psz_cachedir,              CACHENAME_VALUES );    free( psz_cachedir );    msg_Dbg( p_this, "writing plugins cache %s", psz_filename );    file = utf8_fopen( psz_filename, "wb" );    if (file == NULL)        goto error;    /* Empty space for file size */    if (fwrite (&i_file_size, sizeof (i_file_size), 1, file) != 1)        goto error;    /* Contains version number */    if (fputs ("cache "COPYRIGHT_MESSAGE, file) == EOF)        goto error;#ifdef DISTRO_VERSION    /* Allow binary maintaner to pass a string to detect new binary version*/    if (fputs( DISTRO_VERSION, file ) == EOF)        goto error;#endif    /* Sub-version number (to avoid breakage in the dev version when cache     * structure changes) */    i_file_size = CACHE_SUBVERSION_NUM;    if (fwrite (&i_file_size, sizeof (i_file_size), 1, file) != 1 )        goto error;    /* Language */    if (fprintf (file, "%5.5s", _("C")) == EOF)        goto error;    /* Header marker */    i_file_size = ftell( file );    if (fwrite (&i_file_size, sizeof (i_file_size), 1, file) != 1)        goto error;    i_cache = p_libvlc_global->p_module_bank->i_cache;    pp_cache = p_libvlc_global->p_module_bank->pp_cache;    if (fwrite( &i_cache, sizeof (i_cache), 1, file) != 1)        goto error;#define SAVE_IMMEDIATE( a ) \    if (fwrite (&a, sizeof(a), 1, file) != 1) \        goto error#define SAVE_STRING( a ) \    { \        uint16_t i_size = (a != NULL) ? (strlen (a) + 1) : 0; \        if ((fwrite (&i_size, sizeof (i_size), 1, file) != 1) \         || (a && (fwrite (a, 1, i_size, file) != i_size))) \            goto error; \    } while(0)    for( i = 0; i < i_cache; i++ )    {        uint32_t i_submodule;        /* Save common info */        SAVE_STRING( pp_cache[i]->psz_file );        SAVE_IMMEDIATE( pp_cache[i]->i_time );        SAVE_IMMEDIATE( pp_cache[i]->i_size );        SAVE_IMMEDIATE( pp_cache[i]->b_junk );        if( pp_cache[i]->b_junk ) continue;        /* Save additional infos */        SAVE_STRING( pp_cache[i]->p_module->psz_object_name );        SAVE_STRING( pp_cache[i]->p_module->psz_shortname );        SAVE_STRING( pp_cache[i]->p_module->psz_longname );        SAVE_STRING( pp_cache[i]->p_module->psz_help );        for( j = 0; j < MODULE_SHORTCUT_MAX; j++ )        {            SAVE_STRING( pp_cache[i]->p_module->pp_shortcuts[j] ); // FIX        }        SAVE_STRING( pp_cache[i]->p_module->psz_capability );        SAVE_IMMEDIATE( pp_cache[i]->p_module->i_score );        SAVE_IMMEDIATE( pp_cache[i]->p_module->i_cpu );        SAVE_IMMEDIATE( pp_cache[i]->p_module->b_unloadable );        SAVE_IMMEDIATE( pp_cache[i]->p_module->b_reentrant );        SAVE_IMMEDIATE( pp_cache[i]->p_module->b_submodule );        /* Config stuff */        if (CacheSaveConfig (pp_cache[i]->p_module, file))            goto error;        SAVE_STRING( pp_cache[i]->p_module->psz_filename );        i_submodule = vlc_internals( pp_cache[i]->p_module )->i_children;        SAVE_IMMEDIATE( i_submodule );        for( i_submodule = 0;             i_submodule < (unsigned)vlc_internals( pp_cache[i]->p_module)->i_children;             i_submodule++ )        {            module_t *p_module =                (module_t *)vlc_internals( pp_cache[i]->p_module )->pp_children[i_submodule];            SAVE_STRING( p_module->psz_object_name );            SAVE_STRING( p_module->psz_shortname );            SAVE_STRING( p_module->psz_longname );            SAVE_STRING( p_module->psz_help );            for( j = 0; j < MODULE_SHORTCUT_MAX; j++ )            {                SAVE_STRING( p_module->pp_shortcuts[j] ); // FIX            }            SAVE_STRING( p_module->psz_capability );            SAVE_IMMEDIATE( p_module->i_score );            SAVE_IMMEDIATE( p_module->i_cpu );            SAVE_IMMEDIATE( p_module->b_unloadable );            SAVE_IMMEDIATE( p_module->b_reentrant );        }    }    /* Fill-up file size */    i_file_size = ftell( file );    fseek( file, 0, SEEK_SET );    if (fwrite (&i_file_size, sizeof (i_file_size), 1, file) != 1)        goto error;    if (fclose (file) == 0)        return; /* success! */    file = NULL;error:    msg_Warn (p_this, "could not write plugins cache %s (%m)",              psz_filename);    if (file != NULL)    {        clearerr (file);        fclose (file);    }}static int CacheSaveConfig( module_t *p_module, FILE *file ){    uint32_t i_lines = p_module->confsize;    SAVE_IMMEDIATE( p_module->i_config_items );    SAVE_IMMEDIATE( p_module->i_bool_items );    SAVE_IMMEDIATE( i_lines );    for (size_t i = 0; i < i_lines ; i++)    {        SAVE_IMMEDIATE( p_module->p_config[i] );        SAVE_STRING( p_module->p_config[i].psz_type );        SAVE_STRING( p_module->p_config[i].psz_name );        SAVE_STRING( p_module->p_config[i].psz_text );        SAVE_STRING( p_module->p_config[i].psz_longtext );        SAVE_STRING( p_module->p_config[i].psz_oldname );        SAVE_IMMEDIATE( p_module->p_config[i].b_removed );        if (IsConfigStringType (p_module->p_config[i].i_type))            SAVE_STRING( p_module->p_config[i].orig.psz );        if( p_module->p_config[i].i_list )        {            if( p_module->p_config[i].ppsz_list )            {                for (int j = 0; j < p_module->p_config[i].i_list; j++)                    SAVE_STRING( p_module->p_config[i].ppsz_list[j] );            }            if( p_module->p_config[i].ppsz_list_text )            {                for (int j = 0; j < p_module->p_config[i].i_list; j++)                    SAVE_STRING( p_module->p_config[i].ppsz_list_text[j] );            }            if( p_module->p_config[i].pi_list )            {                for (int j = 0; j < p_module->p_config[i].i_list; j++)                    SAVE_IMMEDIATE( p_module->p_config[i].pi_list[j] );            }        }        for (int j = 0; j < p_module->p_config[i].i_action; j++)            SAVE_STRING( p_module->p_config[i].ppsz_action_text[j] );        SAVE_IMMEDIATE( p_module->p_config[i].pf_callback );    }    return 0;error:    return -1;}/***************************************************************************** * CacheMerge: Merge a cache module descriptor with a full module descriptor. *****************************************************************************/void CacheMerge( vlc_object_t *p_this, module_t *p_cache, module_t *p_module ){    int i_submodule;    (void)p_this;    p_cache->pf_activate = p_module->pf_activate;    p_cache->pf_deactivate = p_module->pf_deactivate;    p_cache->handle = p_module->handle;    for( i_submodule = 0; i_submodule < vlc_internals( p_module )->i_children; i_submodule++ )    {        module_t *p_child = (module_t*)vlc_internals( p_module )->pp_children[i_submodule];        module_t *p_cchild = (module_t*)vlc_internals( p_cache )->pp_children[i_submodule];        p_cchild->pf_activate = p_child->pf_activate;        p_cchild->pf_deactivate = p_child->pf_deactivate;    }    p_cache->b_loaded = true;    p_module->b_loaded = false;}/***************************************************************************** * CacheFind: finds the cache entry corresponding to a file *****************************************************************************/module_cache_t *CacheFind( const char *psz_file,                           int64_t i_time, int64_t i_size ){    module_cache_t **pp_cache;    int i_cache, i;    libvlc_global_data_t *p_libvlc_global = vlc_global();    pp_cache = p_libvlc_global->p_module_bank->pp_loaded_cache;    i_cache = p_libvlc_global->p_module_bank->i_loaded_cache;    for( i = 0; i < i_cache; i++ )    {        if( !strcmp( pp_cache[i]->psz_file, psz_file ) &&            pp_cache[i]->i_time == i_time &&            pp_cache[i]->i_size == i_size ) return pp_cache[i];    }    return NULL;}#endif /* HAVE_DYNAMIC_PLUGINS */

⌨️ 快捷键说明

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