Opc.Ua.Com.Server.ComDaGroup.SyncWrite C# (CSharp) Method

SyncWrite() public method

Performs n synchronous write operation.
public SyncWrite ( int serverHandles, DaValue values ) : int[]
serverHandles int The server handles.
values DaValue The values.
return int[]
        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;
        }