178 lines
3.0 KiB
C#
178 lines
3.0 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Xml;
|
|
using System.Reflection;
|
|
|
|
/*
|
|
|
|
TODO:
|
|
x)
|
|
|
|
*/
|
|
|
|
namespace lib
|
|
{
|
|
|
|
public class DescAttribute : Attribute
|
|
{
|
|
public string Desc { get; private set; }
|
|
|
|
public DescAttribute( string desc )
|
|
{
|
|
Desc = desc;
|
|
}
|
|
}
|
|
|
|
[Serializable]
|
|
public class ConfigCfg : Config
|
|
{
|
|
public readonly bool writeOutTemplateFiles = true;
|
|
}
|
|
|
|
public interface ConfigBase
|
|
{
|
|
|
|
}
|
|
|
|
public record class ConfigRec : ConfigBase
|
|
{
|
|
|
|
}
|
|
|
|
public class Config : ConfigBase
|
|
{
|
|
|
|
//private int _test = 0;
|
|
|
|
private static ConfigCfg s_cfg = new();
|
|
|
|
static public void startup( string filename )
|
|
{
|
|
res.Mgr.register( load );
|
|
res.Mgr.registerSub( typeof( ConfigBase ) );
|
|
|
|
s_cfg = load<ConfigCfg>( filename );
|
|
|
|
}
|
|
|
|
|
|
#region SaveLoad
|
|
|
|
static public T res_load<T>( string filename ) where T : Config
|
|
{
|
|
return load<T>( filename );
|
|
}
|
|
|
|
static public Config load( string filename )
|
|
{
|
|
return load( filename, null );
|
|
}
|
|
|
|
static public T load<T>( string filename ) where T : Config
|
|
{
|
|
return (T)load( filename, typeof( T ) );
|
|
}
|
|
|
|
static public Config load( string filename, Type t )
|
|
{
|
|
Config cfg = null;
|
|
|
|
try
|
|
{
|
|
if( File.Exists( filename ) )
|
|
{
|
|
FileStream fs = new FileStream( filename, FileMode.Open, FileAccess.Read );
|
|
|
|
XmlFormatter2 formatter = new XmlFormatter2();
|
|
|
|
cfg = (Config)( t != null ? formatter.DeserializeKnownType( fs, t ) : formatter.Deserialize( fs ) );
|
|
|
|
cfg.SetFilename( filename );
|
|
}
|
|
else
|
|
{
|
|
cfg = CreateTemplate( filename, t );
|
|
}
|
|
}
|
|
catch( IOException )
|
|
{
|
|
cfg = CreateTemplate( filename, t );
|
|
}
|
|
|
|
return cfg;
|
|
}
|
|
|
|
private static Config CreateTemplate( string filename, Type t )
|
|
{
|
|
Type[] types = new Type[0];
|
|
object[] parms = new object[0];
|
|
|
|
//types[ 0 ] = typeof( string );
|
|
//parms[ 0 ] = filename;
|
|
Config cfg = null;
|
|
|
|
ConstructorInfo cons = t?.GetConstructor( types );
|
|
|
|
try
|
|
{
|
|
cfg = (Config)cons?.Invoke( parms );
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
log.error( $"Exception while creating config {t.ToString()}, Msg {e.Message}" );
|
|
}
|
|
|
|
//cfg.SetFilename( filename );
|
|
|
|
if( s_cfg.writeOutTemplateFiles )
|
|
{
|
|
var templateFile = $"templates/{filename}";
|
|
|
|
var dirName = Path.GetDirectoryName( templateFile );
|
|
|
|
Util.checkAndAddDirectory( dirName );
|
|
|
|
log.info( $"Writing out template config of type {t?.Name} in {templateFile}" );
|
|
|
|
save( cfg, templateFile );
|
|
}
|
|
|
|
return cfg;
|
|
}
|
|
|
|
static public void save( Config cfg )
|
|
{
|
|
save( cfg, cfg._filename );
|
|
}
|
|
|
|
static public void save( Config cfg, String filename )
|
|
{
|
|
FileStream fs = new( filename, FileMode.Create, FileAccess.Write );
|
|
|
|
XmlFormatter2 formatter = new();
|
|
|
|
formatter.Serialize( fs, cfg );
|
|
|
|
fs.Close();
|
|
}
|
|
#endregion
|
|
|
|
private string _filename = "{unknown}";
|
|
|
|
public Config()
|
|
{
|
|
}
|
|
|
|
public Config( string filename )
|
|
{
|
|
_filename = filename;
|
|
}
|
|
|
|
public String Filename { get { return _filename; } }
|
|
|
|
protected void SetFilename( String filename ) { _filename = filename; }
|
|
|
|
}
|
|
}
|
|
|