/src/ProtocolBuffers/AbstractBuilderLite.cs

https://code.google.com/p/protobuf-csharp-port/ · C# · 264 lines · 176 code · 49 blank · 39 comment · 1 complexity · bd63ac262edf6b293538324671424a76 MD5 · raw file

  1. #region Copyright notice and license
  2. // Protocol Buffers - Google's data interchange format
  3. // Copyright 2008 Google Inc. All rights reserved.
  4. // http://github.com/jskeet/dotnet-protobufs/
  5. // Original C++/Java/Python code:
  6. // http://code.google.com/p/protobuf/
  7. //
  8. // Redistribution and use in source and binary forms, with or without
  9. // modification, are permitted provided that the following conditions are
  10. // met:
  11. //
  12. // * Redistributions of source code must retain the above copyright
  13. // notice, this list of conditions and the following disclaimer.
  14. // * Redistributions in binary form must reproduce the above
  15. // copyright notice, this list of conditions and the following disclaimer
  16. // in the documentation and/or other materials provided with the
  17. // distribution.
  18. // * Neither the name of Google Inc. nor the names of its
  19. // contributors may be used to endorse or promote products derived from
  20. // this software without specific prior written permission.
  21. //
  22. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  25. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  26. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  27. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  28. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  29. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  30. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  31. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  32. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. #endregion
  34. using System;
  35. using System.IO;
  36. namespace Google.ProtocolBuffers
  37. {
  38. /// <summary>
  39. /// Implementation of the non-generic IMessage interface as far as possible.
  40. /// </summary>
  41. public abstract partial class AbstractBuilderLite<TMessage, TBuilder> : IBuilderLite<TMessage, TBuilder>
  42. where TMessage : AbstractMessageLite<TMessage, TBuilder>
  43. where TBuilder : AbstractBuilderLite<TMessage, TBuilder>
  44. {
  45. protected abstract TBuilder ThisBuilder { get; }
  46. public abstract bool IsInitialized { get; }
  47. public abstract TBuilder Clear();
  48. public abstract TBuilder Clone();
  49. public abstract TMessage Build();
  50. public abstract TMessage BuildPartial();
  51. public abstract TBuilder MergeFrom(IMessageLite other);
  52. public abstract TBuilder MergeFrom(ICodedInputStream input, ExtensionRegistry extensionRegistry);
  53. public abstract TMessage DefaultInstanceForType { get; }
  54. #region IBuilderLite<TMessage,TBuilder> Members
  55. public virtual TBuilder MergeFrom(ICodedInputStream input)
  56. {
  57. return MergeFrom(input, ExtensionRegistry.CreateInstance());
  58. }
  59. public TBuilder MergeDelimitedFrom(Stream input)
  60. {
  61. return MergeDelimitedFrom(input, ExtensionRegistry.CreateInstance());
  62. }
  63. public TBuilder MergeDelimitedFrom(Stream input, ExtensionRegistry extensionRegistry)
  64. {
  65. int size = (int) CodedInputStream.ReadRawVarint32(input);
  66. Stream limitedStream = new LimitedInputStream(input, size);
  67. return MergeFrom(limitedStream, extensionRegistry);
  68. }
  69. public TBuilder MergeFrom(ByteString data)
  70. {
  71. return MergeFrom(data, ExtensionRegistry.CreateInstance());
  72. }
  73. public TBuilder MergeFrom(ByteString data, ExtensionRegistry extensionRegistry)
  74. {
  75. CodedInputStream input = data.CreateCodedInput();
  76. MergeFrom(input, extensionRegistry);
  77. input.CheckLastTagWas(0);
  78. return ThisBuilder;
  79. }
  80. public TBuilder MergeFrom(byte[] data)
  81. {
  82. CodedInputStream input = CodedInputStream.CreateInstance(data);
  83. MergeFrom(input);
  84. input.CheckLastTagWas(0);
  85. return ThisBuilder;
  86. }
  87. public TBuilder MergeFrom(byte[] data, ExtensionRegistry extensionRegistry)
  88. {
  89. CodedInputStream input = CodedInputStream.CreateInstance(data);
  90. MergeFrom(input, extensionRegistry);
  91. input.CheckLastTagWas(0);
  92. return ThisBuilder;
  93. }
  94. public TBuilder MergeFrom(Stream input)
  95. {
  96. CodedInputStream codedInput = CodedInputStream.CreateInstance(input);
  97. MergeFrom(codedInput);
  98. codedInput.CheckLastTagWas(0);
  99. return ThisBuilder;
  100. }
  101. public TBuilder MergeFrom(Stream input, ExtensionRegistry extensionRegistry)
  102. {
  103. CodedInputStream codedInput = CodedInputStream.CreateInstance(input);
  104. MergeFrom(codedInput, extensionRegistry);
  105. codedInput.CheckLastTagWas(0);
  106. return ThisBuilder;
  107. }
  108. #endregion
  109. #region Explicit definitions
  110. IBuilderLite IBuilderLite.WeakClear()
  111. {
  112. return Clear();
  113. }
  114. IBuilderLite IBuilderLite.WeakMergeFrom(IMessageLite message)
  115. {
  116. return MergeFrom(message);
  117. }
  118. IBuilderLite IBuilderLite.WeakMergeFrom(ByteString data)
  119. {
  120. return MergeFrom(data);
  121. }
  122. IBuilderLite IBuilderLite.WeakMergeFrom(ByteString data, ExtensionRegistry registry)
  123. {
  124. return MergeFrom(data, registry);
  125. }
  126. IBuilderLite IBuilderLite.WeakMergeFrom(ICodedInputStream input)
  127. {
  128. return MergeFrom(input);
  129. }
  130. IBuilderLite IBuilderLite.WeakMergeFrom(ICodedInputStream input, ExtensionRegistry registry)
  131. {
  132. return MergeFrom(input, registry);
  133. }
  134. IMessageLite IBuilderLite.WeakBuild()
  135. {
  136. return Build();
  137. }
  138. IMessageLite IBuilderLite.WeakBuildPartial()
  139. {
  140. return BuildPartial();
  141. }
  142. IBuilderLite IBuilderLite.WeakClone()
  143. {
  144. return Clone();
  145. }
  146. IMessageLite IBuilderLite.WeakDefaultInstanceForType
  147. {
  148. get { return DefaultInstanceForType; }
  149. }
  150. #endregion
  151. #region LimitedInputStream
  152. /// <summary>
  153. /// Stream implementation which proxies another stream, only allowing a certain amount
  154. /// of data to be read. Note that this is only used to read delimited streams, so it
  155. /// doesn't attempt to implement everything.
  156. /// </summary>
  157. private class LimitedInputStream : Stream
  158. {
  159. private readonly Stream proxied;
  160. private int bytesLeft;
  161. internal LimitedInputStream(Stream proxied, int size)
  162. {
  163. this.proxied = proxied;
  164. bytesLeft = size;
  165. }
  166. public override bool CanRead
  167. {
  168. get { return true; }
  169. }
  170. public override bool CanSeek
  171. {
  172. get { return false; }
  173. }
  174. public override bool CanWrite
  175. {
  176. get { return false; }
  177. }
  178. public override void Flush()
  179. {
  180. }
  181. public override long Length
  182. {
  183. get { throw new NotSupportedException(); }
  184. }
  185. public override long Position
  186. {
  187. get { throw new NotSupportedException(); }
  188. set { throw new NotSupportedException(); }
  189. }
  190. public override int Read(byte[] buffer, int offset, int count)
  191. {
  192. if (bytesLeft > 0)
  193. {
  194. int bytesRead = proxied.Read(buffer, offset, Math.Min(bytesLeft, count));
  195. bytesLeft -= bytesRead;
  196. return bytesRead;
  197. }
  198. return 0;
  199. }
  200. public override long Seek(long offset, SeekOrigin origin)
  201. {
  202. throw new NotSupportedException();
  203. }
  204. public override void SetLength(long value)
  205. {
  206. throw new NotSupportedException();
  207. }
  208. public override void Write(byte[] buffer, int offset, int count)
  209. {
  210. throw new NotSupportedException();
  211. }
  212. }
  213. #endregion
  214. }
  215. }