using Wayne.ForecourtControl.Fusion.ReadDeviceStatus; using Wayne.Lib; using Wayne.Lib.StateEngine; using Wayne.Lib.StateEngine.Generic; namespace Wayne.ForecourtControl.Fusion.StatusStateMachine.States { [TimeoutDescription(BasicTransitionType.Error)] [EventDescription(EventType.Response, "Success", BasicTransitionType.Done)] [EventDescription(EventType.Response, "Failure", BasicTransitionType.Error)] internal abstract class ReadFromFdcConfigurationBase : TimeoutState { private object _userToken; protected override void Enter(StateEntry stateEntry, ref Transition transition) { base.Enter(stateEntry, ref transition); MakeRequest(_userToken = new object()); } protected abstract void MakeRequest(object userToken); protected override void HandleNonTimeoutEvent(StateEngineEvent stateEngineEvent, ref Transition transition) { GenericEvent genericEvent = stateEngineEvent as GenericEvent; if (genericEvent != null && genericEvent.EventArgs.UserToken.Equals(_userToken)) { _userToken = null; genericEvent.Handled = true; if (genericEvent.EventArgs.Success) { genericEvent.EventArgs.WhenOfType((AsyncCompletedEventArgs args) => Response(args.Result)); transition = new Transition(this, BasicTransitionType.Done); } else { transition = new Transition(this, BasicTransitionType.Error); } } } protected abstract void Response(TServiceResponse args); protected override int TimeoutInterval { get { return 10000; } } protected override void Timeout(ref Transition transition) { transition = new Transition(this, BasicTransitionType.Error); } } }