示例#1
0
        internal sealed override void WriteChanges(EmberWriter writer, IInvocationCollection pendingInvocations)
        {
            if (this.HasChanges)
            {
                writer.WriteStartApplicationDefinedType(
                    GlowElementCollection.Element.OuterId, GlowQualifiedParameter.InnerNumber);

                writer.WriteValue(GlowQualifiedParameter.Path.OuterId, this.NumberPath);
                writer.WriteStartSet(GlowQualifiedParameter.Contents.OuterId);

                if (this.theValue == null)
                {
                    // This can only happen when the parameter happens to be a trigger.
                    writer.WriteValue(GlowParameterContents.Value.OuterId, 0);
                }
                else
                {
                    this.WriteValue(writer, this.theValue);
                }

                writer.WriteEndContainer();
                writer.WriteEndContainer();
                this.HasChanges = false;
            }
        }
示例#2
0
        internal sealed override void WriteChanges(EmberWriter writer, IInvocationCollection pendingInvocations)
        {
            if (this.HasChanges)
            {
                writer.WriteStartApplicationDefinedType(
                    GlowElementCollection.Element.OuterId, GlowQualifiedMatrix.InnerNumber);

                writer.WriteValue(GlowQualifiedMatrix.Path.OuterId, this.NumberPath);
                writer.WriteStartSequence(GlowQualifiedMatrix.Connections.OuterId);

                foreach (var target in this.targetsWithChangedConnections)
                {
                    writer.WriteStartApplicationDefinedType(
                        GlowConnectionCollection.Connection.OuterId, GlowConnection.InnerNumber);
                    writer.WriteValue(GlowConnection.Target.OuterId, target);
                    writer.WriteValue(GlowConnection.Sources.OuterId, this.connections[target].ToArray());
                    writer.WriteEndContainer();
                }

                writer.WriteEndContainer();
                writer.WriteEndContainer();
                this.targetsWithChangedConnections.Clear();
                this.HasChanges = false;
            }
        }
 internal void WriteChangesCollection(EmberWriter writer, IInvocationCollection pendingInvocations)
 {
     foreach (var child in this.children.Values)
     {
         child.WriteChanges(writer, pendingInvocations);
     }
 }
        internal sealed override void WriteValue(EmberWriter writer, object value)
        {
            switch (GetTypeToWrite(this.Type, value))
            {
            case ParameterType.Integer:
            case ParameterType.Enum:
                writer.WriteValue(GlowParameterContents.Value.OuterId, (long)value);
                break;

            case ParameterType.Real:
                writer.WriteValue(GlowParameterContents.Value.OuterId, (double)value);
                break;

            case ParameterType.String:
                writer.WriteValue(GlowParameterContents.Value.OuterId, (string)value);
                break;

            case ParameterType.Boolean:
                writer.WriteValue(GlowParameterContents.Value.OuterId, (bool)value);
                break;

            default:
                writer.WriteValue(GlowParameterContents.Value.OuterId, (byte[])value);
                break;
            }
        }
        internal override bool WriteRequest(EmberWriter writer, IStreamedParameterCollection streamedParameters)
        {
            if (this.RetrievalState.Equals(RetrievalState.None))
            {
                var isEmpty = this.children.Count == 0;

                if (isEmpty)
                {
                    writer.WriteStartApplicationDefinedType(
                        GlowElementCollection.Element.OuterId, GlowQualifiedNode.InnerNumber);
                    writer.WriteValue(GlowQualifiedNode.Path.OuterId, this.NumberPath);
                    writer.WriteStartApplicationDefinedType(
                        GlowQualifiedNode.Children.OuterId, GlowElementCollection.InnerNumber);
                }

                var result = this.WriteCommandCollection(writer, streamedParameters);

                if (isEmpty)
                {
                    writer.WriteEndContainer();
                    writer.WriteEndContainer();
                }

                return(result);
            }
            else
            {
                return(false);
            }
        }
