fCraft.Config.Load C# (CSharp) Method

Load() public method

public Load ( string configFileName ) : bool
configFileName string
return bool
        public bool Load( string configFileName ) {
            // generate random salt
            Salt = new Random().Next();

            LoadDefaults();
            bool fromFile = false;

            // try to load config file (XML)
            XDocument file;
            if( File.Exists( configFileName ) ) {
                try {
                    file = XDocument.Load( configFileName );
                    if( file.Root == null || file.Root.Name != ConfigRootName ) {
                        Log( "Config.Load: Malformed or incompatible config file {0}. Loading defaults.", LogType.Warning, configFileName );
                        file = new XDocument();
                        file.Add( new XElement( ConfigRootName ) );
                    } else {
                        Log( "Config.Load: Config file {0} loaded succesfully.", LogType.Debug, configFileName );
                        fromFile = true;
                    }
                } catch( Exception ex ) {
                    Log( "Config.Load: Fatal error while loading config file {0}: {1}", LogType.FatalError,
                                        configFileName, ex.Message );
                    return false;
                }
            } else {
                // create a new one (with defaults) if no file exists
                file = new XDocument();
                file.Add( new XElement( ConfigRootName ) );
            }

            XElement config = file.Root;

            XAttribute attr = config.Attribute( "version" );
            int version;
            if( fromFile && (attr == null || !Int32.TryParse( attr.Value, out version ) || version < ConfigVersion) ) {
                Log( "Config.Load: Your config.xml was made for an older version of fCraft. " +
                    "Some obsolete settings might be ignored, and some recently-added settings will be set to their default values. " +
                    "It is recommended that you run ConfigTool to make sure everything is in order.", LogType.Warning );
            }


            XElement classList = config.Element( "Classes" );
            if( classList != null ) {
                foreach( XElement playerClass in classList.Elements( "PlayerClass" ) ) {
                    if( !DefineClass( playerClass ) ) {
                        Log( "Config.Load: Could not parse one of the class definitions.", LogType.Warning );
                    }
                }
                if( classes.classes.Count == 0 ) {
                    Log( "Config.Load: No classes were defined, or none were defined correctly. Using default player classes.", LogType.Warning );
                    config.Add( DefineDefaultClasses() );
                }
            } else {
                if( fromFile ) Log( "Config.Load: using default player classes.", LogType.Warning );
                config.Add( DefineDefaultClasses() );
            }

            // parse rank-limit permissions
            foreach( PlayerClass pc in classes.classesByIndex ) {
                if( !classes.ParseClassLimits( pc ) ) {
                    Log( "Could not parse one of the rank-limits for kick, ban, promote, and/or demote permissions for {0}. "+
                         "Any unrecognized limits were reset to default (own class).", LogType.Warning, pc.name );
                }
            }

            XElement consoleOptions = config.Element( "ConsoleOptions" );
            if( consoleOptions != null ) {
                ParseLogOptions( consoleOptions, ref logger.consoleOptions );
            } else {
                if( fromFile ) Log( "Config.Load: using default console options.", LogType.Warning );
                for( int i = 0; i < logger.consoleOptions.Length; i++ ) {
                    logger.consoleOptions[i] = true;
                }
                logger.consoleOptions[(int)LogType.ConsoleInput] = false;
                logger.consoleOptions[(int)LogType.Debug] = false;
            }

            XElement logFileOptions = config.Element( "LogFileOptions" );
            if( logFileOptions != null ) {
                ParseLogOptions( logFileOptions, ref logger.logFileOptions );
            } else {
                if( fromFile ) Log( "Config.Load: using default log file options.", LogType.Warning );
                for( int i = 0; i < logger.logFileOptions.Length; i++ ) {
                    logger.logFileOptions[i] = true;
                }
            }

            // Load config
            foreach( XElement element in config.Elements() ) {
                if( settings.ContainsKey( element.Name.ToString() ) ) {
                    // known key
                    SetValue( element.Name.ToString(), element.Value );
                } else if( element.Name.ToString() != "ConsoleOptions" &&
                    element.Name.ToString() != "LogFileOptions" &&
                    element.Name.ToString() != "Classes" ) {
                    // unknown key
                    Log( "Unrecognized entry ignored: {0} = {1}", LogType.Debug, element.Name, element.Value );
                    //TODO: custom settings store
                    //settings.Add( element.Name.ToString(), element.Value );
                }
            }
            return true;
        }