/// <summary> /// Validates the nodes and writes the value to the underlying system. /// </summary> /// <param name="context">The context.</param> /// <param name="nodesToWrite">The nodes to write.</param> /// <param name="errors">The errors.</param> /// <param name="nodesToValidate">The nodes to validate.</param> /// <param name="cache">The cache.</param> protected override void Write( ServerSystemContext context, IList <WriteValue> nodesToWrite, IList <ServiceResult> errors, List <NodeHandle> nodesToValidate, IDictionary <NodeId, NodeState> cache) { ComDaClientManager system = (ComDaClientManager)this.SystemContext.SystemHandle; ComDaClient client = system.SelectClient((ServerSystemContext)SystemContext, false); WriteRequestCollection requests = new WriteRequestCollection(); // validates the nodes and queues an write requests. for (int ii = 0; ii < nodesToValidate.Count; ii++) { NodeHandle handle = nodesToValidate[ii]; lock (Lock) { // validate node. NodeState source = ValidateNode(context, handle, cache); if (source == null) { continue; } // determine if request can be sent to the server. bool queued = false; WriteValue nodeToWrite = nodesToWrite[handle.Index]; errors[handle.Index] = requests.Add(source, nodeToWrite, handle.Index, out queued); if (queued) { continue; } // write the attribute value. errors[handle.Index] = source.WriteAttribute( context, nodeToWrite.AttributeId, nodeToWrite.ParsedIndexRange, nodeToWrite.Value); // updates to source finished - report changes to monitored items. source.ClearChangeMasks(context, false); } } // write to the server. client.Write(requests); // get the results from the requests sent to the server. for (int ii = 0; ii < requests.Count; ii++) { WriteRequest request = requests[ii]; errors[request.Index] = request.GetResult(); } }
/// <summary> /// Handles a write operation. /// </summary> protected override void Write( ServerSystemContext context, IList <WriteValue> nodesToWrite, IList <ServiceResult> errors, List <NodeHandle> nodesToValidate, IDictionary <NodeId, NodeState> cache) { List <ReadWriteRequest> requests = new List <ReadWriteRequest>(); // validates the nodes and constructs requests for external nodes. for (int ii = 0; ii < nodesToValidate.Count; ii++) { WriteValue nodeToWrite = nodesToWrite[ii]; NodeHandle handle = nodesToValidate[ii]; lock (Lock) { // validate node. NodeState source = ValidateNode(context, handle, cache); if (source == null) { continue; } // determine if an external source is required. if (IsExternalSource(handle, nodeToWrite.AttributeId)) { errors[handle.Index] = AddWriteRequest(context, handle, nodeToWrite, requests); continue; } // write the attribute value. errors[handle.Index] = source.WriteAttribute( context, nodeToWrite.AttributeId, nodeToWrite.ParsedIndexRange, nodeToWrite.Value); // updates to source finished - report changes to monitored items. source.ClearChangeMasks(context, false); } } // send request to external system. try { ProcessWriteRequests(requests); } catch (Exception e) { // handle unexpected communication error. ServiceResult error = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, "Could not access external system."); for (int ii = 0; ii < requests.Count; ii++) { requests[ii].Result = error; } } // set results. for (int ii = 0; ii < requests.Count; ii++) { ReadWriteRequest request = requests[ii]; errors[request.Handle.Index] = request.Result; } }