示例#6
0
        void Test_ReaderWriter()
        {
            var output = new BerMemoryOutput();
            var writer = new EmberWriter(output);

            writer.WriteSequenceBegin(new BerTag(DefaultClass, 1));

            for (uint index = 0; index <= 20; index++)
            {
                writer.Write(new BerTag(DefaultClass, index + 111122), index);
            }

            var oid = new int[100];

            for (int index = 0; index < oid.Length; index++)
            {
                oid[index] = 1000 + index;
            }

            writer.WriteRelativeOid(new BerTag(DefaultClass, 500000), oid);

            writer.WriteContainerEnd();

            Console.WriteLine("\r\n------------------------ Reader, Writer");

            var asyncReader = new AsyncDomReader(null);

            asyncReader.ReadBytes(output.Memory);

            var root = asyncReader.DetachRoot();

            Console.WriteLine(GetXml(root));
        }
示例#7
0
        internal sealed override bool WriteRequest(EmberWriter writer, IStreamedParameterCollection streamedParameters)
        {
            writer.WriteStartApplicationDefinedType(GlowGlobal.Root.OuterId, GlowRootElementCollection.InnerNumber);
            var result = this.WriteCommandCollection(writer, streamedParameters);

            writer.WriteEndContainer();
            return(result);
        }
示例#8
0
 internal override void WriteChanges(EmberWriter writer, IInvocationCollection pendingInvocations)
 {
     if (this.HasChanges)
     {
         this.WriteChangesCollection(writer, pendingInvocations);
         this.HasChanges = false;
     }
 }
 internal void WriteCommandCollection(
     EmberWriter writer, GlowCommandNumber commandNumber, RetrievalState retrievalState)
 {
     writer.WriteStartApplicationDefinedType(GlowElementCollection.Element.OuterId, GlowCommand.InnerNumber);
     writer.WriteValue(GlowCommand.Number.OuterId, (long)commandNumber);
     writer.WriteEndContainer();
     this.RetrievalState = retrievalState;
 }
 private bool WriteRequest(out MemoryStream stream)
 {
     // TODO: Reuse MemoryStream and EmberWriter for all outgoing messages.
     using (stream = new MemoryStream())
         using (var writer = new EmberWriter(stream))
         {
             return(this.root.WriteRequest(writer, this.streamedParameters));
         }
 }
示例#11
0
 internal sealed override void WriteChanges(EmberWriter writer, IInvocationCollection pendingInvocations)
 {
     if (this.HasChanges)
     {
         writer.WriteStartApplicationDefinedType(GlowGlobal.Root.OuterId, GlowRootElementCollection.InnerNumber);
         this.WriteChangesCollection(writer, pendingInvocations);
         writer.WriteEndContainer();
         this.HasChanges = false;
     }
 }
        private void ReadChildContents(
            EmberReader reader,
            ElementType actualType,
            int number,
            ref Element child,
            out RetrievalState childRetrievalState)
        {
            reader.AssertInnerNumber(InnerNumber.Set);

            if (child != null)
            {
                childRetrievalState = child.ReadContents(reader, actualType);
            }
            else
            {
                using (var stream = new MemoryStream())
                    using (var writer = new EmberWriter(stream))
                    {
                        // Since EmberReader checks that every end of a container is matched by a start, we need to write
                        // this dummy here.
                        writer.WriteStartSet(GlowNode.Contents.OuterId);
                        var identifier = reader.CopyToEndContainer(writer, GlowNodeContents.Identifier.OuterId) as string;

                        if (identifier != null)
                        {
                            writer.Flush();
                            stream.Position = 0;

                            using (var contentsReader = new EmberReader(stream))
                            {
                                contentsReader.Read(); // Read what we have written with WriteStartSet above

                                var newPolicy = this.childrenRetrievalPolicy == ChildrenRetrievalPolicy.All ?
                                                ChildrenRetrievalPolicy.All : ChildrenRetrievalPolicy.None;
                                var context = new Context(this, number, identifier, newPolicy);
                                child = this.ReadNewChildContents(contentsReader, actualType, context, out childRetrievalState);

                                if (child != null)
                                {
                                    this.children.Add(number, child);
                                }
                            }
                        }
                        else
                        {
                            childRetrievalState = RetrievalState.Complete;
                            child = null;
                        }
                    }
            }
        }
