📄 file.c
字号:
***************************************************************************** * This will save the specified module's config options to the config file. * If psz_module_name is NULL then we save all the modules config options. * It's no use to save the config options that kept their default values, so * we'll try to be a bit clever here. * * When we save we mustn't delete the config options of the modules that * haven't been loaded. So we cannot just create a new config file with the * config structures we've got in memory. * I don't really know how to deal with this nicely, so I will use a completly * dumb method ;-) * I will load the config file in memory, but skipping all the sections of the * modules we want to save. Then I will create a brand new file, dump the file * loaded in memory and then append the sections of the modules we want to * save. * Really stupid no ? *****************************************************************************/static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, bool b_autosave ){ libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc); module_t *p_parser; vlc_list_t *p_list; FILE *file; char p_line[1024], *p_index2; int i_sizebuf = 0; char *p_bigbuffer, *p_index; bool b_backup; int i_index; /* Acquire config file lock */ vlc_mutex_lock( &priv->config_lock ); if( libvlc_priv (p_this->p_libvlc)->psz_configfile == NULL ) { char *psz_configdir = config_GetUserConfDir(); if( !psz_configdir ) /* XXX: This should never happen */ { msg_Err( p_this, "no configuration directory defined" ); vlc_mutex_unlock( &priv->config_lock ); return -1; } config_CreateDir( p_this, psz_configdir ); free( psz_configdir ); } file = config_OpenConfigFile( p_this, "rt" ); if( file != NULL ) { /* look for file size */ fseek( file, 0L, SEEK_END ); i_sizebuf = ftell( file ); fseek( file, 0L, SEEK_SET ); } p_bigbuffer = p_index = malloc( i_sizebuf+1 ); if( !p_bigbuffer ) { if( file ) fclose( file ); vlc_mutex_unlock( &priv->config_lock ); return -1; } p_bigbuffer[0] = 0; /* List all available modules */ p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); /* backup file into memory, we only need to backup the sections we won't * save later on */ b_backup = 0; while( file && fgets( p_line, 1024, file ) ) { if( (p_line[0] == '[') && (p_index2 = strchr(p_line,']'))) { /* we found a section, check if we need to do a backup */ for( i_index = 0; i_index < p_list->i_count; i_index++ ) { p_parser = (module_t *)p_list->p_values[i_index].p_object ; if( ((p_index2 - &p_line[1]) == (int)strlen(p_parser->psz_object_name) ) && !memcmp( &p_line[1], p_parser->psz_object_name, strlen(p_parser->psz_object_name) ) ) { if( !psz_module_name ) break; else if( !strcmp( psz_module_name, p_parser->psz_object_name ) ) break; } } if( i_index == p_list->i_count ) { /* we don't have this section in our list so we need to back * it up */ *p_index2 = 0;#if 0 msg_Dbg( p_this, "backing up config for unknown module \"%s\"", &p_line[1] );#endif *p_index2 = ']'; b_backup = 1; } else { b_backup = 0; } } /* save line if requested and line is valid (doesn't begin with a * space, tab, or eol) */ if( b_backup && (p_line[0] != '\n') && (p_line[0] != ' ') && (p_line[0] != '\t') ) { strcpy( p_index, p_line ); p_index += strlen( p_line ); } } if( file ) fclose( file ); /* * Save module config in file */ file = config_OpenConfigFile (p_this, "wt"); if( !file ) { vlc_list_release( p_list ); free( p_bigbuffer ); vlc_mutex_unlock( &priv->config_lock ); return -1; } fprintf( file, "\xEF\xBB\xBF###\n### " COPYRIGHT_MESSAGE "\n###\n\n" "###\n### lines beginning with a '#' character are comments\n###\n\n" ); /* Ensure consistent number formatting... */ locale_t loc = newlocale (LC_NUMERIC_MASK, "C", NULL); locale_t baseloc = uselocale (loc); /* Look for the selected module, if NULL then save everything */ for( i_index = 0; i_index < p_list->i_count; i_index++ ) { module_config_t *p_item, *p_end; p_parser = (module_t *)p_list->p_values[i_index].p_object ; if( psz_module_name && strcmp( psz_module_name, p_parser->psz_object_name ) ) continue; if( !p_parser->i_config_items ) continue; if( psz_module_name ) msg_Dbg( p_this, "saving config for module \"%s\"", p_parser->psz_object_name ); fprintf( file, "[%s]", p_parser->psz_object_name ); if( p_parser->psz_longname ) fprintf( file, " # %s\n\n", p_parser->psz_longname ); else fprintf( file, "\n\n" ); for( p_item = p_parser->p_config, p_end = p_item + p_parser->confsize; p_item < p_end; p_item++ ) { /* Do not save the new value in the configuration file * if doing an autosave, and the item is not an "autosaved" one. */ bool b_retain = b_autosave && !p_item->b_autosave; if ((p_item->i_type & CONFIG_HINT) /* ignore hint */ || p_item->b_removed /* ignore deprecated option */ || p_item->b_unsaveable) /* ignore volatile option */ continue; if (IsConfigIntegerType (p_item->i_type)) { int val = b_retain ? p_item->saved.i : p_item->value.i; if (p_item->i_type == CONFIG_ITEM_KEY) { char *psz_key = ConfigKeyToString (val); config_Write (file, p_item->psz_text, N_("key"), val == p_item->orig.i, p_item->psz_name, "%s", psz_key ? psz_key : ""); free (psz_key); } else config_Write (file, p_item->psz_text, (p_item->i_type == CONFIG_ITEM_BOOL) ? N_("boolean") : N_("integer"), val == p_item->orig.i, p_item->psz_name, "%d", val); p_item->saved.i = val; } else if (IsConfigFloatType (p_item->i_type)) { float val = b_retain ? p_item->saved.f : p_item->value.f; config_Write (file, p_item->psz_text, N_("float"), val == p_item->orig.f, p_item->psz_name, "%f", val); p_item->saved.f = val; } else { const char *psz_value = b_retain ? p_item->saved.psz : p_item->value.psz; bool modified; assert (IsConfigStringType (p_item->i_type)); if (b_retain && (psz_value == NULL)) /* FIXME: hack */ psz_value = p_item->orig.psz; modified = (psz_value != NULL) ? ((p_item->orig.psz != NULL) ? (strcmp (psz_value, p_item->orig.psz) != 0) : true) : (p_item->orig.psz != NULL); config_Write (file, p_item->psz_text, N_("string"), !modified, p_item->psz_name, "%s", psz_value ? psz_value : ""); if ( !b_retain ) { free ((char *)p_item->saved.psz); if( (psz_value && p_item->orig.psz && strcmp( psz_value, p_item->orig.psz )) || !psz_value || !p_item->orig.psz) p_item->saved.psz = strdupnull (psz_value); else p_item->saved.psz = NULL; } } if (!b_retain) p_item->b_dirty = false; } } vlc_list_release( p_list ); if (loc != (locale_t)0) { uselocale (baseloc); freelocale (loc); } /* * Restore old settings from the config in file */ fputs( p_bigbuffer, file ); free( p_bigbuffer ); fclose( file ); vlc_mutex_unlock( &priv->config_lock ); return 0;}int config_AutoSaveConfigFile( vlc_object_t *p_this ){ libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc); vlc_list_t *p_list; int i_index, i_count; assert( p_this ); /* Check if there's anything to save */ vlc_mutex_lock( &priv->config_lock ); p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE ); i_count = p_list->i_count; for( i_index = 0; i_index < i_count; i_index++ ) { module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object ; module_config_t *p_item, *p_end; if( !p_parser->i_config_items ) continue; for( p_item = p_parser->p_config, p_end = p_item + p_parser->confsize; p_item < p_end; p_item++ ) { if( p_item->b_autosave && p_item->b_dirty ) break; } if( p_item < p_end ) break; } vlc_list_release( p_list ); vlc_mutex_unlock( &priv->config_lock ); if( i_index == i_count ) return VLC_SUCCESS; return SaveConfigFile( p_this, 0, true );}int __config_SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name ){ return SaveConfigFile( p_this, psz_module_name, false );}/** * Get the user's configuration file when given with the --config option */char *config_GetCustomConfigFile( libvlc_int_t *p_libvlc ){ char *psz_configfile = config_GetPsz( p_libvlc, "config" ); if( psz_configfile != NULL ) { if( psz_configfile[0] == '~' && psz_configfile[1] == '/' ) { /* This is incomplete: we should also support the ~cmassiot/ syntax */ char *psz_buf; if( asprintf( &psz_buf, "%s/%s", config_GetHomeDir(), psz_configfile + 2 ) == -1 ) { free( psz_configfile ); return NULL; } free( psz_configfile ); psz_configfile = psz_buf; } } return psz_configfile;}int ConfigStringToKey( const char *psz_key ){ int i_key = 0; unsigned int i; const char *psz_parser = strchr( psz_key, '-' ); while( psz_parser && psz_parser != psz_key ) { for( i = 0; i < sizeof(vlc_modifiers) / sizeof(key_descriptor_t); i++ ) { if( !strncasecmp( vlc_modifiers[i].psz_key_string, psz_key, strlen( vlc_modifiers[i].psz_key_string ) ) ) { i_key |= vlc_modifiers[i].i_key_code; } } psz_key = psz_parser + 1; psz_parser = strchr( psz_key, '-' ); } for( i = 0; i < sizeof(vlc_keys) / sizeof( key_descriptor_t ); i++ ) { if( !strcasecmp( vlc_keys[i].psz_key_string, psz_key ) ) { i_key |= vlc_keys[i].i_key_code; break; } } return i_key;}char *ConfigKeyToString( int i_key ){ char *psz_key = malloc( 100 ); char *p; size_t index; if ( !psz_key ) { return NULL; } *psz_key = '\0'; p = psz_key; for( index = 0; index < (sizeof(vlc_modifiers) / sizeof(key_descriptor_t)); index++ ) { if( i_key & vlc_modifiers[index].i_key_code ) { p += sprintf( p, "%s-", vlc_modifiers[index].psz_key_string ); } } for( index = 0; index < (sizeof(vlc_keys) / sizeof( key_descriptor_t)); index++) { if( (int)( i_key & ~KEY_MODIFIER ) == vlc_keys[index].i_key_code ) { p += sprintf( p, "%s", vlc_keys[index].psz_key_string ); break; } } return psz_key;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -