public int[] SyncWrite(int[] serverHandles, DaValue[] values)
{
TraceState("SyncWrite", serverHandles.Length);
ThrowIfDisposed();
int[] results = new int[serverHandles.Length];
WriteValueCollection valuesToWrite = new WriteValueCollection();
lock (m_lock)
{
// validate items.
DaValue convertedValue = new DaValue();
for (int ii = 0; ii < serverHandles.Length; ii++)
{
ComDaGroupItem item = null;
if (!m_itemsByHandle.TryGetValue(serverHandles[ii], out item))
{
results[ii] = ResultIds.E_INVALIDHANDLE;
continue;
}
// apply the COM type conversion.
DaValue requestedValue = values[ii];
if (requestedValue.Value == null)
{
results[ii] = ResultIds.E_BADTYPE;
continue;
}
if (item.CanonicalDataType != (short)VarEnum.VT_EMPTY)
{
object value = null;
int error = ComUtils.ChangeTypeForCOM(requestedValue.Value, (VarEnum)item.CanonicalDataType, out value);
if (error < 0)
{
results[ii] = error;
continue;
}
// could happen if there is a problem reading the datatype from the server.
if (requestedValue.Value == null)
{
results[ii] = ResultIds.E_BADTYPE;
continue;
}
// copy all of the attributes into the converted value.
convertedValue.Value = value;
convertedValue.Quality = requestedValue.Quality;
convertedValue.Timestamp = requestedValue.Timestamp;
convertedValue.Error = requestedValue.Error;
requestedValue = convertedValue;
}
WriteValue valueToWrite = new WriteValue();
valueToWrite.NodeId = item.NodeId;
valueToWrite.AttributeId = Attributes.Value;
valueToWrite.Handle = ii;
// convert value to UA data type.
try
{
valueToWrite.Value = m_manager.Mapper.GetRemoteDataValue(requestedValue, item.RemoteDataType);
}
catch (Exception e)
{
results[ii] = ComUtils.GetErrorCode(e, ResultIds.E_BADTYPE);
continue;
}
valuesToWrite.Add(valueToWrite);
}
}
// check if nothing to do.
if (valuesToWrite.Count == 0)
{
return results;
}
// write the values to the server.
int[] remoteResults = m_manager.Write(valuesToWrite);
// copy results.
for (int ii = 0; ii < valuesToWrite.Count; ii++)
{
results[(int)valuesToWrite[ii].Handle] = remoteResults[ii];
}
return results;
}