AbstractBuilder.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Google.ProtocolBuffers.Descriptors;
  5. using System.Collections;
  6. using System.IO;
  7. namespace Google.ProtocolBuffers {
  8. /// <summary>
  9. /// Implementation of the non-generic IMessage interface as far as possible.
  10. /// </summary>
  11. public abstract class AbstractBuilder : IBuilder {
  12. public bool Initialized {
  13. get { throw new NotImplementedException(); }
  14. }
  15. public IDictionary<FieldDescriptor, object> AllFields {
  16. get { throw new NotImplementedException(); }
  17. }
  18. public object this[FieldDescriptor field] {
  19. get {
  20. throw new NotImplementedException();
  21. }
  22. set {
  23. throw new NotImplementedException();
  24. }
  25. }
  26. public MessageDescriptor DescriptorForType {
  27. get { throw new NotImplementedException(); }
  28. }
  29. public int GetRepeatedFieldCount(FieldDescriptor field) {
  30. throw new NotImplementedException();
  31. }
  32. public object this[FieldDescriptor field, int index] {
  33. get {
  34. throw new NotImplementedException();
  35. }
  36. set {
  37. throw new NotImplementedException();
  38. }
  39. }
  40. public bool HasField(FieldDescriptor field) {
  41. throw new NotImplementedException();
  42. }
  43. public IBuilder Clear() {
  44. foreach(FieldDescriptor field in AllFields.Keys) {
  45. ClearField(field);
  46. }
  47. return this;
  48. }
  49. public IBuilder MergeFrom(IMessage other) {
  50. if (other.DescriptorForType != DescriptorForType) {
  51. throw new ArgumentException("MergeFrom(Message) can only merge messages of the same type.");
  52. }
  53. // Note: We don't attempt to verify that other's fields have valid
  54. // types. Doing so would be a losing battle. We'd have to verify
  55. // all sub-messages as well, and we'd have to make copies of all of
  56. // them to insure that they don't change after verification (since
  57. // the Message interface itself cannot enforce immutability of
  58. // implementations).
  59. // TODO(jonskeet): Provide a function somewhere called makeDeepCopy()
  60. // which allows people to make secure deep copies of messages.
  61. foreach (KeyValuePair<FieldDescriptor, object> entry in AllFields) {
  62. FieldDescriptor field = entry.Key;
  63. if (field.IsRepeated) {
  64. // Concatenate repeated fields
  65. foreach (object element in (IEnumerable) entry.Value) {
  66. AddRepeatedField(field, element);
  67. }
  68. } else if (field.MappedType == MappedType.Message) {
  69. // Merge singular messages
  70. IMessage existingValue = (IMessage) this[field];
  71. if (existingValue == existingValue.DefaultInstanceForType) {
  72. this[field] = entry.Value;
  73. } else {
  74. this[field] = existingValue.CreateBuilderForType()
  75. .MergeFrom(existingValue)
  76. .MergeFrom((IMessage) entry.Value)
  77. .Build();
  78. }
  79. } else {
  80. // Overwrite simple values
  81. this[field] = entry.Value;
  82. }
  83. }
  84. return this;
  85. }
  86. public IMessage Build() {
  87. throw new NotImplementedException();
  88. }
  89. public IMessage BuildPartial() {
  90. throw new NotImplementedException();
  91. }
  92. public IBuilder Clone() {
  93. throw new NotImplementedException();
  94. }
  95. public IBuilder MergeFrom(CodedInputStream input) {
  96. return MergeFrom(input, ExtensionRegistry.Empty);
  97. }
  98. public IBuilder MergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) {
  99. UnknownFieldSet.Builder unknownFields = UnknownFieldSet.CreateBuilder(UnknownFields);
  100. FieldSet.MergeFrom(input, unknownFields, extensionRegistry, this);
  101. UnknownFields = unknownFields.Build();
  102. return this;
  103. }
  104. public IMessage DefaultInstanceForType {
  105. get { throw new NotImplementedException(); }
  106. }
  107. public IBuilder NewBuilderForField<TField>(FieldDescriptor field) {
  108. throw new NotImplementedException();
  109. }
  110. public IBuilder ClearField(FieldDescriptor field) {
  111. throw new NotImplementedException();
  112. }
  113. public IBuilder AddRepeatedField(FieldDescriptor field, object value) {
  114. throw new NotImplementedException();
  115. }
  116. public IBuilder MergeUnknownFields(UnknownFieldSet unknownFields) {
  117. UnknownFields = UnknownFieldSet.CreateBuilder(UnknownFields)
  118. .MergeFrom(unknownFields)
  119. .Build();
  120. return this;
  121. }
  122. public UnknownFieldSet UnknownFields {
  123. get {
  124. throw new NotImplementedException();
  125. }
  126. set {
  127. throw new NotImplementedException();
  128. }
  129. }
  130. public IBuilder MergeFrom(ByteString data) {
  131. CodedInputStream input = data.CreateCodedInput();
  132. MergeFrom(input);
  133. input.CheckLastTagWas(0);
  134. return this;
  135. }
  136. public IBuilder MergeFrom(ByteString data, ExtensionRegistry extensionRegistry) {
  137. CodedInputStream input = data.CreateCodedInput();
  138. MergeFrom(input, extensionRegistry);
  139. input.CheckLastTagWas(0);
  140. return this;
  141. }
  142. public IBuilder MergeFrom(byte[] data) {
  143. CodedInputStream input = CodedInputStream.CreateInstance(data);
  144. MergeFrom(input);
  145. input.CheckLastTagWas(0);
  146. return this;
  147. }
  148. public IBuilder MergeFrom(byte[] data, ExtensionRegistry extensionRegistry) {
  149. CodedInputStream input = CodedInputStream.CreateInstance(data);
  150. MergeFrom(input, extensionRegistry);
  151. input.CheckLastTagWas(0);
  152. return this;
  153. }
  154. public IBuilder MergeFrom(Stream input) {
  155. CodedInputStream codedInput = CodedInputStream.CreateInstance(input);
  156. MergeFrom(codedInput);
  157. codedInput.CheckLastTagWas(0);
  158. return this;
  159. }
  160. public IBuilder MergeFrom(Stream input, ExtensionRegistry extensionRegistry) {
  161. CodedInputStream codedInput = CodedInputStream.CreateInstance(input);
  162. MergeFrom(codedInput, extensionRegistry);
  163. codedInput.CheckLastTagWas(0);
  164. return this;
  165. }
  166. }
  167. }