Application
using Autodesk.DesignScript.Geometry.Properties;
using Autodesk.DesignScript.Interfaces;
using Autodesk.DesignScript.Runtime;
using System;
using System.Collections.Generic;
namespace Autodesk.DesignScript.Geometry
{
    [SupressImportIntoVM]
    public class Application
    {
        private static Application mInstance;
        private List<IDisposable> mToBeDisposedObjects = new List<IDisposable>();
        private IExecutionSession mSession;
        internal IExecutionSession Session => mSession;
        public static Application Instance {
            get {
                if (mInstance == null)
                    mInstance = new Application();
                return mInstance;
            }
        }
        public bool IsExecuting => mSession != null;
        private Application()
        {
            mInstance = this;
        }
        void OnBeginExecution(IExecutionSession session)
        {
            mSession = session;
            if (HostFactory.Instance != null && !HostFactory.ExtensionApplicationStarted) {
                foreach (IExtensionApplication extensionApplication in HostFactory.ExtensionApplications) {
                    if (extensionApplication != null)
                        extensionApplication.OnBeginExecution(session);
                }
                HostFactory.ExtensionApplicationStarted = true;
            }
            GeometrySettings.Reset();
            GeometrySettings.RootModulePath = session.get_Configuration().get_RootModulePath();
        }
        void OnEndExecution(IExecutionSession session)
        {
            if (HostFactory.Instance != null && HostFactory.ExtensionApplicationStarted) {
                foreach (IExtensionApplication extensionApplication in HostFactory.ExtensionApplications) {
                    if (extensionApplication != null)
                        extensionApplication.OnEndExecution(session);
                }
                HostFactory.ExtensionApplicationStarted = false;
            }
            if (mSession != null && mSession != session)
                throw new InvalidOperationException(Resources.SessionMismatchException);
            IDisposable[] array = null;
            lock (mToBeDisposedObjects) {
                array = mToBeDisposedObjects.ToArray();
                mToBeDisposedObjects.Clear();
            }
            IDisposable[] array2 = array;
            foreach (IDisposable disposable in array2) {
                disposable.Dispose();
            }
            mSession = null;
        }
        void OnSuspendExecution(IExecutionSession session)
        {
        }
        void OnResumeExecution(IExecutionSession session)
        {
        }
        public void StartUp(ExtensionStartupParams extParams)
        {
        }
        [Obsolete("Deprecated. Please use StartUp with ExtensionStartupParams argument instead.")]
        public void StartUp()
        {
        }
        public void ShutDown()
        {
        }
        public void PreloadAsmLibraries(string baseDirectory)
        {
        }
    }
}
            