using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using AspClassic.Scripting.Hosting.Configuration; using AspClassic.Scripting.Runtime; using AspClassic.Scripting.Utils; namespace AspClassic.Scripting.Hosting; [Serializable] public sealed class ScriptRuntimeSetup { private Type _hostType; private IList _hostArguments; private IList _languageSetups; private bool _debugMode; private bool _privateBinding; private IDictionary _options; private bool _frozen; public IList LanguageSetups => _languageSetups; public bool DebugMode { get { return _debugMode; } set { CheckFrozen(); _debugMode = value; } } public bool PrivateBinding { get { return _privateBinding; } set { CheckFrozen(); _privateBinding = value; } } public Type HostType { get { return _hostType; } set { ContractUtils.RequiresNotNull(value, "value"); ContractUtils.Requires(typeof(ScriptHost).IsAssignableFrom(value), "value", "Must be ScriptHost or a derived type of ScriptHost"); CheckFrozen(); _hostType = value; } } public IDictionary Options => _options; public IList HostArguments { get { return _hostArguments; } set { ContractUtils.RequiresNotNull(value, "value"); CheckFrozen(); _hostArguments = value; } } public ScriptRuntimeSetup() { _languageSetups = new List(); _options = new Dictionary(); _hostType = typeof(ScriptHost); _hostArguments = ArrayUtils.EmptyObjects; } internal DlrConfiguration ToConfiguration() { ContractUtils.Requires(_languageSetups.Count > 0, "ScriptRuntimeSetup must have at least one LanguageSetup"); ReadOnlyCollection readOnlyCollection = new ReadOnlyCollection(ArrayUtils.MakeArray(_languageSetups)); ReadOnlyCollection hostArguments = new ReadOnlyCollection(ArrayUtils.MakeArray(_hostArguments)); AspClassic.Scripting.Utils.ReadOnlyDictionary options = new AspClassic.Scripting.Utils.ReadOnlyDictionary(new Dictionary(_options)); DlrConfiguration dlrConfiguration = new DlrConfiguration(_debugMode, _privateBinding, options); foreach (LanguageSetup item in readOnlyCollection) { dlrConfiguration.AddLanguage(item.TypeName, item.DisplayName, item.Names, item.FileExtensions, item.Options); } _languageSetups = readOnlyCollection; _options = options; _hostArguments = hostArguments; Freeze(readOnlyCollection); return dlrConfiguration; } private void Freeze(ReadOnlyCollection setups) { foreach (LanguageSetup setup in setups) { setup.Freeze(); } _frozen = true; } private void CheckFrozen() { if (_frozen) { throw new InvalidOperationException("Cannot modify ScriptRuntimeSetup after it has been used to create a ScriptRuntime"); } } public static ScriptRuntimeSetup ReadConfiguration() { ScriptRuntimeSetup scriptRuntimeSetup = new ScriptRuntimeSetup(); Section.LoadRuntimeSetup(scriptRuntimeSetup, null); return scriptRuntimeSetup; } public static ScriptRuntimeSetup ReadConfiguration(Stream configFileStream) { ContractUtils.RequiresNotNull(configFileStream, "configFileStream"); ScriptRuntimeSetup scriptRuntimeSetup = new ScriptRuntimeSetup(); Section.LoadRuntimeSetup(scriptRuntimeSetup, configFileStream); return scriptRuntimeSetup; } public static ScriptRuntimeSetup ReadConfiguration(string configFilePath) { ContractUtils.RequiresNotNull(configFilePath, "configFilePath"); using FileStream configFileStream = File.OpenRead(configFilePath); return ReadConfiguration(configFileStream); } }