Esempio n. 1
0
        static void AddTransitionData(NativeActivityMetadata metadata, InternalTransition internalTransition, Transition transition)
        {
            TransitionData  transitionData = new TransitionData();
            Activity <bool> condition      = transition.Condition;

            transitionData.Condition = condition;
            if (condition != null)
            {
                metadata.AddChild(condition);
            }

            Activity action = transition.Action;

            transitionData.Action = action;
            if (action != null)
            {
                metadata.AddChild(action);
            }

            if (transition.To != null)
            {
                transitionData.To = transition.To.InternalState;
            }
            internalTransition.TransitionDataList.Add(transitionData);
        }
Esempio n. 2
0
        void OnConditionComplete(NativeActivityContext context, ActivityInstance completedInstance, bool result)
        {
            StateMachineEventManager eventManager = this.EventManager.Get(context);
            int triggerId = eventManager.CurrentBeingProcessedEvent.TriggedId;

            if (result)
            {
                TakeTransition(context, eventManager, triggerId);
            }
            else
            {
                int currentConditionIndex     = eventManager.CurrentConditionIndex;
                InternalTransition transition = GetInternalTransition(triggerId);
                currentConditionIndex++;
                if (currentConditionIndex < transition.TransitionDataList.Count)
                {
                    eventManager.CurrentConditionIndex = currentConditionIndex;
                    context.ScheduleActivity <bool>(transition.TransitionDataList[currentConditionIndex].Condition, this.onConditionComplete, null);
                }
                else
                {
                    //Schedule current trigger again firstly.
                    context.ScheduleActivity(transition.Trigger, onTriggerComplete);
                    this.currentRunningTriggers.Set(context, this.currentRunningTriggers.Get(context) + 1);

                    //check whether there is any other trigger completed.
                    ProcessNextTriggerCompletedEvent(context, eventManager);
                }
            }
        }
Esempio n. 3
0
        void OnTriggerComplete(NativeActivityContext context, ActivityInstance completedInstance)
        {
            int runningTriggers = this.currentRunningTriggers.Get(context);

            this.currentRunningTriggers.Set(context, --runningTriggers);
            bool isOnExit = this.isExiting.Get(context);

            if (!context.IsCancellationRequested && runningTriggers == 0 && !this.hasRunningChildState.Get(context) && isOnExit)
            {
                ScheduleExit(context);
            }
            else if (completedInstance.State == ActivityInstanceState.Closed)
            {
                InternalTransition internalTransition = null;
                this.triggerInternalTransitionMapping.TryGetValue(completedInstance.Activity, out internalTransition);
                Debug.Assert(internalTransition != null, "internalTransition should be added into triggerInternalTransitionMapping in CacheMetadata.");

                StateMachineEventManager eventManager = this.EventManager.Get(context);
                bool canBeProcessedImmediately;
                eventManager.RegisterCompletedEvent(
                    new TriggerCompletedEvent {
                    Bookmark = this.evaluateConditionBookmark.Get(context), TriggedId = internalTransition.InternalTransitionIndex
                },
                    out canBeProcessedImmediately
                    );
                if (canBeProcessedImmediately)
                {
                    StartEvaluateCondition(context);
                }
            }
        }
Esempio n. 4
0
        void ScheduleAction(NativeActivityContext context)
        {
            StateMachineEventManager eventManager = this.EventManager.Get(context);

            if (eventManager.IsReferredByBeingProcessedEvent(this.evaluateConditionBookmark.Get(context)))
            {
                InternalTransition transition = GetInternalTransition(eventManager.CurrentBeingProcessedEvent.TriggedId);
                Activity           action     = transition.TransitionDataList[eventManager.CurrentConditionIndex].Action;
                if (action != null)
                {
                    context.ScheduleActivity(action);
                }
            }
            RemoveBookmarks(context);
        }
Esempio n. 5
0
        void StartEvaluateCondition(NativeActivityContext context)
        {
            //Start to evaluate conditions of the trigger which represented by currentTriggerIndex
            StateMachineEventManager eventManager = this.EventManager.Get(context);
            int triggerId = eventManager.CurrentBeingProcessedEvent.TriggedId;

            eventManager.CurrentConditionIndex = 0;
            InternalTransition transition = GetInternalTransition(triggerId);

            if (transition.IsUnconditional)
            {
                TakeTransition(context, eventManager, triggerId);
            }
            else
            {
                context.ScheduleActivity <bool>(GetCondition(triggerId, eventManager.CurrentConditionIndex),
                                                this.onConditionComplete, null);
            }
        }
Esempio n. 6
0
 void ProcessTransitions(NativeActivityMetadata metadata)
 {
     for (int i = 0; i < this.Transitions.Count; i++)
     {
         Transition         transition         = this.Transitions[i];
         InternalTransition internalTransition = null;
         if (!triggerInternalTransitionMapping.TryGetValue(transition.Trigger, out internalTransition))
         {
             metadata.AddChild(transition.Trigger);
             internalTransition = new InternalTransition
             {
                 Trigger = transition.Trigger,
                 InternalTransitionIndex = this.internalTransitions.Count,
             };
             triggerInternalTransitionMapping.Add(transition.Trigger, internalTransition);
             this.internalTransitions.Add(internalTransition);
         }
         AddTransitionData(metadata, internalTransition, transition);
     }
 }