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); }
public bool TryGetFieldReader(MessageTag tag) { if (FindReader(tag.Value)) { return(true); } return(tag.WireType == WireType.StartGroup && FindReader(tag.WithWireType(WireType.String))); }
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()); }
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())); }
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); }
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)); }