#region Copyright notice and license // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://github.com/jskeet/dotnet-protobufs/ // Original C++/Java/Python code: // http://code.google.com/p/protobuf/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endregion using System.IO; namespace Google.ProtocolBuffers { /// /// Non-generic interface for all members whose signatures don't require knowledge of /// the type being built. The generic interface extends this one. Some methods return /// either an IBuilder or an IMessage; in these cases the generic interface redeclares /// the same method with a type-specific signature. Implementations are encouraged to /// use explicit interface implemenation for the non-generic form. This mirrors /// how IEnumerable and IEnumerable<T> work. /// public partial interface IBuilderLite { /// /// Returns true iff all required fields in the message and all /// embedded messages are set. /// bool IsInitialized { get; } IBuilderLite WeakClear(); IBuilderLite WeakMergeFrom(IMessageLite message); IBuilderLite WeakMergeFrom(ByteString data); IBuilderLite WeakMergeFrom(ByteString data, ExtensionRegistry registry); IBuilderLite WeakMergeFrom(ICodedInputStream input); IBuilderLite WeakMergeFrom(ICodedInputStream input, ExtensionRegistry registry); IMessageLite WeakBuild(); IMessageLite WeakBuildPartial(); IBuilderLite WeakClone(); IMessageLite WeakDefaultInstanceForType { get; } } /// /// Interface implemented by Protocol Message builders. /// TODO(jonskeet): Consider "SetXXX" methods returning the builder, as well as the properties. /// /// Type of message /// Type of builder public interface IBuilderLite : IBuilderLite where TMessage : IMessageLite where TBuilder : IBuilderLite { /// /// Resets all fields to their default values. /// TBuilder Clear(); /// /// Merge the specified other message which may be a different implementation of /// the same message descriptor. /// TBuilder MergeFrom(IMessageLite other); /// /// Constructs the final message. Once this is called, this Builder instance /// is no longer valid, and calling any other method may throw a /// NullReferenceException. If you need to continue working with the builder /// after calling Build, call Clone first. /// /// the message /// is missing one or more required fields; use BuildPartial to bypass /// this check TMessage Build(); /// /// Like Build(), but does not throw an exception if the message is missing /// required fields. Instead, a partial message is returned. /// TMessage BuildPartial(); /// /// Clones this builder. /// TODO(jonskeet): Explain depth of clone. /// TBuilder Clone(); /// /// Parses a message of this type from the input and merges it with this /// message, as if using MergeFrom(IMessage<T>). /// /// /// Warning: This does not verify that all required fields are present /// in the input message. If you call Build() without setting all /// required fields, it will throw an UninitializedMessageException. /// There are a few good ways to deal with this: /// /// Call IsInitialized to verify to verify that all required fields are /// set before building. /// Parse the message separately using one of the static ParseFrom /// methods, then use MergeFrom(IMessage<T>) to merge it with /// this one. ParseFrom will throw an InvalidProtocolBufferException /// (an IOException) if some required fields are missing. /// Use BuildPartial to build, which ignores missing required fields. /// /// TBuilder MergeFrom(ICodedInputStream input); /// /// Like MergeFrom(ICodedInputStream), but also parses extensions. /// The extensions that you want to be able to parse must be registered /// in . Extensions not in the registry /// will be treated as unknown fields. /// TBuilder MergeFrom(ICodedInputStream input, ExtensionRegistry extensionRegistry); /// /// Get's the message's type's default instance. /// /// TMessage DefaultInstanceForType { get; } /// /// Like MergeFrom(Stream), but does not read until the end of the file. /// Instead, the size of the message (encoded as a varint) is read first, /// then the message data. Use Message.WriteDelimitedTo(Stream) to /// write messages in this format. /// /// TBuilder MergeDelimitedFrom(Stream input); /// /// Like MergeDelimitedFrom(Stream) but supporting extensions. /// TBuilder MergeDelimitedFrom(Stream input, ExtensionRegistry extensionRegistry); #region Convenience methods /// /// Parse as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(ICodedInputStream). /// TBuilder MergeFrom(ByteString data); /// /// Parse as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(ICodedInputStream, ExtensionRegistry). /// TBuilder MergeFrom(ByteString data, ExtensionRegistry extensionRegistry); /// /// Parse as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(ICodedInputStream). /// TBuilder MergeFrom(byte[] data); /// /// Parse as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(ICodedInputStream, ExtensionRegistry). /// TBuilder MergeFrom(byte[] data, ExtensionRegistry extensionRegistry); /// /// Parse as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(ICodedInputStream). Note that this method always reads /// the entire input (unless it throws an exception). If you want it to /// stop earlier, you will need to wrap the input in a wrapper /// stream which limits reading. Or, use IMessage.WriteDelimitedTo(Stream) /// to write your message and MmergeDelimitedFrom(Stream) to read it. /// Despite usually reading the entire stream, this method never closes the stream. /// TBuilder MergeFrom(Stream input); /// /// Parse as a message of this type and merge /// it with the message being built. This is just a small wrapper around /// MergeFrom(ICodedInputStream, ExtensionRegistry). /// TBuilder MergeFrom(Stream input, ExtensionRegistry extensionRegistry); #endregion } }