public ServiceResult DoTransition(
ISystemContext context,
uint transitionId,
uint causeId,
IList<object> inputArguments,
IList<object> outputArguments)
{
// check for valid transition.
uint newState = GetNewStateForTransition(context, transitionId);
if (newState == 0)
{
return StatusCodes.BadNotSupported;
}
// check the cause permissions.
if (causeId != 0)
{
if (!IsCausePermitted(context, causeId, true))
{
return StatusCodes.BadUserAccessDenied;
}
}
// do any pre-transition processing.
ServiceResult result = InvokeCallback(
OnBeforeTransition,
context,
this,
transitionId,
causeId,
inputArguments,
outputArguments);
if (ServiceResult.IsBad(result))
{
return result;
}
// save the last state.
if (m_lastState == null)
{
m_lastState = new FiniteStateVariableState(this);
}
m_lastState.SetChildValue(context, null, CurrentState, false);
// update state and transition variables.
UpdateStateVariable(context, newState, CurrentState);
UpdateTransitionVariable(context, transitionId, LastTransition);
// do any post-transition processing.
InvokeCallback(
OnAfterTransition,
context,
this,
transitionId,
causeId,
inputArguments,
outputArguments);
// report the event.
if (this.AreEventsMonitored && !m_suppressTransitionEvents)
{
TransitionEventState e = CreateTransitionEvent(context, transitionId, causeId);
if (e != null)
{
UpdateTransitionEvent(context, transitionId, causeId, e);
ReportEvent(context, e);
}
}
return ServiceResult.Good;
}