// Copyright 2008 Cyrus Najmabadi // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. @protocol PBMessage; @protocol PBMessage_Builder; @class PBUnknownFieldSet; @class PBCodedInputStream; @class PBExtensionRegistry; /** * Abstract interface implemented by Protocol Message builders. */ @protocol PBMessage_Builder /** Resets all fields to their default values. */ - (id) clear; /** * Construct the final message. Once this is called, the Builder is no * longer valid, and calling any other method may throw a * NullPointerException. If you need to continue working with the builder * after calling {@code build()}, {@code clone()} it first. * @throws UninitializedMessageException The message is missing one or more * required fields (i.e. {@link #isInitialized()} returns false). * Use {@link #buildPartial()} to bypass this check. */ - (id) build; /** * Like {@link #build()}, but does not throw an exception if the message * is missing required fields. Instead, a partial message is returned. */ - (id) buildPartial; - (id) clone; /** * Returns true if all required fields in the message and all embedded * messages are set, false otherwise. */ - (BOOL) isInitialized; /** * Get the message's type's default instance. * See {@link Message#getDefaultInstanceForType()}. */ - (id) defaultInstance; - (PBUnknownFieldSet*) unknownFields; - (id) setUnknownFields:(PBUnknownFieldSet*) unknownFields; /** * Merge some unknown fields into the {@link UnknownFieldSet} for this * message. */ - (id) mergeUnknownFields:(PBUnknownFieldSet*) unknownFields; /** * Parses a message of this type from the input and merges it with this * message, as if using {@link Builder#mergeFrom(Message)}. * *

Warning: This does not verify that all required fields are present in * the input message. If you call {@link #build()} without setting all * required fields, it will throw an {@link UninitializedMessageException}, * which is a {@code RuntimeException} and thus might not be caught. There * are a few good ways to deal with this: *

    *
  • Call {@link #isInitialized()} to verify that all required fields * are set before building. *
  • Parse the message separately using one of the static * {@code parseFrom} methods, then use {@link #mergeFrom(Message)} * to merge it with this one. {@code parseFrom} will throw an * {@link InvalidProtocolBufferException} (an {@code IOException}) * if some required fields are missing. *
  • Use {@code buildPartial()} to build, which ignores missing * required fields. *
* *

Note: The caller should call * {@link CodedInputStream#checkLastTagWas(int)} after calling this to * verify that the last tag seen was the appropriate end-group tag, * or zero for EOF. */ - (id) mergeFromCodedInputStream:(PBCodedInputStream*) input; /** * Like {@link Builder#mergeFrom(CodedInputStream)}, but also * parses extensions. The extensions that you want to be able to parse * must be registered in {@code extensionRegistry}. Extensions not in * the registry will be treated as unknown fields. */ - (id) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; /** * Parse {@code data} as a message of this type and merge it with the * message being built. This is just a small wrapper around * {@link #mergeFrom(CodedInputStream)}. */ - (id) mergeFromData:(NSData*) data; /** * Parse {@code data} as a message of this type and merge it with the * message being built. This is just a small wrapper around * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}. */ - (id) mergeFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry; /** * Parse a message of this type from {@code input} and merge it with the * message being built. This is just a small wrapper around * {@link #mergeFrom(CodedInputStream)}. 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 your input in some * wrapper stream that limits reading. Despite usually reading the entire * input, this does not close the stream. */ - (id) mergeFromInputStream:(NSInputStream*) input; /** * Parse a message of this type from {@code input} and merge it with the * message being built. This is just a small wrapper around * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}. */ - (id) mergeFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry; @end