Пример #1
0
 /// <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);
 }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /**
         * @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;
                }
            }
        }
Пример #4
0
 /// <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;
 }