protected virtual ServiceResult OnTimedShelve(
ISystemContext context,
MethodState method,
NodeId objectId,
double shelvingTime)
{
ServiceResult error = null;
try
{
if (!this.EnabledState.Id.Value)
{
return error = StatusCodes.BadConditionDisabled;
}
if (shelvingTime <= 0 || (this.MaxTimeShelved != null && shelvingTime > this.MaxTimeShelved.Value))
{
return error = StatusCodes.BadShelvingTimeOutOfRange;
}
if (!this.ShelvingState.IsCausePermitted(context, Methods.ShelvedStateMachineType_TimedShelve, false))
{
return error = StatusCodes.BadConditionAlreadyShelved;
}
if (OnShelve == null)
{
return error = StatusCodes.BadNotSupported;
}
error = OnShelve(context, this, true, false, shelvingTime);
// report a state change event.
if (ServiceResult.IsGood(error))
{
ReportStateChange(context, false);
}
}
finally
{
if (this.AreEventsMonitored)
{
AuditConditionShelvingEventState e = new AuditConditionShelvingEventState(null);
TranslationInfo info = new TranslationInfo(
"AuditConditionTimedShelve",
"en-US",
"The TimedShelve method was called.");
e.Initialize(
context,
this,
EventSeverity.Low,
new LocalizedText(info),
ServiceResult.IsGood(error),
DateTime.UtcNow);
e.SourceName.Value = "Attribute/Call";
e.MethodId = new PropertyState<NodeId>(e);
e.MethodId.Value = method.NodeId;
e.InputArguments = new PropertyState<object[]>(e);
e.InputArguments.Value = new object[] { shelvingTime };
ReportEvent(context, e);
}
}
return error;
}