コード例 #1
0
        /// <summary>
        /// Ensures the data value contains a value with the specified type. 
        /// </summary>
        public object GetValue(Type expectedType) {
            object value = this.Value;

            if (expectedType != null) {
                ExtensionObject extension = value as ExtensionObject;

                if (extension != null) {
                    value = extension.Body;
                }

                if (!expectedType.IsInstanceOfType(value)) {
                    throw ServiceResultException.Create(StatusCodes.BadTypeMismatch, "DataValue is not of type {0}.",
                        expectedType.Name);
                }
            }

            return value;
        }
コード例 #2
0
        /// <summary>
        /// Invokes the HistoryRead service.
        /// </summary>
        public virtual ResponseHeader HistoryRead(
            RequestHeader requestHeader,
            ExtensionObject historyReadDetails,
            TimestampsToReturn timestampsToReturn,
            bool releaseContinuationPoints,
            HistoryReadValueIdCollection nodesToRead,
            out HistoryReadResultCollection results,
            out DiagnosticInfoCollection diagnosticInfos)
        {
            results         = null;
            diagnosticInfos = null;

            ValidateRequest(requestHeader);

            // Insert implementation.

            return(CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported));
        }
コード例 #3
0
        /// <summary>
        /// Gets the value from the data value.
        /// </summary>
        /// <typeparam name="T">The type of object.</typeparam>
        /// <param name="defaultValue">The default value to return if any error occurs.</param>
        /// <returns>The value.</returns>
        /// <remarks>
        /// Does not throw exceptions; returns the caller provided value instead.
        /// Extracts the body from an ExtensionObject value if it has the correct type.
        /// Checks the StatusCode and returns an error if not Good.
        /// </remarks>
        public T GetValue<T>(T defaultValue) {
            if (StatusCode.IsNotGood(this.StatusCode)) {
                return defaultValue;
            }

            if (typeof(T).IsInstanceOfType(this.Value)) {
                return (T) this.Value;
            }

            ExtensionObject extension = this.Value as ExtensionObject;

            if (extension != null) {
                if (typeof(T).IsInstanceOfType(extension.Body)) {
                    return (T) extension.Body;
                }
            }

            return defaultValue;
        }
コード例 #4
0
        /// <summary>
        /// Invokes the ActivateSession service.
        /// </summary>
        public virtual ResponseHeader ActivateSession(
            RequestHeader requestHeader,
            SignatureData clientSignature,
            SignedSoftwareCertificateCollection clientSoftwareCertificates,
            StringCollection localeIds,
            ExtensionObject userIdentityToken,
            SignatureData userTokenSignature,
            out byte[] serverNonce,
            out StatusCodeCollection results,
            out DiagnosticInfoCollection diagnosticInfos)
        {
            serverNonce     = null;
            results         = null;
            diagnosticInfos = null;

            ValidateRequest(requestHeader);

            // Insert implementation.

            return(CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported));
        }
コード例 #5
0
        /// <summary>
        /// Determines if the specified object is equal to the <paramref name="obj"/>.
        /// </summary>
        /// <param name="obj">The object to compare to this instance of object</param>
        /// <returns>
        /// true if the specified <see cref="T:System.Object"/> is equal to the current embeded object; otherwise, false.
        /// </returns>
        public override bool Equals(object obj) {
            if (Object.ReferenceEquals(obj, null)) {
                return IsNull(this);
            }

            if (Object.ReferenceEquals(this, obj)) {
                return true;
            }

            ExtensionObject value = obj as ExtensionObject;

            if (value != null) {
                if (this.m_typeId != value.m_typeId) {
                    return false;
                }

                return Utils.IsEqual(this.m_body, value.m_body);
            }

            return false;
        }
コード例 #6
0
        /// <summary>
        /// Returns the operands for the element.
        /// </summary>
        /// <returns>The list of operands for the element.</returns>
        public List <FilterOperand> GetOperands()
        {
            List <FilterOperand> operands = new List <FilterOperand>(FilterOperands.Count);

            foreach (ExtensionObject extension in FilterOperands)
            {
                if (ExtensionObject.IsNull(extension))
                {
                    continue;
                }

                FilterOperand operand = extension.Body as FilterOperand;

                if (operand == null)
                {
                    continue;
                }

                operands.Add(operand);
            }

            return(operands);
        }
コード例 #7
0
        /// <summary>
        /// Reads the value for DataTypeDefinition attribute.
        /// </summary>
        protected override ServiceResult ReadNonValueAttribute(
            ISystemContext context,
            uint attributeId,
            ref object value)
        {
            ServiceResult result = null;

            switch (attributeId)
            {
            case Attributes.DataTypeDefinition:
            {
                ExtensionObject dataTypeDefinition = m_dataTypeDefinition;

                if (OnReadDataTypeDefinition != null)
                {
                    result = OnReadDataTypeDefinition(context, this, ref dataTypeDefinition);
                }

                if (ServiceResult.IsGood(result))
                {
                    if (dataTypeDefinition?.Body is StructureDefinition structureType &&
                        (structureType.DefaultEncodingId == null ||
                         structureType.DefaultEncodingId.IsNullNodeId))
                    {
                        // one time set the id for binary encoding, currently the only supported encoding
                        structureType.SetDefaultEncodingId(context, NodeId, null);
                    }
                    value = dataTypeDefinition;
                }

                return(result);
            }
            }

            return(base.ReadNonValueAttribute(context, attributeId, ref value));
        }
コード例 #8
0
ファイル: Program.cs プロジェクト: yuriik83/UA-.NET
        /// <summary>
        /// Reads the history of values for a set of variables at given time.
        /// </summary>
        static void HistoryReadAtTime(Session session)
        {
            // translate browse paths.
            IList<NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, 
                VariableBrowsePaths.ToArray());


            DiagnosticInfoCollection diagnosticInfos;

            ReadAtTimeDetails readDetails = new ReadAtTimeDetails();

            readDetails.ReqTimes = new DateTimeCollection();

            for (int jj = 0; jj < 10; jj++)
            {
                readDetails.ReqTimes.Add(new DateTime(2008, 01, 01, 12, 0, jj));
                readDetails.ReqTimes.Add(new DateTime(2008, 01, 01, 12, 0, jj, (int) 500));
            }

            ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails);

            HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection();
            for (int ii = 0; ii < nodeIds.Count; ii++)
            {
                HistoryReadValueId readValueId = new HistoryReadValueId();
                readValueId.NodeId = nodeIds[ii].NodeId;
                readValueId.Processed = false;
                idCollection.Add(readValueId);
            }

            HistoryReadResultCollection historyReadResults;

            ResponseHeader responseHeader =
                session.HistoryRead(null, eo, TimestampsToReturn.Both, true,
                idCollection, out historyReadResults, out diagnosticInfos);

            // process results.

            for (int ii = 0; ii < historyReadResults.Count; ii++)
            {
                HistoryReadResult historyReadResult = historyReadResults[ii];
                HistoryData historyData = null;
                DataValueCollection dataValues = null;
                if (historyReadResult.HistoryData != null)
                {
                    historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData;
                    dataValues = historyData.DataValues;
                }

                ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader);
                Console.WriteLine("HistoryRead result code for {0}:  {1}", VariableBrowsePaths[ii], result.StatusCode.ToString());

                if (StatusCode.IsBad(historyReadResult.StatusCode))
                {
                    continue;
                }

                if (dataValues == null)
                {
                    Console.WriteLine("dataValues == null");
                    continue;
                }

                for (int jj = 0; jj < dataValues.Count; jj++)
                {

                    DataValue dataValue = dataValues[jj];

                    // write value.
                    Console.WriteLine("{0}: V={1}, Q={2}, SrvT={3}, SrcT={4}", jj,
                        dataValue.Value == null ? "null" : dataValue.Value.ToString(),
                        dataValue.StatusCode.ToString(),
                        dataValue.ServerTimestamp, dataValue.SourceTimestamp);
                }
            }
        }
コード例 #9
0
ファイル: Opc.Ua.Client.cs プロジェクト: zryska/UA-.NET
        /// <summary>
        /// Invokes the HistoryRead service.
        /// </summary>
        public virtual ResponseHeader HistoryRead(
            RequestHeader                   requestHeader,
            ExtensionObject                 historyReadDetails,
            TimestampsToReturn              timestampsToReturn,
            bool                            releaseContinuationPoints,
            HistoryReadValueIdCollection    nodesToRead,
            out HistoryReadResultCollection results,
            out DiagnosticInfoCollection    diagnosticInfos)
        {
            HistoryReadRequest request = new HistoryReadRequest();
            HistoryReadResponse response = null;

            request.RequestHeader             = requestHeader;
            request.HistoryReadDetails        = historyReadDetails;
            request.TimestampsToReturn        = timestampsToReturn;
            request.ReleaseContinuationPoints = releaseContinuationPoints;
            request.NodesToRead               = nodesToRead;

            UpdateRequestHeader(request, requestHeader == null, "HistoryRead");

            try
            {
                if (UseTransportChannel)
                {
                    IServiceResponse genericResponse = TransportChannel.SendRequest(request);

                    if (genericResponse == null)
                    {
                        throw new ServiceResultException(StatusCodes.BadUnknownResponse);
                    }

                    ValidateResponse(genericResponse.ResponseHeader);
                    response = (HistoryReadResponse)genericResponse;
                }
                else
                {
                    HistoryReadResponseMessage responseMessage = InnerChannel.HistoryRead(new HistoryReadMessage(request));

                    if (responseMessage == null || responseMessage.HistoryReadResponse == null)
                    {
                        throw new ServiceResultException(StatusCodes.BadUnknownResponse);
                    }

                    response = responseMessage.HistoryReadResponse;
                    ValidateResponse(response.ResponseHeader);
                }

                results         = response.Results;
                diagnosticInfos = response.DiagnosticInfos;
            }
            finally
            {
                RequestCompleted(request, response, "HistoryRead");
            }

            return response.ResponseHeader;
        }
コード例 #10
0
ファイル: NamespaceMapper.cs プロジェクト: yuriik83/UA-.NET
 /// <summary>
 /// Converts a remote ExtensionObject to a local ExtensionObject.
 /// </summary>
 public ExtensionObject ToLocalExtensionObject(ExtensionObject value)
 {
     return ToExtensionObject(value, m_localNamespaceIndexes);
 }
コード例 #11
0
        /// <summary>
        /// Invokes the HistoryRead service.
        /// </summary>
        public virtual ResponseHeader HistoryRead(
            RequestHeader                   requestHeader,
            ExtensionObject                 historyReadDetails,
            TimestampsToReturn              timestampsToReturn,
            bool                            releaseContinuationPoints,
            HistoryReadValueIdCollection    nodesToRead,
            out HistoryReadResultCollection results,
            out DiagnosticInfoCollection    diagnosticInfos)
        {
            results = null;
            diagnosticInfos = null;

            ValidateRequest(requestHeader);

            // Insert implementation.

            return CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported);
        }
コード例 #12
0
ファイル: NamespaceMapper.cs プロジェクト: yuriik83/UA-.NET
 /// <summary>
 /// Converts a local ExtensionObject to a remote ExtensionObject.
 /// </summary>
 public ExtensionObject ToRemoteExtensionObject(ExtensionObject value)
 {
     return ToExtensionObject(value, m_remoteNamespaceIndexes);
 }