示例#13
0
        internal sealed override void WriteChanges(EmberWriter writer, IInvocationCollection pendingInvocations)
        {
            if (this.HasChanges)
            {
                writer.WriteStartApplicationDefinedType(
                    GlowElementCollection.Element.OuterId, GlowQualifiedFunction.InnerNumber);

                writer.WriteValue(GlowQualifiedFunction.Path.OuterId, this.NumberPath);
                writer.WriteStartApplicationDefinedType(
                    GlowQualifiedFunction.Children.OuterId, GlowElementCollection.InnerNumber);
                this.WriteInvocations(writer, pendingInvocations);
                writer.WriteEndContainer();
                writer.WriteEndContainer();
                this.HasChanges = false;
            }
        }
        /// <summary>Applies the payload of the current message to the tree rooted in <see cref="Root"/>.</summary>
        /// <exception cref="InvalidOperationException">
        /// <list type="bullet">
        /// <item><see cref="Read"/> has never been called, or</item>
        /// <item>the last call to <see cref="Read"/> returned <c>false</c> or threw an exception.</item>
        /// </list></exception>
        /// <exception cref="XmlException">An error occurred while parsing the XML-encoded data, see
        /// <see cref="Exception.Message"/> for more information.</exception>
        public void ApplyPayload()
        {
            var payload = this.reader.GetPayload();

            if (payload.Length > 0)
            {
                using (var stream = new MemoryStream(payload))
                    using (var emberReader = new EmberReader(stream))
                        using (var dummyWriter = new EmberWriter(Stream.Null))
                        {
                            this.root.Read(emberReader, this.pendingInvocations, this.streamedParameters);
                            this.root.WriteRequest(dummyWriter, this.streamedParameters);
                            this.root.SetComplete();
                            this.root.UpdateRetrievalState(true);
                        }
            }
        }
示例#15
0
        internal sealed override bool WriteRequest(EmberWriter writer, IStreamedParameterCollection streamedParameters)
        {
            if (this.RetrievalState.Equals(RetrievalState.None))
            {
                writer.WriteStartApplicationDefinedType(
                    GlowElementCollection.Element.OuterId, GlowQualifiedParameter.InnerNumber);
                writer.WriteValue(GlowQualifiedParameter.Path.OuterId, this.NumberPath);
                writer.WriteStartApplicationDefinedType(
                    GlowQualifiedParameter.Children.OuterId, GlowElementCollection.InnerNumber);
                this.WriteCommandCollection(writer, GlowCommandNumber.Subscribe, RetrievalState.Complete);
                writer.WriteEndContainer();
                writer.WriteEndContainer();
                streamedParameters.Add(this);
            }

            return(false);
        }
        private async Task SendCoreAsync()
        {
            if (this.root.HasChanges)
            {
                MemoryStream stream;

                // TODO: Reuse MemoryStream and EmberWriter for all outgoing messages.
                using (stream = new MemoryStream())
                    using (var writer = new EmberWriter(stream))
                    {
                        this.root.WriteChanges(writer, this.pendingInvocations);
                    }

                await this.client.SendMessageAsync(this.emberDataMessage, stream.ToArray());
            }

            await this.RetrieveChildrenAsync();
        }
        internal bool WriteCommandCollection(EmberWriter writer, IStreamedParameterCollection streamedParameters)
        {
            if (this.children.Count == 0)
            {
                this.WriteCommandCollection(writer, GlowCommandNumber.GetDirectory, RetrievalState.RequestSent);
                return(true);
            }
            else
            {
                var result = false;

                foreach (var child in this.children.Values)
                {
                    // We want to avoid short-circuit logic, which is why we use | rather than ||.
                    result |= child.WriteRequest(writer, streamedParameters);
                }

                return(result);
            }
        }
        public void IncomingTest()
        {
            AsyncPump.Run(() => AssertThrowAsync <S101Exception>(() => TestWithRobot <S101Payloads>(
                                                                     async client =>
            {
                using (var stream = new MemoryStream())
                {
                    using (var writer = new EmberWriter(stream))
                    {
                        writer.WriteValue(EmberId.CreateApplication(0), false);
                    }

                    await client.SendMessageAsync(EmberDataMessage, stream.ToArray());
                }
            },
                                                                     null,
                                                                     null,
                                                                     Types,
                                                                     false,
                                                                     "IncomingLog.xml")));
        }
