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; } }
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); } }
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)); }
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); }
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)); } }
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; } } } }
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); } } }
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"))); }
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"))); }
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(); } }
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()));
/// <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;
internal abstract void WriteChanges(EmberWriter writer, IInvocationCollection pendingInvocations);
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;