using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using Google.ProtocolBuffers.Collections;
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 interface using reflection. Users
/// can ignore this class as an implementation detail.
///
public abstract class GeneratedMessage : AbstractMessage, IMessage
where TMessage : GeneratedMessage
where TBuilder : IBuilder {
private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
internal FieldAccessorTable FieldAccesseorsFromBuilder {
get { return InternalFieldAccessors; }
}
protected abstract FieldAccessorTable InternalFieldAccessors { get; }
public override MessageDescriptor DescriptorForType {
get { return InternalFieldAccessors.Descriptor; }
}
protected override IMessage DefaultInstanceForTypeImpl {
get { return DefaultInstanceForType; }
}
protected override IBuilder CreateBuilderForTypeImpl() {
return CreateBuilderForType();
}
public abstract TMessage DefaultInstanceForType { get; }
public abstract IBuilder CreateBuilderForType();
internal IDictionary GetMutableFieldMap() {
// Use a SortedList so we'll end up serializing fields in order
var ret = new SortedList();
MessageDescriptor descriptor = DescriptorForType;
foreach (FieldDescriptor field in descriptor.Fields) {
IFieldAccessor accessor = InternalFieldAccessors[field];
if (field.IsRepeated) {
if (accessor.GetRepeatedCount(this) != 0) {
ret[field] = accessor.GetValue(this);
}
} else if (HasField(field)) {
ret[field] = accessor.GetValue(this);
}
}
return ret;
}
public override IDictionary AllFields {
get { return Dictionaries.AsReadOnly(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].GetRepeatedValue(this, index); }
}
public override object this[FieldDescriptor field] {
get { return InternalFieldAccessors[field].GetValue(this); }
}
public override UnknownFieldSet UnknownFields {
get { return unknownFields; }
}
///
/// Replaces the set of unknown fields for this message. This should
/// only be used before a message is built, by the builder. (In the
/// Java code it is private, but the builder is nested so has access
/// to it.)
///
internal void SetUnknownFields(UnknownFieldSet fieldSet) {
unknownFields = fieldSet;
}
}
}