public virtual ServiceResult DoCause(
ISystemContext context,
MethodState causeMethod,
uint causeId,
IList<object> inputArguments,
IList<object> outputArguments)
{
ServiceResult result = null;
try
{
// get the transition.
uint transitionId = GetTransitionForCause(context, causeId);
if (transitionId == 0)
{
return StatusCodes.BadNotSupported;
}
// check access rights.
result = InvokeCallback(
OnCheckUserPermission,
context,
this,
transitionId,
causeId,
inputArguments,
outputArguments);
if (ServiceResult.IsBad(result))
{
return result;
}
// do the transition.
result = DoTransition(context, transitionId, causeId, inputArguments, outputArguments);
if (ServiceResult.IsBad(result))
{
return result;
}
// report any changes to state machine.
ClearChangeMasks(context, true);
}
finally
{
// report the event.
if (this.AreEventsMonitored)
{
AuditUpdateStateEventState e = CreateAuditEvent(context, causeMethod, causeId);
UpdateAuditEvent(context, causeMethod, causeId, e, result);
ReportEvent(context, e);
}
}
return result;
}