public virtual void Call(
OperationContext context,
CallMethodRequestCollection methodsToCall,
out CallMethodResultCollection results,
out DiagnosticInfoCollection diagnosticInfos)
{
if (context == null) throw new ArgumentNullException("context");
if (methodsToCall == null) throw new ArgumentNullException("methodsToCall");
bool diagnosticsExist = false;
results = new CallMethodResultCollection(methodsToCall.Count);
diagnosticInfos = new DiagnosticInfoCollection(methodsToCall.Count);
List<ServiceResult> errors = new List<ServiceResult>(methodsToCall.Count);
// add placeholder for each result.
bool validItems = false;
for (int ii = 0; ii < methodsToCall.Count; ii++)
{
results.Add(null);
errors.Add(null);
if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0)
{
diagnosticInfos.Add(null);
}
// validate request paramaters.
errors[ii] = ValidateCallRequestItem(methodsToCall[ii]);
if (ServiceResult.IsBad(errors[ii]))
{
methodsToCall[ii].Processed = true;
// add diagnostics if requested.
if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0)
{
diagnosticInfos[ii] = ServerUtils.CreateDiagnosticInfo(m_server, context, errors[ii]);
diagnosticsExist = true;
}
continue;
}
// found at least one valid item.
validItems = true;
methodsToCall[ii].Processed = false;
}
// call each node manager.
if (validItems)
{
foreach (INodeManager nodeManager in m_nodeManagers)
{
nodeManager.Call(
context,
methodsToCall,
results,
errors);
}
}
for (int ii = 0; ii < methodsToCall.Count; ii++)
{
// set an error code for calls that were not handled by any node manager.
if (!methodsToCall[ii].Processed)
{
results[ii] = new CallMethodResult();
errors[ii] = StatusCodes.BadNodeIdUnknown;
}
// update the diagnostic info and ensure the status code in the result is the same as the error code.
if (errors[ii] != null && errors[ii].Code != StatusCodes.Good)
{
if (results[ii] == null)
{
results[ii] = new CallMethodResult();
}
results[ii].StatusCode = errors[ii].Code;
// add diagnostics if requested.
if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0)
{
diagnosticInfos[ii] = ServerUtils.CreateDiagnosticInfo(m_server, context, errors[ii]);
diagnosticsExist = true;
}
}
}
// clear the diagnostics array if no diagnostics requested or no errors occurred.
UpdateDiagnostics(context, diagnosticsExist, ref diagnosticInfos);
}