corrade-vassal – Rev 7

Subversion Repositories:
Rev:
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2015 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace Vassal
{
    /// <summary>
    ///     Possible input and output filters.
    /// </summary>
    public enum Filter : uint
    {
        [XmlEnum(Name = "none")]
        [Description("none")]
        NONE = 0,
        [XmlEnum(Name = "RFC1738")]
        [Description("RFC1738")]
        RFC1738,
        [XmlEnum(Name = "RFC3986")]
        [Description("RFC3986")]
        RFC3986,
        [XmlEnum(Name = "ENIGMA")]
        [Description("ENIGMA")]
        ENIGMA,
        [XmlEnum(Name = "VIGENERE")]
        [Description("VIGENERE")]
        VIGENERE,
        [XmlEnum(Name = "ATBASH")]
        [Description("ATBASH")]
        ATBASH,
        [XmlEnum(Name = "BASE64")]
        [Description("BASE64")]
        BASE64
    }

    /// <summary>
    ///     ENIGMA machine settings.
    /// </summary>
    public struct ENIGMA
    {
        public char[] plugs;
        public char reflector;
        public char[] rotors;
    }
    
    [Serializable]
    public class VassalConfiguration
    {
        private static readonly object VassalConfigurationLock = new object();

        private string _HTTPServerURL = @"http://127.0.0.1:8080/";
        private string _group = string.Empty;
        private string _password = string.Empty;

        private ENIGMA _enigma = new ENIGMA
        {
            rotors = new[] { '3', 'g', '1' },
            plugs = new[] { 'z', 'p', 'q' },
            reflector = 'b'
        };
        private List<Filter> _inputFilters = new List<Filter>();
        private List<Filter> _outputFilters = new List<Filter>();
        private string _vigenereSecret = string.Empty;
        private uint _teleportTimeout = 30000;
        private uint _dataTimeout = 15000;
        private uint _regionRestartDelay = 120;

        public string Group
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return _group;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _group = value;
                }
            }
        }

        public string Password
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return _password;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _password = value;
                }
            }
        }

        public ENIGMA ENIGMA
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return _enigma;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _enigma = value;
                }
            }
        }

        public string VIGENERESecret
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return _vigenereSecret;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _vigenereSecret = value;
                }
            }
        }

        public List<Filter> InputFilters
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return !_inputFilters.Any() ? new List<Filter> { Filter.RFC1738 } : _inputFilters;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _inputFilters = value;
                }
            }
        }

        public List<Filter> OutputFilters
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return !_outputFilters.Any() ? new List<Filter> { Filter.RFC1738 } : _outputFilters;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _outputFilters = value;
                }
            }
        }

        public string HTTPServerURL
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return _HTTPServerURL;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _HTTPServerURL = value;
                }
            }
        }

        public uint TeleportTimeout
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return _teleportTimeout;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _teleportTimeout = value;
                }
            }
        }

        public uint DataTimeout
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return _dataTimeout;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _dataTimeout = value;
                }
            }
        }

        public uint RegionRestartDelay
        {
            get
            {
                lock (VassalConfigurationLock)
                {
                    return _regionRestartDelay;
                }
            }
            set
            {
                lock (VassalConfigurationLock)
                {
                    _regionRestartDelay = value;
                }
            }
        }

        public static void Save(string file, ref VassalConfiguration configuration)
        {
            lock (VassalConfigurationLock)
            {
                using (StreamWriter writer = new StreamWriter(file, false, Encoding.UTF8))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(VassalConfiguration));
                    serializer.Serialize(writer, configuration);
                    //writer.Flush();
                }
            }
        }

        public static void Load(string file, ref VassalConfiguration configuration)
        {
            lock (VassalConfigurationLock)
            {
                using (StreamReader stream = new StreamReader(file, Encoding.UTF8))
                {
                    XmlSerializer serializer =
                        new XmlSerializer(typeof(VassalConfiguration));
                    configuration = (VassalConfiguration)serializer.Deserialize(stream);
                }
            }
        }
    }
}