public bool RequestEventFire(ITransitionInvoker <TState> transitionInvoker, bool overrideNoThrow) { this.EnsureCurrentStateSuitableForTransition(); bool success; // Try and fire it on the child state machine - see if that works // If we got to here, this.CurrentState != null var childStateMachine = this.CurrentState.ChildStateMachine; if (childStateMachine != null && childStateMachine.RequestEventFire(transitionInvoker, overrideNoThrow: true)) { success = true; } else { // No? Invoke it on ourselves success = transitionInvoker.TryInvoke(this.CurrentState); if (!success) { this.HandleTransitionNotFound(transitionInvoker.Event, throwException: !overrideNoThrow && transitionInvoker.EventFireMethod == EventFireMethod.Fire); } } return(success); }
private bool ForceTransitionFromUserImpl(ITransitionInvoker <TState> transitionInvoker) { transitionInvoker.TryInvoke(this.CurrentState); return(true); //this.Kernel.CoordinateTransition(this.CurrentState, toState, @event, false, null); //return true; }
public void ForceTransitionFromUser(ITransitionInvoker <TState> transitionInvoker) { if (this.Kernel.Synchronizer != null) { this.Kernel.Synchronizer.ForceTransition(() => this.InvokeTransition(this.ForceTransitionFromUserImpl, transitionInvoker)); } else { this.InvokeTransition(this.ForceTransitionFromUserImpl, transitionInvoker); } }
// invoker: Action which actually triggers the transition. Takes the state to transition from, and returns whether the transition was found public bool RequestEventFireFromEvent(ITransitionInvoker <TState> transitionInvoker) { // TODO: I don't like how many delegates are created here if (this.Kernel.Synchronizer != null) { return(this.Kernel.Synchronizer.FireEvent(() => this.InvokeTransition(this.RequestEventFire, transitionInvoker), transitionInvoker.EventFireMethod)); } else { return(this.InvokeTransition(this.RequestEventFire, transitionInvoker)); } }
bool IStateMachine <State> .RequestEventFire(ITransitionInvoker <State> transitionInvoker, bool overrideNoThrow) { return(this.InnerStateMachine.RequestEventFire(transitionInvoker, overrideNoThrow)); }
public TransitionQueueItem(Func <ITransitionInvoker <TState>, bool> method, ITransitionInvoker <TState> transitionInvoker) { this.method = method; this.transitionInvoker = transitionInvoker; }
public void EnqueueTransition(Func <ITransitionInvoker <TState>, bool> method, ITransitionInvoker <TState> invoker) { this.transitionQueue.Enqueue(new TransitionQueueItem(method, invoker)); }
private bool InvokeTransition(Func <ITransitionInvoker <TState>, bool> method, ITransitionInvoker <TState> transitionInvoker) { if (this.Kernel.Fault != null) { throw new StateMachineFaultedException(this.Kernel.Fault); } if (this.Kernel.ExecutingTransition) { this.Kernel.EnqueueTransition(method, transitionInvoker); return(true); } bool success; try { this.Kernel.ExecutingTransition = true; success = method(transitionInvoker); } catch (InternalTransitionFaultException e) { var faultInfo = new StateMachineFaultInfo(this.outerStateMachine, e.FaultedComponent, e.InnerException, e.From, e.To, e.Event, e.Group); this.Kernel.SetFault(faultInfo); throw new TransitionFailedException(faultInfo); } finally { this.Kernel.ExecutingTransition = false; } this.Kernel.FireQueuedTransitions(); return(success); }
private bool RequestEventFire(ITransitionInvoker <TState> transitionInvoker) { return(this.RequestEventFire(transitionInvoker, overrideNoThrow: false)); }