📄 cache.c
字号:
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 + -