GeneratedMessage.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc.
  3. // http://code.google.com/p/protobuf/
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. using System;
  17. using System.Collections.Generic;
  18. using Google.ProtocolBuffers.Collections;
  19. using Google.ProtocolBuffers.Descriptors;
  20. using Google.ProtocolBuffers.FieldAccess;
  21. namespace Google.ProtocolBuffers {
  22. /// <summary>
  23. /// All generated protocol message classes extend this class. It implements
  24. /// most of the IMessage interface using reflection. Users
  25. /// can ignore this class as an implementation detail.
  26. /// </summary>
  27. public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage<TMessage, TBuilder>
  28. where TMessage : GeneratedMessage<TMessage, TBuilder>
  29. where TBuilder : GeneratedBuilder<TMessage, TBuilder> {
  30. private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
  31. internal FieldAccessorTable FieldAccesseorsFromBuilder {
  32. get { return InternalFieldAccessors; }
  33. }
  34. protected abstract FieldAccessorTable InternalFieldAccessors { get; }
  35. public override MessageDescriptor DescriptorForType {
  36. get { return InternalFieldAccessors.Descriptor; }
  37. }
  38. internal IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
  39. // Use a SortedList so we'll end up serializing fields in order
  40. var ret = new SortedList<FieldDescriptor, object>();
  41. MessageDescriptor descriptor = DescriptorForType;
  42. foreach (FieldDescriptor field in descriptor.Fields) {
  43. IFieldAccessor accessor = InternalFieldAccessors[field];
  44. if (field.IsRepeated) {
  45. if (accessor.GetRepeatedCount(this) != 0) {
  46. ret[field] = accessor.GetValue(this);
  47. }
  48. } else if (HasField(field)) {
  49. ret[field] = accessor.GetValue(this);
  50. }
  51. }
  52. return ret;
  53. }
  54. public override IDictionary<FieldDescriptor, object> AllFields {
  55. get { return Dictionaries.AsReadOnly(GetMutableFieldMap()); }
  56. }
  57. public override bool HasField(FieldDescriptor field) {
  58. return InternalFieldAccessors[field].Has(this);
  59. }
  60. public override int GetRepeatedFieldCount(FieldDescriptor field) {
  61. return InternalFieldAccessors[field].GetRepeatedCount(this);
  62. }
  63. public override object this[FieldDescriptor field, int index] {
  64. get { return InternalFieldAccessors[field].GetRepeatedValue(this, index); }
  65. }
  66. public override object this[FieldDescriptor field] {
  67. get { return InternalFieldAccessors[field].GetValue(this); }
  68. }
  69. public override UnknownFieldSet UnknownFields {
  70. get { return unknownFields; }
  71. }
  72. /// <summary>
  73. /// Replaces the set of unknown fields for this message. This should
  74. /// only be used before a message is built, by the builder. (In the
  75. /// Java code it is private, but the builder is nested so has access
  76. /// to it.)
  77. /// </summary>
  78. internal void SetUnknownFields(UnknownFieldSet fieldSet) {
  79. unknownFields = fieldSet;
  80. }
  81. }
  82. }