/// <inheritdoc/> public FudgeStreamElement MoveNext() { if (currentState == null) { if (!HasNext) // Will fetch the next if required { element = FudgeStreamElement.NoElement; } else { currentState = new State(nextMessage); nextMessage = null; element = FudgeStreamElement.MessageStart; } } else if (currentState.Fields.Count == 0) { if (stack.Count == 0) { // Finished the message currentState = null; element = FudgeStreamElement.MessageEnd; } else { currentState = stack.Pop(); element = FudgeStreamElement.SubmessageFieldEnd; } } else { field = currentState.Fields.Dequeue(); if (field.Type == FudgeMsgFieldType.Instance) { stack.Push(currentState); currentState = new State((FudgeMsg)field.Value); element = FudgeStreamElement.SubmessageFieldStart; } else { element = FudgeStreamElement.SimpleField; } } return(element); }
/// <summary> /// Parses data from a given <see cref="BinaryReader"/>. /// </summary> /// <param name="binaryReader"></param> /// <returns></returns> public FudgeMsgEnvelope Parse(BinaryReader binaryReader) { FudgeEncodedStreamReader reader = new FudgeEncodedStreamReader(FudgeContext); reader.Reset(binaryReader); FudgeStreamElement element = reader.MoveNext(); if (element == FudgeStreamElement.NoElement) { return(null); } if (element != FudgeStreamElement.MessageStart) { throw new ArgumentException("First element in encoding stream wasn't a message element."); } int version = reader.SchemaVersion; FudgeMsg msg = FudgeContext.NewMessage(); FudgeMsgEnvelope envelope = new FudgeMsgEnvelope(msg, version); ProcessFields(reader, msg); return(envelope); }
/** * @param reader * @param msg */ protected void ProcessFields(IFudgeStreamReader reader, FudgeMsg msg) { while (reader.HasNext) { FudgeStreamElement element = reader.MoveNext(); switch (element) { case FudgeStreamElement.SimpleField: msg.Add(reader.FieldName, reader.FieldOrdinal, reader.FieldType, reader.FieldValue); break; case FudgeStreamElement.SubmessageFieldStart: FudgeMsg subMsg = FudgeContext.NewMessage(); msg.Add(reader.FieldName, reader.FieldOrdinal, subMsg); ProcessFields(reader, subMsg); break; case FudgeStreamElement.SubmessageFieldEnd: case FudgeStreamElement.MessageEnd: return; } } }
/// <inheritdoc/> public FudgeStreamElement MoveNext() { if (currentState == null) { if (!HasNext) // Will fetch the next if required { element = FudgeStreamElement.NoElement; } else { currentState = new State(nextMessage); nextMessage = null; element = FudgeStreamElement.MessageStart; } } else if (currentState.Fields.Count == 0) { if (stack.Count == 0) { // Finished the message currentState = null; element = FudgeStreamElement.MessageEnd; } else { currentState = stack.Pop(); element = FudgeStreamElement.SubmessageFieldEnd; } } else { field = currentState.Fields.Dequeue(); if (field.Type == FudgeMsgFieldType.Instance) { stack.Push(currentState); currentState = new State((IFudgeFieldContainer)field.Value); element = FudgeStreamElement.SubmessageFieldStart; } else { element = FudgeStreamElement.SimpleField; } } return element; }