コード例 #13
0
ファイル: Variant.cs プロジェクト: neobox3000/UA-.NET
        /// <summary>
        /// Adds the value to the XML element.
        /// </summary>
        private VariantValue CreateScalar(XmlDocument document, object value)
        {
            VariantValue variant = new VariantValue();

            if (value == null)
            {
                return(variant);
            }

            XmlElement element = null;

            switch (value.GetType().Name)
            {
            case "Boolean":
            {
                element           = document.CreateElement("Boolean", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((bool)value);
                break;
            }

            case "Byte":
            {
                element           = document.CreateElement("Byte", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((byte)value);
                break;
            }

            case "SByte":
            {
                element           = document.CreateElement("SByte", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((sbyte)value);
                break;
            }

            case "Int16":
            {
                element           = document.CreateElement("Int16", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((short)value);
                break;
            }

            case "UInt16":
            {
                element           = document.CreateElement("UInt16", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((ushort)value);
                break;
            }

            case "Int32":
            {
                element           = document.CreateElement("Int32", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((int)value);
                break;
            }

            case "UInt32":
            {
                element           = document.CreateElement("UInt32", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((uint)value);
                break;
            }

            case "Int64":
            {
                element           = document.CreateElement("Int64", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((long)value);
                break;
            }

            case "UInt64":
            {
                element           = document.CreateElement("UInt64", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((ulong)value);
                break;
            }

            case "Single":
            {
                element           = document.CreateElement("Float", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((float)value);
                break;
            }

            case "Double":
            {
                element           = document.CreateElement("Double", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((double)value);
                break;
            }

            case "String":
            {
                element           = document.CreateElement("String", Namespaces.OpcUaXsd);
                element.InnerText = (string)value;
                break;
            }

            case "DateTime":
            {
                element           = document.CreateElement("DateTime", Namespaces.OpcUaXsd);
                element.InnerText = XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.Utc);
                break;
            }

            case "NodeId":
            {
                element = document.CreateElement("NodeId", Namespaces.OpcUaXsd);
                AddChild(document, element, "Identifier", ((NodeId)value).Identifier);
                break;
            }

            case "ExpandedNodeId":
            {
                element = document.CreateElement("ExpandedNodeId", Namespaces.OpcUaXsd);
                AddChild(document, element, "Identifier", ((ExpandedNodeId)value).Identifier);
                break;
            }

            case "QualifiedName":
            {
                element = document.CreateElement("QualifiedName", Namespaces.OpcUaXsd);
                AddChild(document, element, "NamespaceIndex", XmlConvert.ToString(((QualifiedName)value).NamespaceIndex));
                AddChild(document, element, "Name", ((QualifiedName)value).Name);
                break;
            }

            case "LocalizedText":
            {
                element = document.CreateElement("LocalizedText", Namespaces.OpcUaXsd);
                AddChild(document, element, "Locale", ((LocalizedText)value).Locale);
                AddChild(document, element, "Text", ((LocalizedText)value).Text);
                break;
            }

            case "StatusCode":
            {
                element = document.CreateElement("StatusCode", Namespaces.OpcUaXsd);

                uint?code = ((StatusCode)value).Code;

                if (code != null && code.Value != StatusCodes.Good)
                {
                    AddChild(document, element, "Code", XmlConvert.ToString(code.Value));
                }

                break;
            }

            case "ExtensionObject":
            {
                element = document.CreateElement("ExtensionObject", Namespaces.OpcUaXsd);

                ExtensionObject extension = (ExtensionObject)value;

                if (extension != null)
                {
                    XmlElement typeId = document.CreateElement("TypeId", Namespaces.OpcUaXsd);
                    element.AppendChild(typeId);
                    AddChild(document, typeId, "Identifier", extension.TypeId.Identifier);

                    XmlElement body = document.CreateElement("Body", Namespaces.OpcUaXsd);

                    if (extension.Body != null && extension.Body.Nodes != null && extension.Body.Nodes.Length > 0)
                    {
                        body.InnerXml = extension.Body.Nodes[0].OuterXml;
                    }

                    element.AppendChild(body);
                }

                break;
            }
            }

            variant.Nodes = new XmlNode[] { element };

            return(variant);
        }
コード例 #14
0
        private ServiceResult OnArrayValue3(       
            ISystemContext context,
            MethodState method,
            NodeId objectId,
            Variant[] variantIn,
            int[] enumerationIn,
            ExtensionObject[] structureIn,
            ref Variant[] variantOut,
            ref int[] enumerationOut,
            ref ExtensionObject[] structureOut)
        {
            variantOut = variantIn;
            enumerationOut = enumerationIn;
            structureOut = structureIn;

            return ServiceResult.Good;
        }        
コード例 #15
0
        /// <summary cref="ITypeTable.IsEncodingFor(NodeId, ExtensionObject)" />
        public bool IsEncodingFor(NodeId expectedTypeId, ExtensionObject value)
        {
            // no match on null values.
            if (value == null)
            {
                return false;
            }

            // may still match if the extension type is an encoding for the expected type.
            if (IsEncodingOf(value.TypeId, expectedTypeId))
            {
                return true;
            }

            // no match.
            return false;
        }
コード例 #16
0
        public bool WriteUDT(List <string> opcNodes, List <object> values, out List <bool> status)
        {
            bool ret = false;

            try
            {
                if (opcNodes.Count != values.Count)
                {
                    throw new Exception("opcNodes.Count != values.Count");
                }

                int count = opcNodes.Count;

                status = new List <bool>(count);
                List <Type>   types   = new List <Type>(count);
                List <NodeId> nodeIds = new List <NodeId>(count);

                DiagnosticInfoCollection diags;
                StatusCodeCollection     statusCodes;

                WriteValueCollection writeValues = new WriteValueCollection(count);

                for (int i = 0; i < count; i++)
                {
                    //Variant variant = new Variant(values[i]);


                    Opc.Ua.ExpandedNodeId  expNodeId = new Opc.Ua.ExpandedNodeId(opcNodes[i]);
                    Opc.Ua.ExtensionObject extObj    = new Opc.Ua.ExtensionObject(expNodeId, values[i]);

                    DataValue dataVal = new DataValue(extObj);

                    WriteValue writeVal = new WriteValue();
                    //writeVal.
                    writeVal.Value       = dataVal;
                    writeVal.NodeId      = new NodeId(opcNodes[i]);
                    writeVal.AttributeId = Attributes.Value;

                    writeValues.Add(writeVal);
                }

                ResponseHeader rh = session.Write(null, writeValues, out statusCodes, out diags);



                ret = StatusCode.IsGood(rh.ServiceResult.Code);

                for (int i = 0; i < count; i++)
                {
                    //status[i] = StatusCode.IsGood(statusCodes[i]);
                    status.Add(StatusCode.IsGood(statusCodes[i]));
                    ret = ret & status[i];
                }
            }
            catch (Exception ex)
            {
                ret    = false;
                status = null;
                System.Diagnostics.Debug.WriteLine("Exception OpcUaClient::WriteValues " + ex.Message);
            }

            return(ret);
        }
コード例 #17
0
        public Variant ReadVariant(string fieldName)
        {
            // read the encoding byte.
            byte encodingByte = m_reader.ReadByte();

            Variant value = new Variant();

            if ((encodingByte & (byte)VariantArrayEncodingBits.Array) != 0)
            {
                // read the array length.
                int length = m_reader.ReadInt32();

                if (length < 0)
                {
                    return value;
                }

                Array array = null;

                BuiltInType builtInType = (BuiltInType)(encodingByte & (byte)VariantArrayEncodingBits.TypeMask);
                
                switch (builtInType)
                {
                    case BuiltInType.Boolean:
                    {
                        bool[] values = new bool[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadBoolean(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.SByte:
                    {
                        sbyte[] values = new sbyte[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadSByte(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.Byte:
                    {
                        byte[] values = new byte[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadByte(null);
                        }

                        array = values;
                        break;
                    }

                    case BuiltInType.Int16:
                    {
                        short[] values = new short[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadInt16(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.UInt16:
                    {
                        ushort[] values = new ushort[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadUInt16(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.Int32:
                    case BuiltInType.Enumeration:
                    {
                        int[] values = new int[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadInt32(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.UInt32:
                    {
                        uint[] values = new uint[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadUInt32(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.Int64:
                    {
                        long[] values = new long[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadInt64(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.UInt64:
                    {
                        ulong[] values = new ulong[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadUInt64(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.Float:
                    {
                        float[] values = new float[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadFloat(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.Double:
                    {
                        double[] values = new double[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadDouble(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.String:
                    {
                        string[] values = new string[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadString(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.DateTime:
                    {
                        DateTime[] values = new DateTime[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadDateTime(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.Guid:
                    {
                        Uuid[] values = new Uuid[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadGuid(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.ByteString:
                    {
                        byte[][] values = new byte[length][];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadByteString(null);
                        }
                        
                        array = values;
                        break;
                    }

                    case BuiltInType.XmlElement:
                    {
                        try
                        {
                            XmlElement[] values = new XmlElement[length];

                            for (int ii = 0; ii < values.Length; ii++)
                            {
                                values[ii] = ReadXmlElement(null);
                            }

                            array = values;
                        }
                        catch(Exception ex)
                        {
                            Utils.Trace(ex, "Error reading variant.");
                        }

                        break;
                    }
                        
                    case BuiltInType.NodeId:
                    {
                        NodeId[] values = new NodeId[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadNodeId(null);
                        }
                        
                        array = values;
                        break;
                    }
                        
                    case BuiltInType.ExpandedNodeId:
                    {
                        ExpandedNodeId[] values = new ExpandedNodeId[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadExpandedNodeId(null);
                        }
                        
                        array = values;
                        break;
                    }
                        
                    case BuiltInType.StatusCode:
                    {
                        StatusCode[] values = new StatusCode[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadStatusCode(null);
                        }
                        
                        array = values;
                        break;
                    }
                        
                    case BuiltInType.QualifiedName:
                    {
                        QualifiedName[] values = new QualifiedName[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadQualifiedName(null);
                        }
                        
                        array = values;
                        break;
                    }
                        
                    case BuiltInType.LocalizedText:
                    {
                        LocalizedText[] values = new LocalizedText[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadLocalizedText(null);
                        }
                        
                        array = values;
                        break;
                    }
                        
                    case BuiltInType.ExtensionObject:
                    {
                        ExtensionObject[] values = new ExtensionObject[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadExtensionObject();
                        }
                        
                        array = values;
                        break;
                    }
                        
                    case BuiltInType.DataValue:
                    {
                        DataValue[] values = new DataValue[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadDataValue(null);
                        }
                        
                        array = values;
                        break;
                    }
                        
                    case BuiltInType.Variant:
                    {
                        Variant[] values = new Variant[length];

                        for (int ii = 0; ii < values.Length; ii++)
                        {
                            values[ii] = ReadVariant(null);
                        }
                        
                        array = values;
                        break;
                    }

                    default:
                    {
                        throw new ServiceResultException(
                            StatusCodes.BadDecodingError,
                            Utils.Format("Cannot decode unknown type in Variant object (0x{0:X2}).", encodingByte)); 
                    }
                }

                if (array == null)
                {
                    value = new Variant(StatusCodes.BadEncodingError);
                }
                else
                {
                    // check for multi-dimensional arrays.
                    if ((encodingByte & (byte)VariantArrayEncodingBits.ArrayDimensions) != 0)
                    {
                        Int32Collection dimensions = ReadInt32Array(null);

                        if (dimensions != null && dimensions.Count > 0)
                        {
                            value = new Variant(new Matrix(array, builtInType, dimensions.ToArray()));
                        }
                        else
                        {
                            value = new Variant(new Matrix(array, builtInType));
                        }
                    }
                    else
                    {
                        value = new Variant(array);
                    }
                }
            }

            else
            {
                switch ((BuiltInType)encodingByte)
                {
                    case BuiltInType.Null:
                    {
                        value.Value = null;
                        break;
                    }

                    case BuiltInType.Boolean:
                    {
                        value.Set(ReadBoolean(null));
                        break;
                    }

                    case BuiltInType.SByte:
                    {
                        value.Set(ReadSByte(null));
                        break;
                    }

                    case BuiltInType.Byte:
                    {
                        value.Set(ReadByte(null));
                        break;
                    }

                    case BuiltInType.Int16:
                    {
                        value.Set(ReadInt16(null));
                        break;
                    }

                    case BuiltInType.UInt16:
                    {
                        value.Set(ReadUInt16(null));
                        break;
                    }

                    case BuiltInType.Int32:
                    case BuiltInType.Enumeration:
                    {
                        value.Set(ReadInt32(null));
                        break;
                    }

                    case BuiltInType.UInt32:
                    {
                        value.Set(ReadUInt32(null));
                        break;
                    }

                    case BuiltInType.Int64:
                    {
                        value.Set(ReadInt64(null));
                        break;
                    }

                    case BuiltInType.UInt64:
                    {
                        value.Set(ReadUInt64(null));
                        break;
                    }

                    case BuiltInType.Float:
                    {
                        value.Set(ReadFloat(null));
                        break;
                    }

                    case BuiltInType.Double:
                    {
                        value.Set(ReadDouble(null));
                        break;
                    }

                    case BuiltInType.String:
                    {
                        value.Set(ReadString(null));
                        break;
                    }

                    case BuiltInType.DateTime:
                    {
                        value.Set(ReadDateTime(null));
                        break;
                    }

                    case BuiltInType.Guid:
                    {
                        value.Set(ReadGuid(null));
                        break;
                    }

                    case BuiltInType.ByteString:
                    {
                        value.Set(ReadByteString(null));
                        break;
                    }

                    case BuiltInType.XmlElement:
                    {
                        try
                        {
                            value.Set(ReadXmlElement(null));
                        }
                        catch(Exception ex)
                        {
                            Utils.Trace(ex, "Error reading xml element for variant.");
                            value.Set(StatusCodes.BadEncodingError);
                        }                        
                        break;
                    }

                    case BuiltInType.NodeId:
                    {
                        value.Set(ReadNodeId(null));
                        break;
                    }

                    case BuiltInType.ExpandedNodeId:
                    {
                        value.Set(ReadExpandedNodeId(null));
                        break;
                    }
                        
                    case BuiltInType.StatusCode:
                    {
                        value.Set(ReadStatusCode(null));
                        break;
                    }

                    case BuiltInType.QualifiedName:
                    {
                        value.Set(ReadQualifiedName(null));
                        break;
                    }

                    case BuiltInType.LocalizedText:
                    {
                        value.Set(ReadLocalizedText(null));
                        break;
                    }

                    case BuiltInType.ExtensionObject:
                    {
                        value.Set(ReadExtensionObject());
                        break;
                    }

                    case BuiltInType.DataValue:
                    {
                        value.Set(ReadDataValue(null));
                        break;
                    }

                    default:
                    {
                        throw new ServiceResultException(
                            StatusCodes.BadDecodingError,
                            Utils.Format("Cannot decode unknown type in Variant object (0x{0:X2}).", encodingByte)); 
                    }
                }
            }

            return value;
        }
コード例 #18
0
        /// <summary>
        /// Reads an extension object from the stream.
        /// </summary>
        private ExtensionObject ReadExtensionObject()
        {
            ExtensionObject extension = new ExtensionObject();

            // read type id.
            NodeId typeId = ReadNodeId(null);
            
            // convert to absolute node id.
            extension.TypeId = NodeId.ToExpandedNodeId(typeId, m_context.NamespaceUris);
            
            if (!NodeId.IsNull(typeId) && NodeId.IsNull(extension.TypeId))
            {             
                Utils.Trace(
                    "Cannot de-serialized extension objects if the NamespaceUri is not in the NamespaceTable: Type = {0}", 
                    typeId);
            }

            // read encoding.
            ExtensionObjectEncoding encoding = (ExtensionObjectEncoding)Enum.ToObject(typeof(ExtensionObjectEncoding), m_reader.ReadByte());

            // nothing more to do for empty bodies.
            if (encoding == ExtensionObjectEncoding.None)
            {
                return extension;
            }

            // check for known type.
            Type systemType = m_context.Factory.GetSystemType(extension.TypeId);

            // check for XML bodies.
            if (encoding == ExtensionObjectEncoding.Xml)
            {
                extension.Body = ReadXmlElement(null);

                // attempt to decode a known type.
                if (systemType != null)
                {
                    XmlElement element = extension.Body as XmlElement;
                    XmlDecoder xmlDecoder = new XmlDecoder(element, this.Context);

                    try
                    {
                        xmlDecoder.PushNamespace(element.NamespaceURI);
                        IEncodeable body = xmlDecoder.ReadEncodeable(element.LocalName, systemType);
                        xmlDecoder.PopNamespace();

                        // update body.
                        extension.Body = body;
                    }
                    catch (Exception e)
                    {
                        Utils.Trace("Could not decode known type {0}. Error={1}, Value={2}", systemType.FullName, e.Message, element.OuterXml);
                    }
                }

                return extension;
            }

            // create instance of type.
            IEncodeable encodeable = null;

            if (systemType != null)
            {
                encodeable = Activator.CreateInstance(systemType) as IEncodeable;
            }

            // get the length.
            int length = ReadInt32(null);

            // process unknown type.
            if (encodeable == null)
            {
                // figure out how long the object is.
                if (length == -1)
                {
                    throw new ServiceResultException(
                        StatusCodes.BadDecodingError,
                        Utils.Format("Cannot determine length of unknown extension object body with type '{0}'.", extension.TypeId));
                }
                
                // check the length.
                if (m_context.MaxByteStringLength > 0 && m_context.MaxByteStringLength < length)
                {
                    throw ServiceResultException.Create(
                        StatusCodes.BadEncodingLimitsExceeded, 
                        "MaxByteStringLength {0} < {1}", 
                        m_context.MaxByteStringLength,
                        length);
                }

                // read the bytes of the body.
                extension.Body = m_reader.ReadBytes(length);
                return extension;
            }

            // save the current position.
            int start = Position;
            
            // decode body.            
            encodeable.Decode(this);

            // skip any unread data.
            int unused = length - (Position - start);

            if (unused > 0)
            {
                m_reader.ReadBytes(unused);
            }
                        
            extension.Body = encodeable;
            return extension;
        }
コード例 #19
0
ファイル: Opc.Ua.Client.cs プロジェクト: zryska/UA-.NET
        /// <summary>
        /// Begins an asynchronous invocation of the ActivateSession service.
        /// </summary>
        public IAsyncResult BeginActivateSession(
            RequestHeader                       requestHeader,
            SignatureData                       clientSignature,
            SignedSoftwareCertificateCollection clientSoftwareCertificates,
            StringCollection                    localeIds,
            ExtensionObject                     userIdentityToken,
            SignatureData                       userTokenSignature,
            AsyncCallback                       callback,
            object                              asyncState)
        {
            ActivateSessionRequest request = new ActivateSessionRequest();

            request.RequestHeader              = requestHeader;
            request.ClientSignature            = clientSignature;
            request.ClientSoftwareCertificates = clientSoftwareCertificates;
            request.LocaleIds                  = localeIds;
            request.UserIdentityToken          = userIdentityToken;
            request.UserTokenSignature         = userTokenSignature;

            UpdateRequestHeader(request, requestHeader == null, "ActivateSession");

            if (UseTransportChannel)
            {
                return TransportChannel.BeginSendRequest(request, callback, asyncState);
            }

            return InnerChannel.BeginActivateSession(new ActivateSessionMessage(request), callback, asyncState);
        }
コード例 #20
0
ファイル: Opc.Ua.Client.cs プロジェクト: zryska/UA-.NET
        /// <summary>
        /// Invokes the ActivateSession service.
        /// </summary>
        public virtual ResponseHeader ActivateSession(
            RequestHeader                       requestHeader,
            SignatureData                       clientSignature,
            SignedSoftwareCertificateCollection clientSoftwareCertificates,
            StringCollection                    localeIds,
            ExtensionObject                     userIdentityToken,
            SignatureData                       userTokenSignature,
            out byte[]                          serverNonce,
            out StatusCodeCollection            results,
            out DiagnosticInfoCollection        diagnosticInfos)
        {
            ActivateSessionRequest request = new ActivateSessionRequest();
            ActivateSessionResponse response = null;

            request.RequestHeader              = requestHeader;
            request.ClientSignature            = clientSignature;
            request.ClientSoftwareCertificates = clientSoftwareCertificates;
            request.LocaleIds                  = localeIds;
            request.UserIdentityToken          = userIdentityToken;
            request.UserTokenSignature         = userTokenSignature;

            UpdateRequestHeader(request, requestHeader == null, "ActivateSession");

            try
            {
                if (UseTransportChannel)
                {
                    IServiceResponse genericResponse = TransportChannel.SendRequest(request);

                    if (genericResponse == null)
                    {
                        throw new ServiceResultException(StatusCodes.BadUnknownResponse);
                    }

                    ValidateResponse(genericResponse.ResponseHeader);
                    response = (ActivateSessionResponse)genericResponse;
                }
                else
                {
                    ActivateSessionResponseMessage responseMessage = InnerChannel.ActivateSession(new ActivateSessionMessage(request));

                    if (responseMessage == null || responseMessage.ActivateSessionResponse == null)
                    {
                        throw new ServiceResultException(StatusCodes.BadUnknownResponse);
                    }

                    response = responseMessage.ActivateSessionResponse;
                    ValidateResponse(response.ResponseHeader);
                }

                serverNonce     = response.ServerNonce;
                results         = response.Results;
                diagnosticInfos = response.DiagnosticInfos;
            }
            finally
            {
                RequestCompleted(request, response, "ActivateSession");
            }

            return response.ResponseHeader;
        }
コード例 #21
0
ファイル: Opc.Ua.Client.cs プロジェクト: zryska/UA-.NET
        /// <summary>
        /// Begins an asynchronous invocation of the HistoryRead service.
        /// </summary>
        public IAsyncResult BeginHistoryRead(
            RequestHeader                requestHeader,
            ExtensionObject              historyReadDetails,
            TimestampsToReturn           timestampsToReturn,
            bool                         releaseContinuationPoints,
            HistoryReadValueIdCollection nodesToRead,
            AsyncCallback                callback,
            object                       asyncState)
        {
            HistoryReadRequest request = new HistoryReadRequest();

            request.RequestHeader             = requestHeader;
            request.HistoryReadDetails        = historyReadDetails;
            request.TimestampsToReturn        = timestampsToReturn;
            request.ReleaseContinuationPoints = releaseContinuationPoints;
            request.NodesToRead               = nodesToRead;

            UpdateRequestHeader(request, requestHeader == null, "HistoryRead");

            if (UseTransportChannel)
            {
                return TransportChannel.BeginSendRequest(request, callback, asyncState);
            }

            return InnerChannel.BeginHistoryRead(new HistoryReadMessage(request), callback, asyncState);
        }
コード例 #22
0
ファイル: Program.cs プロジェクト: yuriik83/UA-.NET
        /// <summary>
        /// Deletes the history of values for a set of variables at given time interval.
        /// </summary>
        static void HistoryDeleteRaw(Session session)
        {
            // translate browse paths.
            IList<NodeOfInterest> results = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, 
                VariableBrowsePaths.ToArray());


            DiagnosticInfoCollection diagnosticInfos;

            ExtensionObjectCollection eoc = new ExtensionObjectCollection();
            for (int ii = 0; ii < results.Count; ii++)
            {
                DeleteRawModifiedDetails deleteDetails = new DeleteRawModifiedDetails();
                deleteDetails.StartTime = new DateTime(2008, 1, 1, 12, 0, 0);
                deleteDetails.EndTime = new DateTime(2008, 1, 1, 12, 0, 10);

                deleteDetails.NodeId = results[ii].NodeId;
                deleteDetails.IsDeleteModified = false;

                ExtensionObject eo = new ExtensionObject(deleteDetails.TypeId, deleteDetails);
                eoc.Add(eo);
            }

            HistoryUpdateResultCollection historyUpdateResults;

            ResponseHeader responseHeader =
                session.HistoryUpdate(null, eoc, out historyUpdateResults, out diagnosticInfos);

            // process results.

            for (int ii = 0; ii < historyUpdateResults.Count; ii++)
            {
                HistoryUpdateResult historyUpdateResult = historyUpdateResults[ii];

                Console.WriteLine("HistoryUpdate result code for {0}:  {1}", VariableBrowsePaths[ii], historyUpdateResult.StatusCode.ToString());

                if (StatusCode.IsGood(historyUpdateResult.StatusCode))
                {
                    for (int jj = 0; jj < historyUpdateResult.OperationResults.Count; jj++)
                    {
                        Console.WriteLine("    {0}: {1}", jj, historyUpdateResult.OperationResults[jj]);
                    }
                    Console.WriteLine("");
                }
            }
        }
コード例 #23
0
ファイル: Program.cs プロジェクト: yuriik83/UA-.NET
        static void HistoryReadProcessed(Session session)
        {
            // translate browse paths.
            IList<NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, 
                VariableBrowsePaths.ToArray());

            DiagnosticInfoCollection diagnosticInfos;

            NodeId aggregateNodeId = null;

            RequestHeader rh = null;
            ViewDescription vd = null;
            ReferenceDescriptionCollection references;
            byte[] cp;

            //Get the list of avalilable aggregate functions:
            session.Browse(
                rh, 
                vd, 
                Opc.Ua.ObjectIds.Server_ServerCapabilities_AggregateFunctions,
                1000,
                BrowseDirection.Forward, 
                ReferenceTypeIds.Aggregates, 
                false, 
                0, 
                out cp, 
                out references);

            Console.WriteLine("{0} aggregates are detected:", references.Count);

            //Print the list of avalible aggregates:
            int i = 0;
            foreach (ReferenceDescription rd in references)
            {
                i++;
                Console.WriteLine("{0}. {1} {2}", i, rd.BrowseName, rd.NodeId.Identifier.ToString());
            }

            //Select aggregate function:
            Console.WriteLine("\nEnter aggregate number: ");
            string str = Console.ReadLine();

            i = System.Int16.Parse(str);

            if (i > 0 && i <= references.Count)
            {
                aggregateNodeId = ExpandedNodeId.ToNodeId(references[i - 1].NodeId, session.NamespaceUris);
            }

            //Prepare arguments to pass to read processed history
            ReadProcessedDetails readDetails = new ReadProcessedDetails();

            readDetails.StartTime = new DateTime(2008, 1, 1, 12, 0, 0);
            readDetails.EndTime = new DateTime(2008, 1, 1, 12, 0, 12);

            readDetails.AggregateType = new NodeIdCollection(nodeIds.Count);
            for (int x = 0; x < nodeIds.Count; x++)
            {
                readDetails.AggregateType.Add (aggregateNodeId);
            }

            readDetails.ProcessingInterval = 500; //500 milliseconds

            ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails);

            HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection();
            for (int ii = 0; ii < nodeIds.Count; ii++)
            {
                HistoryReadValueId readValueId = new HistoryReadValueId();
                readValueId.NodeId = nodeIds[ii].NodeId;
                readValueId.Processed = true;
                idCollection.Add(readValueId);
            }

            HistoryReadResultCollection historyReadResults;

            //Read processed history:
            ResponseHeader responseHeader =
                session.HistoryRead(null, eo, TimestampsToReturn.Both, true,
                idCollection, out historyReadResults, out diagnosticInfos);

            //Print results:
            for (int ii = 0; ii < historyReadResults.Count; ii++)
            {
                HistoryReadResult historyReadResult = historyReadResults[ii];
                ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader);
                
                HistoryData historyData = null;
                DataValueCollection dataValues = null;
                if ( !(historyReadResult.HistoryData == null) )
                {
                    historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData;
                    if (historyData == null)
                        dataValues = null;
                    else
                        dataValues = historyData.DataValues;
                }

                Console.WriteLine("\nHistoryRead result code for {0}:  {1}", VariableBrowsePaths[ii], result.StatusCode.ToString());

                if (dataValues == null)
                {
                    Console.WriteLine("dataValues == null");
                    continue;
                }

                for (int jj = 0; jj < dataValues.Count; jj++)
                {
                    DataValue dataValue = dataValues[jj];
                    if (dataValue == null)
                        continue;

                    // write value.
                    Console.WriteLine("{0}: V={1}, Q={2}, SrvT={3}, SrcT={4}", jj,
                        dataValue.Value == null ? "null" : dataValue.Value.ToString(),
                        dataValue.StatusCode.ToString(),
                        dataValue.ServerTimestamp, dataValue.SourceTimestamp);
                }
            }
        }
コード例 #24
0
ファイル: JsonEncoder.cs プロジェクト: OPCFoundation/UA-.NET
        /// <summary>
        /// Writes an ExtensionObject to the stream.
        /// </summary>
        public void WriteExtensionObject(string fieldName, ExtensionObject value)
        {
            if (value == null || value.Encoding == ExtensionObjectEncoding.None)
            {
                WriteSimpleField(fieldName, null, false);
                return;
            }

            PushStructure(fieldName);
            
            if (value != null)
            {
                IEncodeable encodeable = value.Body as IEncodeable;

                if (encodeable != null)
                {
                    if (UseReversibleEncoding)
                    {
                        WriteExpandedNodeId("TypeId", encodeable.TypeId);
                        WriteEncodeable("Object", encodeable, null);
                    }
                    else
                    {
                        encodeable.Encode(this);
                    }
                }
                else
                {
                    WriteExpandedNodeId("TypeId", value.TypeId);
                    
                    if (value.Body != null)
                    {
                        if (value.Encoding == ExtensionObjectEncoding.Binary)
                        {
                            WriteByteString("Binary", value.Body as byte[]);
                        }
                        else if (value.Encoding == ExtensionObjectEncoding.Xml)
                        {
                            WriteXmlElement("Xml", value.Body as XmlElement);
                        }
                    }
                }
            }

            PopStructure();
        }
コード例 #25
0
ファイル: Variant.cs プロジェクト: neobox3000/UA-.NET
        /// <summary>
        /// Parses an XML element and returns the value contained in it.
        /// </summary>
        private object ToObject(XmlElement element)
        {
            switch (element.Name)
            {
            case "Byte":
            {
                return(XmlConvert.ToByte(element.InnerText));
            }

            case "SByte":
            {
                return(XmlConvert.ToSByte(element.InnerText));
            }

            case "Int16":
            {
                return(XmlConvert.ToInt16(element.InnerText));
            }

            case "UInt16":
            {
                return(XmlConvert.ToUInt16(element.InnerText));
            }

            case "Int32":
            {
                return(XmlConvert.ToInt32(element.InnerText));
            }

            case "UInt32":
            {
                return(XmlConvert.ToUInt32(element.InnerText));
            }

            case "Int64":
            {
                return(XmlConvert.ToInt64(element.InnerText));
            }

            case "UInt64":
            {
                return(XmlConvert.ToUInt64(element.InnerText));
            }

            case "Single":
            {
                return(XmlConvert.ToSingle(element.InnerText));
            }

            case "Double":
            {
                return(XmlConvert.ToDouble(element.InnerText));
            }

            case "String":
            {
                return(element.InnerText);
            }

            case "DateTime":
            {
                return(XmlConvert.ToDateTime(element.InnerText, XmlDateTimeSerializationMode.Utc));
            }

            case "NodeId":
            {
                XmlNode child = element.FirstChild;

                string id = null;

                if (GetValue(element, ref child, "Identifier", out id))
                {
                    return(new NodeId(id));
                }

                break;
            }

            case "ExpandedNodeId":
            {
                XmlNode child = element.FirstChild;

                string id = null;

                if (GetValue(element, ref child, "Identifier", out id))
                {
                    return(new NodeId(id));
                }

                break;
            }

            case "QualifiedName":
            {
                QualifiedName value = new QualifiedName();

                XmlNode child = element.FirstChild;

                string namespaceIndex = null;

                if (GetValue(element, ref child, "NamespaceIndex", out namespaceIndex))
                {
                    value.NamespaceIndex = XmlConvert.ToUInt16(namespaceIndex);
                }

                string name = null;

                if (GetValue(element, ref child, "Name", out name))
                {
                    value.Name = name;
                }

                return(value);
            }

            case "LocalizedText":
            {
                LocalizedText value = new LocalizedText();

                XmlNode child = element.FirstChild;

                string locale = null;

                if (GetValue(element, ref child, "Locale", out locale))
                {
                    value.Locale = locale;
                }

                string text = null;

                if (GetValue(element, ref child, "Text", out text))
                {
                    value.Text = text;
                }

                return(value);
            }

            case "StatusCode":
            {
                StatusCode value = new StatusCode();

                XmlNode child = element.FirstChild;

                string code = null;

                if (GetValue(element, ref child, "Code", out code))
                {
                    value.Code = XmlConvert.ToUInt32(code);;
                }

                return(value);
            }

            case "ExtensionObject":
            {
                ExtensionObject value = new ExtensionObject();

                XmlNode child = element.FirstChild;

                string typeId = null;

                if (GetValue(element, ref child, "TypeId", out typeId))
                {
                    value.TypeId = new ExpandedNodeId(typeId);
                }

                for (XmlNode node = child; node != null; node = node.NextSibling)
                {
                    XmlElement element2 = child as XmlElement;

                    if (element2 != null)
                    {
                        if (element2.Name == "Body")
                        {
                            ExtensionObjectBody body = new ExtensionObjectBody();
                            body.Nodes = new XmlNode[] { GetFirstElement(element2) };
                            value.Body = body;
                        }

                        break;
                    }
                }

                return(value);
            }
            }

            return(null);
        }
コード例 #26
0
        /// <summary>
        /// Validates the content filter element.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="index">The index.</param>
        /// <returns>The results of the validation.</returns>
        public virtual ContentFilter.ElementResult Validate(FilterContext context, int index)
        {
            ContentFilter.ElementResult result = new ContentFilter.ElementResult(null);

            // check the number of operands.
            int operandCount = -1;

            switch (m_filterOperator)
            {
            case FilterOperator.Not:
            case FilterOperator.IsNull:
            case FilterOperator.InView:
            case FilterOperator.OfType:
            {
                operandCount = 1;
                break;
            }

            case FilterOperator.And:
            case FilterOperator.Or:
            case FilterOperator.Equals:
            case FilterOperator.GreaterThan:
            case FilterOperator.GreaterThanOrEqual:
            case FilterOperator.LessThan:
            case FilterOperator.LessThanOrEqual:
            case FilterOperator.Like:
            case FilterOperator.Cast:
            {
                operandCount = 2;
                break;
            }

            case FilterOperator.Between:
            {
                operandCount = 3;
                break;
            }

            case FilterOperator.RelatedTo:
            {
                operandCount = 4;
                break;
            }

            case FilterOperator.InList:
            {
                operandCount = -1;
                break;
            }

            default:
            {
                break;
            }
            }

            if (operandCount != -1)
            {
                if (operandCount != m_filterOperands.Count)
                {
                    result.Status = ServiceResult.Create(
                        StatusCodes.BadEventFilterInvalid,
                        "ContentFilterElement does not have the correct number of operands (Operator={0} OperandCount={1}).",
                        m_filterOperator,
                        operandCount);

                    return(result);
                }
            }
            else
            {
                if (m_filterOperands.Count < 2)
                {
                    result.Status = ServiceResult.Create(
                        StatusCodes.BadEventFilterInvalid,
                        "ContentFilterElement does not have the correct number of operands (Operator={0} OperandCount={1}).",
                        m_filterOperator,
                        m_filterOperands.Count);

                    return(result);
                }
            }

            // validate the operands.
            bool error = false;

            for (int ii = 0; ii < m_filterOperands.Count; ii++)
            {
                ServiceResult operandResult = null;

                ExtensionObject operand = m_filterOperands[ii];

                // check for null.
                if (ExtensionObject.IsNull(operand))
                {
                    operandResult = ServiceResult.Create(
                        StatusCodes.BadEventFilterInvalid,
                        "The FilterOperand cannot be Null.");

                    result.OperandResults.Add(operandResult);
                    error = true;
                    continue;
                }

                // check that the extension object contains a filter operand.
                FilterOperand filterOperand = operand.Body  as FilterOperand;

                if (filterOperand == null)
                {
                    operandResult = ServiceResult.Create(
                        StatusCodes.BadEventFilterInvalid,
                        "The FilterOperand is not a supported type ({0}).",
                        filterOperand.GetType());

                    result.OperandResults.Add(operandResult);
                    error = true;
                    continue;
                }

                // validate the operand.
                filterOperand.Parent = this;
                operandResult        = filterOperand.Validate(context, index);

                if (ServiceResult.IsBad(operandResult))
                {
                    result.OperandResults.Add(operandResult);
                    error = true;
                    continue;
                }

                result.OperandResults.Add(null);
            }

            // ensure the global error code.
            if (error)
            {
                result.Status = StatusCodes.BadContentFilterInvalid;
            }
            else
            {
                result.OperandResults.Clear();
            }

            return(result);
        }
コード例 #27
0
ファイル: NamespaceMapper.cs プロジェクト: yuriik83/UA-.NET
        /// <summary>
        /// Converts a remote ExtensionObject to a local ExtensionObject.
        /// </summary>
        private ExtensionObject ToExtensionObject(ExtensionObject extension, int[] namespaceIndexes)
        {
            if (ExtensionObject.IsNull(extension))
            {
                return extension;
            }

            Argument argument = extension.Body as Argument;

            if (argument != null)
            {
                Argument argument2 = (Argument)argument.Clone();
                argument2.DataType = ToId(argument.DataType, namespaceIndexes);
                return new ExtensionObject(null, argument2);
            }

            return extension;
        }
コード例 #28
0
ファイル: Variant.cs プロジェクト: yuriik83/UA-.NET
        /// <summary>
        /// Parses an XML element and returns the value contained in it. 
        /// </summary>
        private object ToObject(XmlElement element)
        {
            switch (element.Name)
            {
                case "Byte":
                {
                    return XmlConvert.ToByte(element.InnerText);
                }

                case "SByte":
                {
                    return XmlConvert.ToSByte(element.InnerText);
                }

                case "Int16":
                {
                    return XmlConvert.ToInt16(element.InnerText);
                }

                case "UInt16":
                {
                    return XmlConvert.ToUInt16(element.InnerText);
                }

                case "Int32":
                {
                    return XmlConvert.ToInt32(element.InnerText);
                }

                case "UInt32":
                {
                    return XmlConvert.ToUInt32(element.InnerText);
                }

                case "Int64":
                {
                    return XmlConvert.ToInt64(element.InnerText);
                }

                case "UInt64":
                {
                    return XmlConvert.ToUInt64(element.InnerText);
                }

                case "Single":
                {
                    return XmlConvert.ToSingle(element.InnerText);
                }

                case "Double":
                {
                    return XmlConvert.ToDouble(element.InnerText);
                }

                case "String":
                {
                    return element.InnerText;
                }

                case "DateTime":
                {
                    return XmlConvert.ToDateTime(element.InnerText, XmlDateTimeSerializationMode.Utc);
                }

                case "NodeId":
                {
                    XmlNode child = element.FirstChild;

                    string id = null;

                    if (GetValue(element, ref child, "Identifier", out id))
                    {
                        return new NodeId(id);
                    }

                    break;
                }

                case "ExpandedNodeId":
                {
                    XmlNode child = element.FirstChild;

                    string id = null;

                    if (GetValue(element, ref child, "Identifier", out id))
                    {
                        return new NodeId(id);
                    }

                    break;
                }

                case "QualifiedName":
                {
                    QualifiedName value = new QualifiedName();

                    XmlNode child = element.FirstChild;

                    string namespaceIndex = null;

                    if (GetValue(element, ref child, "NamespaceIndex", out namespaceIndex))
                    {
                        value.NamespaceIndex = XmlConvert.ToUInt16(namespaceIndex);
                    }

                    string name = null;

                    if (GetValue(element, ref child, "Name", out name))
                    {
                        value.Name = name;
                    }

                    return value;
                }

                case "LocalizedText":
                {
                    LocalizedText value = new LocalizedText();

                    XmlNode child = element.FirstChild;

                    string locale = null;

                    if (GetValue(element, ref child, "Locale", out locale))
                    {
                        value.Locale = locale;
                    }

                    string text = null;

                    if (GetValue(element, ref child, "Text", out text))
                    {
                        value.Text = text;
                    }

                    return value;
                }

                case "StatusCode":
                {
                    StatusCode value = new StatusCode();

                    XmlNode child = element.FirstChild;

                    string code = null;

                    if (GetValue(element, ref child, "Code", out code))
                    {
                        value.Code = XmlConvert.ToUInt32(code); ;
                    }

                    return value;
                }

                case "ExtensionObject":
                {
                    ExtensionObject value = new ExtensionObject();

                    XmlNode child = element.FirstChild;

                    string typeId = null;

                    if (GetValue(element, ref child, "TypeId", out typeId))
                    {
                        value.TypeId = new ExpandedNodeId(typeId);
                    }

                    for (XmlNode node = child; node != null; node = node.NextSibling)
                    {
                        XmlElement element2 = child as XmlElement;

                        if (element2 != null)
                        {
                            if (element2.Name == "Body")
                            {
                                ExtensionObjectBody body = new ExtensionObjectBody();
                                body.Nodes = new XmlNode[] { GetFirstElement(element2) }; 
                                value.Body = body;
                            }

                            break;
                        }
                    }

                    return value;
                }
            }

            return null;
        }
コード例 #29
0
        /// <summary>
        /// Invokes the ActivateSession service.
        /// </summary>
        public virtual ResponseHeader ActivateSession(
            RequestHeader                       requestHeader,
            SignatureData                       clientSignature,
            SignedSoftwareCertificateCollection clientSoftwareCertificates,
            StringCollection                    localeIds,
            ExtensionObject                     userIdentityToken,
            SignatureData                       userTokenSignature,
            out byte[]                          serverNonce,
            out StatusCodeCollection            results,
            out DiagnosticInfoCollection        diagnosticInfos)
        {
            serverNonce = null;
            results = null;
            diagnosticInfos = null;

            ValidateRequest(requestHeader);

            // Insert implementation.

            return CreateResponse(requestHeader, StatusCodes.BadServiceUnsupported);
        }
コード例 #30
0
ファイル: Program.cs プロジェクト: yuriik83/UA-.NET
        static void HistoryUpdate(Session session)
        {
            DiagnosticInfoCollection diagnosticInfos;

            // translate browse paths.
            IList<NodeOfInterest> nodeIds;

            nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder,
                VariableBrowsePaths.ToArray());

            ExtensionObjectCollection eoc = new ExtensionObjectCollection();
            for (int ii = 0; ii < nodeIds.Count; ii++)
            {
                UpdateDataDetails updateDetails = new UpdateDataDetails();

                updateDetails.NodeId = nodeIds[ii].NodeId;
                updateDetails.PerformInsertReplace = PerformUpdateType.Update;
                updateDetails.UpdateValues = new DataValueCollection();

                for (int jj = 0; jj <= 5; jj++)
                {
                    DataValue dv = new DataValue(new Variant(jj*10), StatusCodes.Good, new DateTime(2008, 01, 01, 12, 0, jj*2));
                    updateDetails.UpdateValues.Add(dv);
                }
                ExtensionObject eo = new ExtensionObject(updateDetails.TypeId, updateDetails);
                eoc.Add(eo);
            }

            HistoryUpdateResultCollection historyUpdateResults;

            ResponseHeader responseHeader =
                session.HistoryUpdate(null, eoc, out historyUpdateResults, out diagnosticInfos);

            
            // process results.

            for (int ii = 0; ii < historyUpdateResults.Count; ii++)
            {
                HistoryUpdateResult historyUpdateResult = historyUpdateResults[ii];

                Console.WriteLine("HistoryUpdate result code for {0}:  {1}", VariableBrowsePaths[ii], historyUpdateResult.StatusCode.ToString());

                if (StatusCode.IsGood(historyUpdateResult.StatusCode))
                {
                    for (int jj = 0; jj < historyUpdateResult.OperationResults.Count; jj++)
                    {
                        Console.WriteLine("    {0}: {1}", jj, historyUpdateResult.OperationResults[jj]);
                    }
                    Console.WriteLine("");
                }
            }
        }
コード例 #31
0
        /// <summary>
        /// Writes an ExtensionObject to the stream.
        /// </summary>
        public void WriteExtensionObject(string fieldName, ExtensionObject value)
        {           
            if (BeginField(fieldName, value == null, true))
            {             
                PushNamespace(Namespaces.OpcUaXsd);
                    
                // check for null.
                if (value == null)
                {
                    EndField(fieldName);
                    PopNamespace();        
                    return;
                }
                
                IEncodeable encodeable = value.Body as IEncodeable;

                // write the type id.
                ExpandedNodeId typeId = value.TypeId;

                if (encodeable != null)
                {
                    if (value.Encoding == ExtensionObjectEncoding.Binary)
                    {
                        typeId = encodeable.BinaryEncodingId;
                    }
                    else
                    {
                        typeId = encodeable.XmlEncodingId;
                    }
                }

                NodeId localTypeId = ExpandedNodeId.ToNodeId(typeId, m_context.NamespaceUris);

                if (NodeId.IsNull(localTypeId) && !NodeId.IsNull(typeId))
                {
                    if (encodeable != null)
                    {
                        throw ServiceResultException.Create(
                            StatusCodes.BadEncodingError,
                            "Cannot encode bodies of type '{0}' in ExtensionObject unless the NamespaceUri ({1}) is in the encoder's NamespaceTable.",
                            encodeable.GetType().FullName,
                            typeId.NamespaceUri);
                    }

                    localTypeId = NodeId.Null;
                }
                
                WriteNodeId("TypeId", localTypeId);
                
                object body = value.Body;

                if (body == null)
                {
                    EndField(fieldName);
                    PopNamespace();        
                    return;
                }
                
                // write the body.
                m_writer.WriteStartElement("Body", Namespaces.OpcUaXsd);

                WriteExtensionObjectBody(body);
                
                // end of body.
                m_writer.WriteEndElement();
 
                EndField(fieldName);
                PopNamespace();               
            }
        }
コード例 #32
0
ファイル: Program.cs プロジェクト: yuriik83/UA-.NET
        /// <summary>
        /// Reads the history of attributes for Bucket Brigade.Int1.
        /// </summary>
        static void HistoryReadAttributes(Session session)
        {

            List<string> VariableBrowsePaths = new List<string>();
                VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:Description");
                VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:DataType");
                VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1/7:ITEMID");

            // translate browse paths.
            IList<NodeOfInterest> nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, 
                VariableBrowsePaths.ToArray());


            DiagnosticInfoCollection diagnosticInfos;

            ReadRawModifiedDetails readDetails = new ReadRawModifiedDetails();
            readDetails.StartTime = DateTime.MinValue;
            readDetails.EndTime = DateTime.Now;
            readDetails.IsReadModified = false;
            readDetails.NumValuesPerNode = 100;
            readDetails.ReturnBounds = false;

            ExtensionObject eo = new ExtensionObject(readDetails.TypeId, readDetails);

            HistoryReadValueIdCollection idCollection = new HistoryReadValueIdCollection();
            for (int ii = 0; ii < nodeIds.Count; ii++)
            {
                HistoryReadValueId readValueId = new HistoryReadValueId();
                readValueId.NodeId = nodeIds[ii].NodeId;
                readValueId.Processed = false;
                idCollection.Add(readValueId);
            }

            HistoryReadResultCollection historyReadResults;

            ResponseHeader responseHeader =
                session.HistoryRead(null, eo, TimestampsToReturn.Both, true,
                idCollection, out historyReadResults, out diagnosticInfos);

            // process results.

            for (int ii = 0; ii < historyReadResults.Count; ii++)
            {
                HistoryReadResult historyReadResult = historyReadResults[ii];
                HistoryData historyData = null;
                DataValueCollection dataValues = null;
                if (historyReadResult.HistoryData != null)
                {
                    historyData = ExtensionObject.ToEncodeable(historyReadResult.HistoryData) as HistoryData;
                    dataValues = historyData.DataValues;
                }

                ServiceResult result = Session.GetResult(historyReadResult.StatusCode, ii, diagnosticInfos, responseHeader);
                
                Console.WriteLine("\nHistoryRead result code for {0}:  {1}", VariableBrowsePaths[ii], result.StatusCode.ToString());

                if (StatusCode.IsBad(historyReadResult.StatusCode))
                {
                    continue;
                }

                if (dataValues == null)
                {
                    Console.WriteLine("dataValues == null");
                    continue;
                }

                for (int jj = 0; jj < dataValues.Count; jj++)
                {

                    DataValue dataValue = dataValues[jj];

                    // write value.
                    Console.WriteLine("\t{0}: V={1}",jj, dataValue.Value == null ? "null" : dataValue.Value.ToString());
                    Console.WriteLine("\t Q={0}, SrvT={1}, SrcT={2}\n",
                        dataValue.StatusCode.ToString(), dataValue.ServerTimestamp, dataValue.SourceTimestamp);
                }
            }
        }
コード例 #33
0
        /// <summary>
        /// Validates the monitoring filter specified by the client.
        /// </summary>
        protected virtual StatusCode ValidateMonitoringFilter(
            ServerSystemContext context,
            NodeHandle handle, 
            uint attributeId,
            double samplingInterval,
            uint queueSize,
            ExtensionObject filter,
            out MonitoringFilter filterToUse,
            out Range range,
            out MonitoringFilterResult result)
        {
            range = null;
            filterToUse = null;
            result = null;

            // nothing to do if the filter is not specified.
            if (ExtensionObject.IsNull(filter))
            {
                return StatusCodes.Good;
            }

            // extension objects wrap any data structure. must check that the client provided the correct structure.
            DataChangeFilter deadbandFilter = ExtensionObject.ToEncodeable(filter) as DataChangeFilter;

            if (deadbandFilter == null)
            {
                AggregateFilter aggregateFilter = ExtensionObject.ToEncodeable(filter) as AggregateFilter;

                if (aggregateFilter == null || attributeId != Attributes.Value)
                {
                    return StatusCodes.BadFilterNotAllowed;
                }

                if (!Server.AggregateManager.IsSupported(aggregateFilter.AggregateType))
                {
                    return StatusCodes.BadAggregateNotSupported;
                }

                ServerAggregateFilter revisedFilter = new ServerAggregateFilter();
                revisedFilter.AggregateType = aggregateFilter.AggregateType;
                revisedFilter.StartTime = aggregateFilter.StartTime;
                revisedFilter.ProcessingInterval = aggregateFilter.ProcessingInterval;
                revisedFilter.AggregateConfiguration = aggregateFilter.AggregateConfiguration;
                revisedFilter.Stepped = false;

                StatusCode error = ReviseAggregateFilter(context, handle, samplingInterval, queueSize, revisedFilter);

                if (StatusCode.IsBad(error))
                {
                    return error;
                }

                AggregateFilterResult aggregateFilterResult = new AggregateFilterResult();
                aggregateFilterResult.RevisedProcessingInterval = aggregateFilter.ProcessingInterval;
                aggregateFilterResult.RevisedStartTime = aggregateFilter.StartTime;
                aggregateFilterResult.RevisedAggregateConfiguration = aggregateFilter.AggregateConfiguration;

                filterToUse = revisedFilter;
                result = aggregateFilterResult;
                return StatusCodes.Good;
            }

            // deadband filters only allowed for variable values.
            if (attributeId != Attributes.Value)
            {
                return StatusCodes.BadFilterNotAllowed;
            }

            BaseVariableState variable = handle.Node as BaseVariableState;

            if (variable == null)
            {
                return StatusCodes.BadFilterNotAllowed;
            }

            // check for status filter.
            if (deadbandFilter.DeadbandType == (uint)DeadbandType.None)
            {
                filterToUse = deadbandFilter;
                return StatusCodes.Good;
            }

            // deadband filters can only be used for numeric values.
            if (!Server.TypeTree.IsTypeOf(variable.DataType, DataTypeIds.Number))
            {
                return StatusCodes.BadFilterNotAllowed;
            }
            
            // nothing more to do for absolute filters.
            if (deadbandFilter.DeadbandType == (uint)DeadbandType.Absolute)
            {
                filterToUse = deadbandFilter;
                return StatusCodes.Good;
            }

            // need to look up the EU range if a percent filter is requested.
            if (deadbandFilter.DeadbandType == (uint)DeadbandType.Percent)
            {
                PropertyState property = handle.Node.FindChild(context, Opc.Ua.BrowseNames.EURange) as PropertyState;

                if (property == null)
                {
                    return StatusCodes.BadFilterNotAllowed;
                }
                
                range = property.Value as Range;
                
                if (range == null)
                {
                    return StatusCodes.BadFilterNotAllowed;
                }

                filterToUse = deadbandFilter;

                return StatusCodes.Good;
            }

            // no other type of filter supported.
            return StatusCodes.BadFilterNotAllowed;
        }
コード例 #34
0
ファイル: EncodableObject.cs プロジェクト: yuriik83/UA-.NET
        /// <summary>
        /// Applies the data encoding to the value.
        /// </summary>
        public static ServiceResult ApplyDataEncoding(ServiceMessageContext context, QualifiedName dataEncoding, ref object value)
        {
            // check if nothing to do.
            if (QualifiedName.IsNull(dataEncoding) || value == null)
            {
                return ServiceResult.Good;
            }

            // check for supported encoding type.
            if (dataEncoding.NamespaceIndex != 0)
            {
                return StatusCodes.BadDataEncodingUnsupported;
            }

            bool useXml = dataEncoding.Name == DefaultXml;

            if (!useXml && dataEncoding.Name != DefaultBinary)
            {
                return StatusCodes.BadDataEncodingUnsupported;
            }
            
            try
            {
                // check for array of encodeables.
                IList<IEncodeable> encodeables = value as IList<IEncodeable>;

                if (encodeables == null)
                {
                    // check for array of extension objects.
                    IList<ExtensionObject> extensions = value as IList<ExtensionObject>;

                    if (extensions != null)
                    {
                        // convert extension objects to encodeables.
                        encodeables = new IEncodeable[extensions.Count];

                        for (int ii = 0; ii < encodeables.Count; ii++)
                        {
                            if (ExtensionObject.IsNull(extensions[ii]))
                            {
                                encodeables[ii] = null;
                                continue;
                            }

                            IEncodeable element = extensions[ii].Body as IEncodeable;

                            if (element == null)
                            {
                                return StatusCodes.BadTypeMismatch;
                            }

                            encodeables[ii] = element;
                        }
                    }
                }

                // apply data encoding to the array.
                if (encodeables != null)
                {                    
                    ExtensionObject[] extensions = new ExtensionObject[encodeables.Count];
                
                    for (int ii = 0; ii < extensions.Length; ii++)
                    {
                        extensions[ii] = Encode(context, encodeables[ii], useXml);
                    }

                    value = extensions;
                    return ServiceResult.Good;
                }
                
                // check for scalar value.
                IEncodeable encodeable = value as IEncodeable;

                if (encodeable == null)
                {
                    ExtensionObject extension = value as ExtensionObject;
                    
                    if (extension == null)
                    {
                        return StatusCodes.BadDataEncodingUnsupported;
                    }

                    encodeable = extension.Body as IEncodeable;
                }

                if (encodeable == null)
                {
                    return StatusCodes.BadDataEncodingUnsupported;
                }
                
                // do conversion.
                value = Encode(context, encodeable, useXml);                    
                return ServiceResult.Good;
            }
            catch (Exception e)
            {
                return ServiceResult.Create(e, StatusCodes.BadTypeMismatch, "Could not convert value to requested format.");
            }
        }
コード例 #35
0
        /// <summary>
        /// Applies the data encoding to the value.
        /// </summary>
        public static ServiceResult ApplyDataEncoding(ServiceMessageContext context, QualifiedName dataEncoding, ref object value)
        {
            // check if nothing to do.
            if (QualifiedName.IsNull(dataEncoding) || value == null)
            {
                return(ServiceResult.Good);
            }

            // check for supported encoding type.
            if (dataEncoding.NamespaceIndex != 0)
            {
                return(StatusCodes.BadDataEncodingUnsupported);
            }

            bool useXml = dataEncoding.Name == DefaultXml;

            if (!useXml && dataEncoding.Name != DefaultBinary)
            {
                return(StatusCodes.BadDataEncodingUnsupported);
            }

            try
            {
                // check for array of encodeables.
                IList <IEncodeable> encodeables = value as IList <IEncodeable>;

                if (encodeables == null)
                {
                    // check for array of extension objects.
                    IList <ExtensionObject> extensions = value as IList <ExtensionObject>;

                    if (extensions != null)
                    {
                        // convert extension objects to encodeables.
                        encodeables = new IEncodeable[extensions.Count];

                        for (int ii = 0; ii < encodeables.Count; ii++)
                        {
                            if (ExtensionObject.IsNull(extensions[ii]))
                            {
                                encodeables[ii] = null;
                                continue;
                            }

                            IEncodeable element = extensions[ii].Body as IEncodeable;

                            if (element == null)
                            {
                                return(StatusCodes.BadTypeMismatch);
                            }

                            encodeables[ii] = element;
                        }
                    }
                }

                // apply data encoding to the array.
                if (encodeables != null)
                {
                    ExtensionObject[] extensions = new ExtensionObject[encodeables.Count];

                    for (int ii = 0; ii < extensions.Length; ii++)
                    {
                        extensions[ii] = Encode(context, encodeables[ii], useXml);
                    }

                    value = extensions;
                    return(ServiceResult.Good);
                }

                // check for scalar value.
                IEncodeable encodeable = value as IEncodeable;

                if (encodeable == null)
                {
                    ExtensionObject extension = value as ExtensionObject;

                    if (extension == null)
                    {
                        return(StatusCodes.BadDataEncodingUnsupported);
                    }

                    encodeable = extension.Body as IEncodeable;
                }

                if (encodeable == null)
                {
                    return(StatusCodes.BadDataEncodingUnsupported);
                }

                // do conversion.
                value = Encode(context, encodeable, useXml);
                return(ServiceResult.Good);
            }
            catch (Exception e)
            {
                return(ServiceResult.Create(e, StatusCodes.BadTypeMismatch, "Could not convert value to requested format."));
            }
        }
コード例 #36
0
        /// <summary>
        /// Creates a deep copy of the value.
        /// </summary>
        /// <param name="value">The value to be copied.</param>
        /// <remarks>
        /// Creates a deep copy of the value.
        /// </remarks>
        /// <exception cref="ArgumentNullException">Thrown when the value is null</exception>
        public ExtensionObject(ExtensionObject value) {
            if (value == null) throw new ArgumentNullException("value");

            TypeId = value.TypeId;
            Body = Utils.Clone(value.Body);
        }