using System; using System.Collections.Generic; using System.Text; using Google.ProtocolBuffers.Descriptors; namespace Google.ProtocolBuffers { public abstract class ExtendableBuilder : GeneratedBuilder where TMessage : ExtendableMessage where TBuilder : GeneratedBuilder { protected ExtendableBuilder() {} /// /// Checks if a singular extension is present /// public bool HasExtension(GeneratedExtensionBase extension) { return MessageBeingBuilt.HasExtension(extension); } /// /// Returns the number of elements in a repeated extension. /// public int GetExtensionCount(GeneratedExtensionBase> extension) { return MessageBeingBuilt.GetExtensionCount(extension); } /// /// Returns the value of an extension. /// public TExtension GetExtension(GeneratedExtensionBase extension) { return MessageBeingBuilt.GetExtension(extension); } /// /// Returns one element of a repeated extension. /// public TExtension GetExtension(GeneratedExtensionBase> extension, int index) { return MessageBeingBuilt.GetExtension(extension, index); } /// /// Sets the value of an extension. /// public ExtendableBuilder SetExtension(GeneratedExtensionBase extension, TExtension value) { ExtendableMessage message = MessageBeingBuilt; message.VerifyExtensionContainingType(extension); message.Extensions[extension.Descriptor] = extension.ToReflectionType(value); return this; } /// /// Sets the value of one element of a repeated extension. /// public ExtendableBuilder SetExtension( GeneratedExtensionBase> extension, int index, TExtension value) { ExtendableMessage message = MessageBeingBuilt; message.VerifyExtensionContainingType(extension); message.Extensions[extension.Descriptor, index] = extension.SingularToReflectionType(value); return this; } /// /// Appends a value to a repeated extension. /// public ExtendableBuilder AddExtension( GeneratedExtensionBase> extension, TExtension value) { ExtendableMessage message = MessageBeingBuilt; message.VerifyExtensionContainingType(extension); message.Extensions.AddRepeatedField(extension.Descriptor, extension.SingularToReflectionType(value)); return this; } /// /// Clears an extension. /// public ExtendableBuilder ClearExtension( GeneratedExtensionBase extension) { ExtendableMessage message = MessageBeingBuilt; message.VerifyExtensionContainingType(extension); message.Extensions.ClearField(extension.Descriptor); return this; } /// /// Called by subclasses to parse an unknown field or an extension. /// /// true unless the tag is an end-group tag protected override bool ParseUnknownField(CodedInputStream input, UnknownFieldSet.Builder unknownFields, ExtensionRegistry extensionRegistry, uint tag) { return FieldSet.MergeFieldFrom(input, unknownFields, extensionRegistry, this, tag); } // --------------------------------------------------------------- // Reflection public override object this[FieldDescriptor field, int index] { set { if (field.IsExtension) { ExtendableMessage message = MessageBeingBuilt; // TODO(jonskeet): Figure out how to call this! // message.VerifyExtensionContainingType(field); message.Extensions[field, index] = value; } else { base[field, index] = value; } } } public override object this[FieldDescriptor field] { set { if (field.IsExtension) { ExtendableMessage message = MessageBeingBuilt; // TODO(jonskeet): Figure out how to call this! // message.VerifyExtensionContainingType(field); message.Extensions[field] = value; } else { base[field] = value; } } } public override IBuilder ClearField(FieldDescriptor field) { if (field.IsExtension) { ExtendableMessage message = MessageBeingBuilt; message.VerifyContainingType(field); message.Extensions.ClearField(field); return this; } else { return base.ClearField(field); } } public override IBuilder AddRepeatedField(FieldDescriptor field, object value) { if (field.IsExtension) { ExtendableMessage message = MessageBeingBuilt; message.VerifyContainingType(field); message.Extensions.AddRepeatedField(field, value); return this; } else { return base.AddRepeatedField(field, value); } } } }