public int[] Write(string[] itemIds, DaValue[] values)
{
int[] results = new int[itemIds.Length];
WriteValueCollection valuesToWrite = new WriteValueCollection();
ComDaReadPropertiesRequest[] requests = new ComDaReadPropertiesRequest[values.Length];
// prepare request.
for (int ii = 0; ii < itemIds.Length; ii++)
{
ComDaReadPropertiesRequest request = requests[ii] = new ComDaReadPropertiesRequest();
request.ItemId = itemIds[ii];
}
// need to get the data type of the remote node.
m_browseManager.GetPropertyValues(Session, requests, PropertyIds.UaBuiltInType, PropertyIds.UaValueRank);
// validate items.
for (int ii = 0; ii < requests.Length; ii++)
{
ComDaReadPropertiesRequest request = requests[ii];
if (request.Error < 0)
{
results[ii] = request.Error;
continue;
}
int? builtInType = request.Values[0].Value as int?;
int? valueRank = request.Values[1].Value as int?;
if (builtInType == null || valueRank == null)
{
results[ii] = ResultIds.E_UNKNOWNITEMID;
continue;
}
// convert value to UA data type.
WriteValue valueToWrite = new WriteValue();
valueToWrite.NodeId = m_mapper.GetRemoteNodeId(itemIds[ii]);
valueToWrite.AttributeId = Attributes.Value;
valueToWrite.Handle = ii;
// convert value to UA data type.
try
{
TypeInfo remoteType = new TypeInfo((BuiltInType)builtInType.Value, valueRank.Value);
valueToWrite.Value = m_mapper.GetRemoteDataValue(values[ii], remoteType);
}
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_groupManager.Write(valuesToWrite);
// copy results.
for (int ii = 0; ii < valuesToWrite.Count; ii++)
{
results[(int)valuesToWrite[ii].Handle] = remoteResults[ii];
}
return results;
}
#endregion