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

📄 cache.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * cache.c: Plugins cache ***************************************************************************** * Copyright (C) 2001-2007 the VideoLAN team * $Id: f1a6a6206d7e41d3a21f8a460f215d5fc90dc06b $ * * Authors: Sam Hocevar <sam@zoy.org> *          Ethan C. Baldridge <BaldridgeE@cadmus.com> *          Hans-Peter Jansen <hpj@urpla.net> *          Gildas Bazin <gbazin@videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * 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 <vlc_common.h>#include "libvlc.h"#include <stdlib.h>                                      /* free(), strtol() */#include <stdio.h>                                              /* sprintf() */#include <string.h>                                              /* strdup() */#include <vlc_plugin.h>#ifdef HAVE_SYS_TYPES_H#   include <sys/types.h>#endif#ifdef HAVE_UNISTD_H#   include <unistd.h>#endif#if !defined(HAVE_DYNAMIC_PLUGINS)    /* no support for plugins */#elif defined(HAVE_DL_DYLD)#   if defined(HAVE_MACH_O_DYLD_H)#       include <mach-o/dyld.h>#   endif#elif defined(HAVE_DL_BEOS)#   if defined(HAVE_IMAGE_H)#       include <image.h>#   endif#elif defined(HAVE_DL_WINDOWS)#   include <windows.h>#elif defined(HAVE_DL_DLOPEN)#   if defined(HAVE_DLFCN_H) /* Linux, BSD, Hurd */#       include <dlfcn.h>#   endif#   if defined(HAVE_SYS_DL_H)#       include <sys/dl.h>#   endif#elif defined(HAVE_DL_SHL_LOAD)#   if defined(HAVE_DL_H)#       include <dl.h>#   endif#endif#include "config/configuration.h"#include "vlc_charset.h"#include "modules/modules.h"/***************************************************************************** * Local prototypes *****************************************************************************/#ifdef HAVE_DYNAMIC_PLUGINSstatic int    CacheLoadConfig  ( module_t *, FILE * );static int    CacheSaveConfig  ( module_t *, FILE * );/* Sub-version number * (only used to avoid breakage in dev version when cache structure changes) */#define CACHE_SUBVERSION_NUM 3/* Format string for the cache filename */#define CACHENAME_FORMAT \    "plugins-%.2zx%.2zx%.2"PRIx8".dat"/* Magic for the cache filename */#define CACHENAME_VALUES \    sizeof(int), sizeof(void *), *(uint8_t *)&(uint16_t){ 0xbe1e }/***************************************************************************** * LoadPluginsCache: loads the plugins cache file ***************************************************************************** * This function will load the plugin cache if present and valid. This cache * will in turn be queried by AllocateAllPlugins() to see if it needs to * actually load the dynamically loadable module. * This allows us to only fully load plugins when they are actually used. *****************************************************************************/void CacheLoad( vlc_object_t *p_this ){    char *psz_filename, *psz_cachedir = config_GetCacheDir();    FILE *file;    int i, j, i_size, i_read;    char p_cachestring[sizeof("cache " COPYRIGHT_MESSAGE)];    char p_cachelang[6], p_lang[6];    int i_cache;    module_cache_t **pp_cache = 0;    int32_t i_file_size, i_marker;    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;    }    if( asprintf( &psz_filename, "%s"DIR_SEP CACHENAME_FORMAT,                  psz_cachedir, CACHENAME_VALUES ) == -1 )    {        free( psz_cachedir );        return;    }    free( psz_cachedir );    if( p_libvlc_global->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 );        free( psz_filename );        return;    }    msg_Dbg( p_this, "loading plugins cache file %s", psz_filename );    file = utf8_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, 1, 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("cache " COPYRIGHT_MESSAGE) - 1;    i_read = fread( p_cachestring, 1, i_size, file );    if( i_read != i_size ||        memcmp( p_cachestring, "cache " COPYRIGHT_MESSAGE, i_size ) )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache" );        fclose( file );        return;    }#ifdef DISTRO_VERSION    /* Check for distribution specific version */    char p_distrostring[sizeof( DISTRO_VERSION )];    i_size = sizeof( DISTRO_VERSION ) - 1;    i_read = fread( p_distrostring, 1, i_size, file );    if( i_read != i_size ||        memcmp( p_distrostring, DISTRO_VERSION, i_size ) )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache" );        fclose( file );        return;    }#endif    /* Check Sub-version number */    i_read = fread( &i_marker, 1, 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, 1, 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, 1, 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_libvlc_global->p_module_bank->i_loaded_cache = 0;    if (fread( &i_cache, 1, sizeof(i_cache), file ) != sizeof(i_cache) )    {        msg_Warn( p_this, "This doesn't look like a valid plugins cache "                  "(file too short)" );        fclose( file );        return;    }    if( i_cache )        pp_cache = p_libvlc_global->p_module_bank->pp_loaded_cache =                   malloc( i_cache * sizeof(void *) );#define LOAD_IMMEDIATE(a) \    if( fread( (void *)&a, sizeof(char), sizeof(a), file ) != sizeof(a) ) goto error#define LOAD_STRING(a) \{ \    a = NULL; \    if( ( fread( &i_size, sizeof(i_size), 1, file ) != 1 ) \     || ( i_size > 16384 ) ) \        goto error; \    if( i_size ) { \        char *psz = malloc( i_size ); \        if( fread( psz, i_size, 1, file ) != 1 ) { \            free( psz ); \            goto error; \        } \        if( psz[i_size-1] ) { \            free( psz ); \            goto error; \        } \        a = psz; \    } \}    for( i = 0; i < i_cache; i++ )    {        uint16_t i_size;        int i_submodules;        pp_cache[i] = malloc( sizeof(module_cache_t) );        p_libvlc_global->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 );        pp_cache[i]->b_used = false;        if( pp_cache[i]->b_junk ) continue;        pp_cache[i]->p_module = vlc_module_create( p_this );        /* Load additional infos */        free( pp_cache[i]->p_module->psz_object_name );        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_help );        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_submodule_create( pp_cache[i]->p_module );            free( p_module->psz_object_name );            LOAD_STRING( p_module->psz_object_name );            LOAD_STRING( p_module->psz_shortname );            LOAD_STRING( p_module->psz_longname );            LOAD_STRING( p_module->psz_help );            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_libvlc_global->p_module_bank->i_loaded_cache = 0;    fclose( file );    return;}static int CacheLoadConfig( module_t *p_module, FILE *file ){    uint32_t i_lines;    uint16_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 */    if (i_lines)    {        p_module->p_config =            (module_config_t *)calloc( i_lines, sizeof(module_config_t) );        if( p_module->p_config == NULL )        {            p_module->confsize = 0;            return VLC_ENOMEM;        }    }

⌨️ 快捷键说明

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