protected override void AppendMessageHeaderCore(
            ILGenerator generator, ForEachLoop loop, MessageField field)
        {
            LocalBuilder length = generator.DeclareLocal(typeof(int));

            loop.Create(body => {
                body.Emit(OpCodes.Ldarg_1);
                loop.LoadCurrentAs(FieldType);
                field.AppendFieldLength(generator);
                body.Emit(OpCodes.Ldloc, length.LocalIndex);
                body.Emit(OpCodes.Add);
                body.Emit(OpCodes.Stloc, length.LocalIndex);
            });

            generator.Emit(OpCodes.Ldloc, length.LocalIndex);
            Label done = generator.DefineLabel();

            generator.Emit(OpCodes.Brfalse, done);

            generator.Emit(OpCodes.Ldarg_1);
            generator.Emit(OpCodes.Ldc_I4, MessageTag.AsInt(field.Number, WireType.String));
            generator.Call <MessageWriter>("WriteVarint", typeof(uint));
            generator.Emit(OpCodes.Ldloc, length.LocalIndex);
            generator.Call <MessageWriter>("WriteVarint", typeof(uint)).Pop();
            generator.MarkLabel(done);
        }
Example #2
0
        public bool TryGetFieldReader(MessageTag tag)
        {
            if (FindReader(tag.Value))
            {
                return(true);
            }

            return(tag.WireType == WireType.StartGroup &&
                   FindReader(tag.WithWireType(WireType.String)));
        }
Example #3
0
        public bool TryReadMessageTag(ref MessageTag target)
        {
            if (_bytes.EndOfStream)
            {
                return(false);
            }

            target = ReadMessageTag();
            return(true);
        }
		public static UnknownField Create(MessageTag tag, MessageReader reader)
		{
			switch (tag.WireType)
			{
				case WireType.Fixed64:
					return new UnknownFieldFixed64(tag, reader);
				case WireType.String:
					return new UnknownFieldString(tag, reader);
				case WireType.StartGroup:
					return new UnknownFieldGroup(tag, reader);
				case WireType.Fixed32:
					return new UnknownFieldFixed32(tag, reader);
			}
			return new UnknownFieldVarint(tag, reader.ReadInt64());
		}
Example #5
0
        public static UnknownField Create(MessageTag tag, MessageReader reader)
        {
            switch (tag.WireType)
            {
            case WireType.Fixed64:
                return(new UnknownFieldFixed64(tag, reader));

            case WireType.String:
                return(new UnknownFieldString(tag, reader));

            case WireType.StartGroup:
                return(new UnknownFieldGroup(tag, reader));

            case WireType.Fixed32:
                return(new UnknownFieldFixed32(tag, reader));
            }
            return(new UnknownFieldVarint(tag, reader.ReadInt64()));
        }
Example #6
0
        public T Deserialize(MessageReader reader, T target,
                             UnknownFieldCollection missing)
        {
            MessageTag tag = new MessageTag();

            while (reader.TryReadMessageTag(ref tag))
            {
                if (TryGetFieldReader(tag))
                {
                    if (tag.WireType == WireType.String)
                    {
                        _current.Value(target, reader.CreateSubReader());
                    }

                    else
                    {
                        try
                        {
                            _current.Value(target, reader);
                        }
                        catch (UnknownEnumException e)
                        {
                            missing.Add(new UnknownFieldVarint(tag, e.Value));
                        }
                    }
                }
                else if (tag.WireType == WireType.EndGroup)
                {
                    break;
                }

                else if (tag.WireType < WireType.MaxValid)
                {
                    missing.Add(tag, reader);
                }

                else
                {
                    throw new NotSupportedException();
                }
            }
            return(target);
        }
Example #7
0
 protected UnknownField(MessageTag tag, object value)
 {
     _tag   = tag;
     _value = value;
 }
		protected UnknownField(MessageTag tag, object value)
		{
			_tag = tag;
			_value = value;
		}
 public void Add(MessageTag tag, MessageReader reader)
 {
     Add(UnknownField.Create(tag, reader));
 }