public virtual ServiceResult Call(
ISystemContext context,
NodeId objectId,
IList<Variant> inputArguments,
IList<ServiceResult> argumentErrors,
IList<Variant> outputArguments)
{
// validate input arguments.
List<object> inputs = new List<object>();
// check for too few or too many arguments.
int expectedCount = 0;
if (InputArguments != null && InputArguments.Value != null)
{
expectedCount = InputArguments.Value.Length;
}
if (expectedCount != inputArguments.Count)
{
return StatusCodes.BadArgumentsMissing;
}
// validate individual arguements.
bool error = false;
for (int ii = 0; ii < inputArguments.Count; ii++)
{
ServiceResult argumentError = ValidateInputArgument(context, inputArguments[ii], ii);
if (ServiceResult.IsBad(argumentError))
{
error = true;
}
inputs.Add(inputArguments[ii].Value);
argumentErrors.Add(argumentError);
}
// return good - caller must check argument errors.
if (error)
{
return ServiceResult.Good;
}
// set output arguments to default values.
List<object> outputs = new List<object>();
if (OutputArguments != null)
{
IList<Argument> arguments = OutputArguments.Value;
if (arguments != null && arguments.Count > 0)
{
for (int ii = 0; ii < arguments.Count; ii++)
{
outputs.Add(GetArgumentDefaultValue(context, arguments[ii]));
}
}
}
// invoke method.
ServiceResult result = null;
try
{
result = Call(context, objectId, inputs, outputs);
}
catch (Exception e)
{
result = new ServiceResult(e);
}
// copy out arguments.
if (ServiceResult.IsGood(result))
{
for (int ii = 0; ii < outputs.Count; ii++)
{
outputArguments.Add(new Variant(outputs[ii]));
}
}
return result;
}