using System; using System.Collections.Generic; using System.Text; using Google.ProtocolBuffers.Descriptors; using Google.ProtocolBuffers.FieldAccess; namespace Google.ProtocolBuffers { /// /// All generated protocol message classes extend this class. It implements /// most of the IMessage and IBuilder interfaces using reflection. Users /// can ignore this class as an implementation detail. /// public abstract class GeneratedMessage : AbstractMessage, IMessage where TMessage : GeneratedMessage where TBuilder : IBuilder { private readonly UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance; protected abstract FieldAccessorTable InternalFieldAccessors { get; } public override MessageDescriptor DescriptorForType { get { return InternalFieldAccessors.Descriptor; } } public IMessage DefaultInstanceForType { get { throw new System.NotImplementedException(); } } public IBuilder CreateBuilderForType() { throw new System.NotImplementedException(); } private IDictionary GetMutableFieldMap() { var ret = new Dictionary(); MessageDescriptor descriptor = DescriptorForType; foreach (FieldDescriptor field in descriptor.Fields) { IFieldAccessor accessor = InternalFieldAccessors[field]; if ((field.IsRepeated && accessor.GetRepeatedCount(this) != 0) || accessor.Has(this)) { ret[field] = accessor[this]; } } return ret; } public override IDictionary AllFields { // FIXME: Make it immutable get { return GetMutableFieldMap(); } } public override bool HasField(FieldDescriptor field) { return InternalFieldAccessors[field].Has(this); } public override int GetRepeatedFieldCount(FieldDescriptor field) { return InternalFieldAccessors[field].GetRepeatedCount(this); } public override object this[FieldDescriptor field, int index] { get { return InternalFieldAccessors[field][this, index]; } } public override object this[FieldDescriptor field] { get { return InternalFieldAccessors[field][this]; } } public override UnknownFieldSet UnknownFields { get { return unknownFields; } } } }