123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- using System;
- using System.Globalization;
- using Wayne.Lib.Log;
- namespace Wayne.Lib.StateEngine
- {
-
-
-
- public enum HistoryType
- {
- #region Fields
-
-
-
- None,
-
-
-
-
-
-
- Shallow,
-
-
-
-
-
- Deep,
-
-
-
-
- Explicit
- #endregion
- }
-
-
-
-
- public enum StateType
- {
- #region Fields
-
-
-
- InitialState,
-
-
-
- PseudoState,
-
-
-
- State,
-
-
-
- CompositeState,
-
-
-
- FinalState
- #endregion
- }
-
-
-
- abstract public class State : IDisposable
- {
- #region Fields
- private Wayne.Lib.StateEngine.StateMachine parentStateMachine;
- private string createdByFactory = "";
- private bool active;
- private CompositeState parentState;
- private IDebugLogger debugLogger;
- private object logCategory;
- private string instanceName;
- private string factoryName;
- #endregion
- #region Methods
-
-
-
-
-
-
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "1#")]
- protected virtual void Enter(StateEntry stateEntry, ref Transition transition)
- {
- }
-
-
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "Wayne.Lib.StateEngine.State.DebugLog(System.String)")]
- protected virtual void Exit()
- {
- }
-
-
-
-
-
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "1#")]
- protected virtual void HandleEvent(StateEngineEvent stateEngineEvent, ref Transition transition)
- {
- }
-
-
-
-
-
- protected virtual void ActivateTimer(Timer timer)
- {
- if (parentStateMachine != null)
- parentStateMachine.ActivateTimer(timer);
- }
-
-
-
-
- protected virtual void Dispose(bool disposing)
- {
-
- }
-
-
-
- protected void ClearPendingEvents()
- {
- this.parentStateMachine.ClearPendingEvents();
- }
-
-
-
-
- protected void RemovePendingEventsOfType(object eventType)
- {
- this.parentStateMachine.RemovePendingEventsOfType(eventType);
- }
-
-
-
-
-
-
- protected void RemovePendingEvents<TComparisonObject>(StateEngineEventPredicate<TComparisonObject> predicate, TComparisonObject comparisonObject)
- {
- this.ParentStateMachine.RemovePendingEvents(predicate, comparisonObject);
- }
-
-
-
- public void Dispose()
- {
- Dispose(true);
- }
- #endregion
- #region Internal Methods
-
-
-
-
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "Wayne.Lib.StateEngine.State.DebugLog(System.String)")]
- internal virtual void IncomingEvent(StateEngineEvent stateEngineEvent, ref Transition transition)
- {
- try
- {
- if (!(this is CompositeState))
- {
- if ((debugLogger != null) && (debugLogger.IsActive(logCategory)))
- debugLogger.Add(string.Format(System.Globalization.CultureInfo.InvariantCulture, " [{0}] HandleEvent: {1}", this.LogName, stateEngineEvent), logCategory);
- }
- if (!stateEngineEvent.Handled)
- {
-
- HandleEvent(stateEngineEvent, ref transition);
- }
-
- if (transition != null)
- transition.WritableSourceEvent = stateEngineEvent;
- }
- catch (Exception exception)
- {
- if ((debugLogger != null) && (debugLogger.IsActive(logCategory)))
- {
- System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
- stringBuilder.Append("EXCEPTION IN HandleEvent (");
- stringBuilder.Append(this.LogName);
- stringBuilder.Append(")\r\n");
- stringBuilder.Append(exception.ToString());
- debugLogger.Add(stringBuilder, logCategory);
- }
- transition = new ExceptionTransition(this, BasicTransitionType.Error, exception);
- }
- #if WindowsCE
- catch
- {
- if ((debugLogger != null) && (debugLogger.IsActive(logCategory)))
- {
- debugLogger.Add("Unknown exception in HandleEvent (" + this.LogName + ")");
- }
- transition = new Transition(this, BasicTransitionType.Error);
- }
- #endif
- }
-
-
-
-
-
-
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "Wayne.Lib.StateEngine.State.DebugLog(System.String)")]
- internal virtual void PerformEnter(StateEntry stateEntry, ref Transition transition)
- {
- active = true;
- try
- {
- if (!(this is CompositeState))
- if ((debugLogger != null) && (debugLogger.IsActive(logCategory)))
- debugLogger.Add(string.Format(System.Globalization.CultureInfo.InvariantCulture, " [{0}] Enter: Transition={1}", this.LogName, stateEntry.SourceTransition.Name), logCategory);
-
- Enter(stateEntry, ref transition);
-
- if (transition != null)
- if ((stateEntry != null) && (stateEntry.SourceTransition != null))
- transition.WritableSourceEvent = stateEntry.SourceTransition.SourceEvent;
- }
- catch (Exception exception)
- {
- if ((debugLogger != null) && (debugLogger.IsActive(logCategory)))
- {
- System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
- stringBuilder.Append("EXCEPTION IN Enter (");
- stringBuilder.Append(this.LogName);
- stringBuilder.Append(")\r\n");
- stringBuilder.Append(exception.ToString());
- debugLogger.Add(stringBuilder.ToString(), logCategory);
- }
- transition = new ExceptionTransition(this, BasicTransitionType.Error, exception);
- }
- #if WindowsCE
- catch
- {
- if ((debugLogger != null) && (debugLogger.IsActive(logCategory)))
- debugLogger.Add("Unknown exception in Enter (" + this.LogName + ")");
- transition = new Transition(this, BasicTransitionType.Error);
- }
- #endif
- }
-
-
-
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "Wayne.Lib.StateEngine.State.DebugLog(System.String)")]
- internal virtual void PerformExit()
- {
- active = false;
- try
- {
- Exit();
- }
- catch (Exception exception)
- {
- if ((debugLogger != null) && (debugLogger.IsActive(logCategory)))
- {
- System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
- stringBuilder.Append("EXCEPTION IN Exit (");
- stringBuilder.Append(this.LogName);
- stringBuilder.Append(")\r\n");
- stringBuilder.Append(exception.ToString());
- debugLogger.Add(stringBuilder, logCategory);
- }
- }
- #if WindowsCE
- catch
- {
- if ((debugLogger != null) && (debugLogger.IsActive(logCategory)))
- debugLogger.Add("Unknown exception in Exit (" + this.LogName + ")");
- }
- #endif
- }
-
-
-
-
-
-
-
- internal virtual bool LookupState(string stateFactoryName)
- {
- return (stateFactoryName == this.FactoryName);
- }
- internal void AssignParentState(CompositeState parentState)
- {
- this.parentState = parentState;
- }
- #endregion
- #region Properties
-
-
-
- public string FactoryName
- {
- get
- {
- return factoryName;
- }
- }
-
-
-
- internal string WritableFactoryName
- {
- get { return factoryName; }
- set { this.factoryName = value; }
- }
-
-
-
-
- public string InstanceName
- {
- get
- {
- if (instanceName != null)
- {
- return instanceName;
- }
-
- if (parentState != null)
- {
- return instanceName = string.Format("{0}.{1}", parentState.InstanceName, this.Name);
- }
-
- return instanceName = string.Format("{0}.{1}", ParentStateMachine.Name, Name);
- }
- }
- public virtual string Name
- {
- get { return this.GetType().Name; }
- }
-
-
-
- public string LogName
- {
- get
- {
- if (parentStateMachine != null)
- {
- switch (parentStateMachine.LogNameKind)
- {
- case StateNameKind.FactoryName: return FactoryName;
- case StateNameKind.InstanceName: return InstanceName;
- }
- }
- return FactoryName;
- }
- }
-
-
-
- public string CreatedByFactory
- {
- get
- {
- return createdByFactory;
- }
- set
- {
- createdByFactory = value;
- }
- }
-
-
-
- public bool Active
- {
- get
- {
- return active;
- }
- }
-
-
-
-
- public CompositeState ParentState
- {
- get { return parentState; }
- }
-
-
-
- public StateType StateType
- {
- get
- {
- if (this is InitialState)
- return StateType.InitialState;
- else if (this is FinalState)
- return StateType.FinalState;
- else if (this is PseudoState)
- return StateType.PseudoState;
- else if (this is CompositeState)
- return StateType.CompositeState;
- return StateType.State;
- }
- }
-
-
-
- public StateMachine ParentStateMachine
- {
- get { return parentStateMachine; }
- }
-
-
-
-
- public virtual string ApplicationText
- {
- get;
- set;
- }
- #endregion
- #region Internal properties
-
-
-
- internal virtual void SetParentStateMachine(StateMachine parentStateMachine)
- {
- this.parentStateMachine = parentStateMachine;
- }
-
-
-
-
-
- internal virtual void SetDebugLogger(IDebugLogger debugLogger, object logCategory)
- {
- this.debugLogger = debugLogger;
- this.logCategory = logCategory;
- }
- #endregion
-
-
-
-
-
-
- protected void DebugLog(string format, params object[] @params)
- {
- try
- {
- if (debugLogger.IsActive())
- {
- var message = @params != null && @params.Length > 0 ?
- string.Format(CultureInfo.InvariantCulture, format, @params) :
- format;
- debugLogger.Add(message);
- }
- }
- catch (FormatException)
- {
- if (debugLogger.IsActive())
- debugLogger.Add("LOGERROR: Could not format string: " + format);
- }
- }
-
-
-
-
-
-
- protected void DebugLogDetailed(string format, params object[] @params)
- {
- try
- {
- if (debugLogger.IsActive(DebugLogLevel.Detailed))
- {
- var message = @params != null && @params.Length > 0 ?
- string.Format(CultureInfo.InvariantCulture, format, @params) :
- format;
- debugLogger.Add(message, DebugLogLevel.Detailed);
- }
- }
- catch (FormatException)
- {
- if (debugLogger.IsActive(DebugLogLevel.Detailed))
- debugLogger.Add("LOGERROR: Could not format string: " + format, DebugLogLevel.Detailed);
- }
- }
-
-
-
-
-
-
- protected void DebugLogMaximized(string format, params object[] @params)
- {
- try
- {
- if (debugLogger.IsActive(DebugLogLevel.Detailed))
- {
- var message = @params != null && @params.Length > 0 ?
- string.Format(CultureInfo.InvariantCulture, format, @params) :
- format;
- debugLogger.Add(message, DebugLogLevel.Maximized);
- }
- }
- catch (FormatException)
- {
- if (debugLogger.IsActive(DebugLogLevel.Detailed))
- debugLogger.Add("LOGERROR: Could not format string: " + format, DebugLogLevel.Maximized);
- }
- }
- }
- }
|