示例#19
0
        public void IncomingTest()
        {
            AsyncPump.Run(() => AssertThrowAsync<S101Exception>(() => TestWithRobot<S101Payloads>(
                async client =>
                {
                    using (var stream = new MemoryStream())
                    {
                        using (var writer = new EmberWriter(stream))
                        {
                            writer.WriteValue(EmberId.CreateApplication(0), false);
                        }

                        await client.SendMessageAsync(EmberDataMessage, stream.ToArray());
                    }
                },
                null,
                null,
                Types,
                false,
                "IncomingLog.xml")));
        }
示例#20
0
        private void WriteInvocations(EmberWriter writer, IInvocationCollection pendingInvocations)
        {
            while (this.invocations.Count > 0)
            {
                writer.WriteStartApplicationDefinedType(GlowElementCollection.Element.OuterId, GlowCommand.InnerNumber);
                writer.WriteValue(GlowCommand.Number.OuterId, 33);
                writer.WriteStartApplicationDefinedType(GlowCommand.Invocation.OuterId, GlowInvocation.InnerNumber);
                var invocation   = this.invocations.Dequeue();
                var invocationId = pendingInvocations.Add(invocation.Key);
                writer.WriteValue(GlowInvocation.InvocationId.OuterId, invocationId);
                writer.WriteStartSequence(GlowInvocation.Arguments.OuterId);

                foreach (var writeValue in invocation.Value)
                {
                    writeValue(writer);
                }

                writer.WriteEndContainer();
                writer.WriteEndContainer();
                writer.WriteEndContainer();
            }
        }
示例#21
0
文件: Program.cs 项目: scy/ember-plus
        void Test_ReaderWriter()
        {
            var output = new BerMemoryOutput();
            var writer = new EmberWriter(output);

            writer.WriteFrameBegin();

            writer.WriteSequenceBegin(new BerTag(DefaultClass, 1));

            for (uint index = 0; index <= 100; index++)
            {
                writer.Write(new BerTag(DefaultClass, index + 111122), index);
            }

            writer.WriteContainerEnd();

            writer.WriteContainerEnd();

            Console.WriteLine("\r\n------------------------ Reader, Writer");

            var asyncReader = new AsyncDomReader(null);

            asyncReader.ReadBytes(output.Memory);
            DumpXml(asyncReader.DetachRoot());

            //var input = new BerMemoryInput(output.Memory);
            //var reader = new EmberReader(input);

            //var xmlBuffer = new StringBuilder();
            //var xmlSettings = new XmlWriterSettings
            //{
            //   OmitXmlDeclaration = true,
            //};

            //using(var xmlWriter = XmlWriter.Create(xmlBuffer, xmlSettings))
            //   EmberToXml(reader, xmlWriter);
            //Console.WriteLine(xmlBuffer.ToString());
        }
 internal sealed override void WriteValue(EmberWriter writer, long?value) =>
 writer.WriteValue(GlowParameterContents.Value.OuterId, value.GetValueOrDefault());
 internal sealed override void WriteValue(EmberWriter writer, string value) =>
 writer.WriteValue(GlowParameterContents.Value.OuterId, value);
 internal sealed override void WriteValue(EmberWriter writer, TEnum?value) =>
 writer.WriteValue(GlowParameterContents.Value.OuterId, FastEnum.ToInt64(value.GetValueOrDefault()));
示例#25
0
 /// <summary>Writes the payload of a message that contains appropriate requests for all elements that require
 /// one.</summary>
 /// <returns><c>true</c> if a provider response is expected due to the request; otherwise <c>false</c>.
 /// </returns>
 /// <remarks>Recursively visits all children with a state equal to <see cref="Model.RetrievalState.None"/>, writes
 /// a getDirectory command for nodes that do not yet have children or a subscribe command for stream parameters
 /// and changes their state accordingly.</remarks>
 internal virtual bool WriteRequest(EmberWriter writer, IStreamedParameterCollection streamedParameters) =>
 false;
示例#26
0
 internal abstract void WriteChanges(EmberWriter writer, IInvocationCollection pendingInvocations);
示例#27
0
 internal abstract void WriteValue(EmberWriter writer, TValue value);
 internal void WriteValue(EmberWriter writer) => WriteValueCore(writer, GlowTuple.Value.OuterId, this.value);
 internal sealed override void WriteChanges(EmberWriter writer, IInvocationCollection pendingInvocations) =>
 this.HasChanges = false;