1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defines Message, the abstract interface implemented by non-lite 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// protocol message objects. Although it's possible to implement this 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// interface manually, most users will use the protocol compiler to 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// generate implementations. 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Example usage: 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Say you have a message defined as: 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// message Foo { 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// optional string text = 1; 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// repeated int32 numbers = 2; 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// } 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Then, if you used the protocol compiler to generate a class from the above 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// definition, you could use it like so: 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// string data; // Will store a serialized version of the message. 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // Create a message and serialize it. 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Foo foo; 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// foo.set_text("Hello World!"); 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// foo.add_numbers(1); 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// foo.add_numbers(5); 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// foo.add_numbers(42); 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// foo.SerializeToString(&data); 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// } 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// { 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // Parse the serialized message and check that it contains the 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // correct data. 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Foo foo; 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// foo.ParseFromString(data); 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(foo.text() == "Hello World!"); 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(foo.numbers_size() == 3); 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(foo.numbers(0) == 1); 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(foo.numbers(1) == 5); 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(foo.numbers(2) == 42); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// } 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// { 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // Same as the last block, but do it dynamically via the Message 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // reflection interface. 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Message* foo = new Foo; 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Descriptor* descriptor = foo->GetDescriptor(); 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // Get the descriptors for the fields we're interested in and verify 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // their types. 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// FieldDescriptor* text_field = descriptor->FindFieldByName("text"); 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(text_field != NULL); 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(text_field->type() == FieldDescriptor::TYPE_STRING); 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(text_field->label() == FieldDescriptor::TYPE_OPTIONAL); 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// FieldDescriptor* numbers_field = descriptor->FindFieldByName("numbers"); 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(numbers_field != NULL); 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(numbers_field->type() == FieldDescriptor::TYPE_INT32); 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(numbers_field->label() == FieldDescriptor::TYPE_REPEATED); 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // Parse the message. 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// foo->ParseFromString(data); 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // Use the reflection interface to examine the contents. 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// const Reflection* reflection = foo->GetReflection(); 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(reflection->GetString(foo, text_field) == "Hello World!"); 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(reflection->FieldSize(foo, numbers_field) == 3); 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(reflection->GetRepeatedInt32(foo, numbers_field, 0) == 1); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(reflection->GetRepeatedInt32(foo, numbers_field, 1) == 5); 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// assert(reflection->GetRepeatedInt32(foo, numbers_field, 2) == 42); 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// delete foo; 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// } 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_MESSAGE_H__ 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_MESSAGE_H__ 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector> 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string> 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef __DECCXX 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// HP C++'s iosfwd doesn't work. 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <iostream> 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <iosfwd> 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message_lite.h> 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if defined(_WIN32) && defined(GetMessage) 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// windows.h defines GetMessage() as a macro. Let's re-define it as an inline 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// function. This is necessary because Reflection has a method called 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// GetMessage() which we don't want overridden. The inline function should be 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// equivalent for C++ users. 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline BOOL GetMessage_Win32( 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LPMSG lpMsg, HWND hWnd, 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UINT wMsgFilterMin, UINT wMsgFilterMax) { 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef GetMessage 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline BOOL GetMessage( 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LPMSG lpMsg, HWND hWnd, 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UINT wMsgFilterMin, UINT wMsgFilterMax) { 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetMessage_Win32(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in this file. 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Message; 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Reflection; 151d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass MessageFactory; 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in other files. 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Descriptor; // descriptor.h 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldDescriptor; // descriptor.h 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumDescriptor; // descriptor.h 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueDescriptor; // descriptor.h 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace io { 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class ZeroCopyInputStream; // zero_copy_stream.h 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class ZeroCopyOutputStream; // zero_copy_stream.h 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class CodedInputStream; // coded_stream.h 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class CodedOutputStream; // coded_stream.h 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UnknownFieldSet; // unknown_field_set.h 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A container to hold message metadata. 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct Metadata { 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* descriptor; 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection; 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Returns the EnumDescriptor for enum type E, which must be a 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// proto-declared enum type. Code generated by the protocol compiler 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// will include specializations of this template for each enum type declared. 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename E> 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst EnumDescriptor* GetEnumDescriptor(); 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Abstract interface for protocol messages. 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// See also MessageLite, which contains most every-day operations. Message 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// adds descriptors and reflection on top of that. 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The methods of this class that are virtual but not pure-virtual have 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// default implementations based on reflection. Message classes which are 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// optimized for speed will want to override these with faster implementations, 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but classes optimized for code size may be happy with keeping them. See 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the optimize_for option in descriptor.proto. 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT Message : public MessageLite { 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline Message() {} 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual ~Message(); 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Basic Operations ------------------------------------------------ 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Construct a new instance of the same type. Ownership is passed to the 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // caller. (This is also defined in MessageLite, but is defined again here 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for return-type covariance.) 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual Message* New() const = 0; 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Make this message into a copy of the given message. The given message 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // must have the same descriptor, but need not necessarily be the same class. 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // By default this is just implemented as "Clear(); MergeFrom(from);". 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void CopyFrom(const Message& from); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Merge the fields from the given message into this message. Singular 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fields will be overwritten, except for embedded messages which will 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // be merged. Repeated fields will be concatenated. The given message 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // must be of the same type as this message (i.e. the exact same class). 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void MergeFrom(const Message& from); 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Verifies that IsInitialized() returns true. GOOGLE_CHECK-fails otherwise, with 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a nice error message. 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void CheckInitialized() const; 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Slowly build a list of all required fields that are not set. 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This is much, much slower than IsInitialized() as it is implemented 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // purely via reflection. Generally, you should not call this unless you 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // have already determined that an error exists by calling IsInitialized(). 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void FindInitializationErrors(vector<string>* errors) const; 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like FindInitializationErrors, but joins all the strings, delimited by 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // commas, and returns them. 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string InitializationErrorString() const; 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Clears all unknown fields from this message and all embedded messages. 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Normally, if unknown tag numbers are encountered when parsing a message, 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the tag and value are stored in the message's UnknownFieldSet and 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // then written back out when the message is serialized. This allows servers 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // which simply route messages to other servers to pass through messages 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // that have new field definitions which they don't yet know about. However, 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this behavior can have security implications. To avoid it, call this 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // method after parsing. 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Reflection::GetUnknownFields() for more on unknown fields. 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void DiscardUnknownFields(); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Computes (an estimate of) the total number of bytes currently used for 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // storing the message in memory. The default implementation calls the 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reflection object's SpaceUsed() method. 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual int SpaceUsed() const; 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 242d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Debugging & Testing---------------------------------------------- 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Generates a human readable form of this message, useful for debugging 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // and other purposes. 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DebugString() const; 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like DebugString(), but with less whitespace. 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string ShortDebugString() const; 249d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Like DebugString(), but do not escape UTF-8 byte sequences. 250d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string Utf8DebugString() const; 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Convenience function useful in GDB. Prints DebugString() to stdout. 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void PrintDebugString() const; 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Heavy I/O ------------------------------------------------------- 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Additional parsing and serialization methods not implemented by 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // MessageLite because they are not supported by the lite library. 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse a protocol buffer from a file descriptor. If successful, the entire 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // input will be consumed. 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseFromFileDescriptor(int file_descriptor); 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like ParseFromFileDescriptor(), but accepts messages that are missing 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required fields. 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParsePartialFromFileDescriptor(int file_descriptor); 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse a protocol buffer from a C++ istream. If successful, the entire 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // input will be consumed. 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseFromIstream(istream* input); 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like ParseFromIstream(), but accepts messages that are missing 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required fields. 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParsePartialFromIstream(istream* input); 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Serialize the message and write it to the given file descriptor. All 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required fields must be set. 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool SerializeToFileDescriptor(int file_descriptor) const; 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like SerializeToFileDescriptor(), but allows missing required fields. 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool SerializePartialToFileDescriptor(int file_descriptor) const; 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Serialize the message and write it to the given C++ ostream. All 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required fields must be set. 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool SerializeToOstream(ostream* output) const; 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like SerializeToOstream(), but allows missing required fields. 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool SerializePartialToOstream(ostream* output) const; 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reflection-based methods ---------------------------------------- 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These methods are pure-virtual in MessageLite, but Message provides 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // reflection-based default implementations. 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual string GetTypeName() const; 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void Clear(); 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool IsInitialized() const; 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void CheckTypeAndMergeFrom(const MessageLite& other); 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool MergePartialFromCodedStream(io::CodedInputStream* input); 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual int ByteSize() const; 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SerializeWithCachedSizes(io::CodedOutputStream* output) const; 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This is called only by the default implementation of ByteSize(), to 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // update the cached size. If you override ByteSize(), you do not need 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to override this. If you do not override ByteSize(), you MUST override 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this; the default implementation will crash. 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The method is private because subclasses should never call it; only 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // override it. Yes, C++ lets you do that. Crazy, huh? 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetCachedSize(int size) const; 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Introspection --------------------------------------------------- 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Typedef for backwards-compatibility. 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef google::protobuf::Reflection Reflection; 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get a Descriptor for this message's type. This describes what 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fields the message contains, the types of those fields, etc. 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* GetDescriptor() const { return GetMetadata().descriptor; } 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the Reflection interface for this Message, which can be used to 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // read and modify the fields of the Message dynamically (in other words, 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // without knowing the message type at compile time). This object remains 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // property of the Message. 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This method remains virtual in case a subclass does not implement 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // reflection and wants to override the default behavior. 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const Reflection* GetReflection() const { 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GetMetadata().reflection; 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get a struct containing the metadata for the Message. Most subclasses only 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // need to implement this method, rather than the GetDescriptor() and 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // GetReflection() wrappers. 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual Metadata GetMetadata() const = 0; 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 333d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message); 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This interface contains methods that can be used to dynamically access 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and modify the fields of a protocol message. Their semantics are 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// similar to the accessors the protocol compiler generates. 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To get the Reflection for a given Message, call Message::GetReflection(). 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This interface is separate from Message only for efficiency reasons; 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the vast majority of implementations of Message will share the same 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// implementation of Reflection (GeneratedMessageReflection, 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// defined in generated_message.h), and all Messages of a particular class 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// should share the same Reflection object (though you should not rely on 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the latter fact). 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// There are several ways that these methods can be used incorrectly. For 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// example, any of the following conditions will lead to undefined 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// results (probably assertion failures): 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - The FieldDescriptor is not a field of this message type. 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - The method called is not appropriate for the field's type. For 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// each field type in FieldDescriptor::TYPE_*, there is only one 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Get*() method, one Set*() method, and one Add*() method that is 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// valid for that type. It should be obvious which (except maybe 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for TYPE_BYTES, which are represented using strings in C++). 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - A Get*() or Set*() method for singular fields is called on a repeated 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// field. 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - GetRepeated*(), SetRepeated*(), or Add*() is called on a non-repeated 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// field. 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - The Message object passed to any method is not of the right type for 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this Reflection object (i.e. message.GetReflection() != reflection). 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You might wonder why there is not any abstract representation for a field 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// of arbitrary type. E.g., why isn't there just a "GetField()" method that 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// returns "const Field&", where "Field" is some class with accessors like 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "GetInt32Value()". The problem is that someone would have to deal with 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// allocating these Field objects. For generated message classes, having to 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// allocate space for an additional object to wrap every field would at least 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// double the message's memory footprint, probably worse. Allocating the 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// objects on-demand, on the other hand, would be expensive and prone to 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// memory leaks. So, instead we ended up with this flat interface. 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// TODO(kenton): Create a utility class which callers can use to read and 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// write fields from a Reflection without paying attention to the type. 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT Reflection { 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(kenton): Remove parameter. 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline Reflection() {} 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual ~Reflection(); 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the UnknownFieldSet for the message. This contains fields which 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // were seen when the Message was parsed but were not recognized according 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to the Message's definition. 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const UnknownFieldSet& GetUnknownFields( 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message) const = 0; 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get a mutable pointer to the UnknownFieldSet for the message. This 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // contains fields which were seen when the Message was parsed but were not 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // recognized according to the Message's definition. 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0; 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Estimate the amount of memory used by the message object. 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual int SpaceUsed(const Message& message) const = 0; 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check if the given non-repeated field is set. 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool HasField(const Message& message, 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the number of elements of a repeated field. 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual int FieldSize(const Message& message, 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Clear the value of a field, so that HasField() returns false or 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FieldSize() returns zero. 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void ClearField(Message* message, 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Remove the last element of a repeated field. 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We don't provide a way to remove any element other than the last 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // because it invites inefficient use, such as O(n^2) filtering loops 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // that should have been O(n). If you want to remove an element other 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // than the last, the best way to do it is to re-arrange the elements 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // (using Swap()) so that the one you want removed is at the end, then 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // call RemoveLast(). 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void RemoveLast(Message* message, 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap the complete contents of two messages. 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void Swap(Message* message1, Message* message2) const = 0; 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap two elements of a repeated field. 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SwapElements(Message* message, 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index1, 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index2) const = 0; 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // List all fields of the message which are currently set. This includes 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extensions. Singular fields will only be listed if HasField(field) would 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // return true and repeated fields will only be listed if FieldSize(field) 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // would return non-zero. Fields (both normal fields and extension fields) 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // will be listed ordered by field number. 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void ListFields(const Message& message, 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*>* output) const = 0; 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Singular field getters ------------------------------------------ 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These get the value of a non-repeated field. They return the default 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // value for fields that aren't set. 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual int32 GetInt32 (const Message& message, 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual int64 GetInt64 (const Message& message, 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual uint32 GetUInt32(const Message& message, 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual uint64 GetUInt64(const Message& message, 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual float GetFloat (const Message& message, 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual double GetDouble(const Message& message, 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool GetBool (const Message& message, 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual string GetString(const Message& message, 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const = 0; 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const EnumValueDescriptor* GetEnum( 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field) const = 0; 460d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // See MutableMessage() for the meaning of the "factory" parameter. 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const Message& GetMessage(const Message& message, 462d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* field, 463d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MessageFactory* factory = NULL) const = 0; 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get a string value without copying, if possible. 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // GetString() necessarily returns a copy of the string. This can be 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // inefficient when the string is already stored in a string object in the 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // underlying message. GetStringReference() will return a reference to the 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // underlying string in this case. Otherwise, it will copy the string into 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // *scratch and return that. 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: It is perfectly reasonable and useful to write code like: 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // str = reflection->GetStringReference(field, &str); 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This line would ensure that only one copy of the string is made 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // regardless of the field's underlying representation. When initializing 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a newly-constructed string, though, it's just as fast and more readable 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to use code like: 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // string str = reflection->GetString(field); 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const string& GetStringReference(const Message& message, 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* scratch) const = 0; 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Singular field mutators ----------------------------------------- 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These mutate the value of a non-repeated field. 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetInt32 (Message* message, 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int32 value) const = 0; 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetInt64 (Message* message, 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int64 value) const = 0; 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUInt32(Message* message, 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, uint32 value) const = 0; 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUInt64(Message* message, 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, uint64 value) const = 0; 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetFloat (Message* message, 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, float value) const = 0; 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetDouble(Message* message, 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, double value) const = 0; 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetBool (Message* message, 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, bool value) const = 0; 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetString(Message* message, 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& value) const = 0; 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetEnum (Message* message, 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* value) const = 0; 508d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Get a mutable pointer to a field with a message type. If a MessageFactory 509d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // is provided, it will be used to construct instances of the sub-message; 510d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // otherwise, the default factory is used. If the field is an extension that 511d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // does not live in the same pool as the containing message's descriptor (e.g. 512d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // it lives in an overlay pool), then a MessageFactory must be provided. 513d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // If you have no idea what that meant, then you probably don't need to worry 514d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // about it (don't provide a MessageFactory). WARNING: If the 515d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // FieldDescriptor is for a compiled-in extension, then 516d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // factory->GetPrototype(field->message_type() MUST return an instance of the 517d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // compiled-in class for this type, NOT DynamicMessage. 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual Message* MutableMessage(Message* message, 519d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* field, 520d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MessageFactory* factory = NULL) const = 0; 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Repeated field getters ------------------------------------------ 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These get the value of one element of a repeated field. 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual int32 GetRepeatedInt32 (const Message& message, 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const = 0; 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual int64 GetRepeatedInt64 (const Message& message, 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const = 0; 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual uint32 GetRepeatedUInt32(const Message& message, 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const = 0; 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual uint64 GetRepeatedUInt64(const Message& message, 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const = 0; 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual float GetRepeatedFloat (const Message& message, 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const = 0; 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual double GetRepeatedDouble(const Message& message, 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const = 0; 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool GetRepeatedBool (const Message& message, 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const = 0; 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual string GetRepeatedString(const Message& message, 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const = 0; 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const EnumValueDescriptor* GetRepeatedEnum( 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int index) const = 0; 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const Message& GetRepeatedMessage( 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int index) const = 0; 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See GetStringReference(), above. 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const string& GetRepeatedStringReference( 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message& message, const FieldDescriptor* field, 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, string* scratch) const = 0; 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Repeated field mutators ----------------------------------------- 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These mutate the value of one element of a repeated field. 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedInt32 (Message* message, 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, int32 value) const = 0; 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedInt64 (Message* message, 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, int64 value) const = 0; 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedUInt32(Message* message, 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, uint32 value) const = 0; 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedUInt64(Message* message, 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, uint64 value) const = 0; 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedFloat (Message* message, 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, float value) const = 0; 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedDouble(Message* message, 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, double value) const = 0; 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedBool (Message* message, 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, bool value) const = 0; 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedString(Message* message, 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, const string& value) const = 0; 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetRepeatedEnum(Message* message, 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int index, 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* value) const = 0; 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get a mutable pointer to an element of a repeated field with a message 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // type. 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual Message* MutableRepeatedMessage( 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Message* message, const FieldDescriptor* field, int index) const = 0; 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Repeated field adders ------------------------------------------- 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These add an element to a repeated field. 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddInt32 (Message* message, 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int32 value) const = 0; 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddInt64 (Message* message, 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, int64 value) const = 0; 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddUInt32(Message* message, 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, uint32 value) const = 0; 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddUInt64(Message* message, 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, uint64 value) const = 0; 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddFloat (Message* message, 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, float value) const = 0; 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddDouble(Message* message, 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, double value) const = 0; 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddBool (Message* message, 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, bool value) const = 0; 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddString(Message* message, 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& value) const = 0; 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddEnum (Message* message, 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field, 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* value) const = 0; 622d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // See MutableMessage() for comments on the "factory" parameter. 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual Message* AddMessage(Message* message, 624d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* field, 625d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MessageFactory* factory = NULL) const = 0; 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Extensions ------------------------------------------------------ 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try to find an extension of this message type by fully-qualified field 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // name. Returns NULL if no extension is known for this name or number. 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const FieldDescriptor* FindKnownExtensionByName( 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name) const = 0; 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Try to find an extension of this message type by field number. 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Returns NULL if no extension is known for this name or number. 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const FieldDescriptor* FindKnownExtensionByNumber( 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number) const = 0; 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Abstract interface for a factory for message objects. 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT MessageFactory { 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline MessageFactory() {} 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual ~MessageFactory(); 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Given a Descriptor, gets or constructs the default (prototype) Message 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of that type. You can then call that message's New() method to construct 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a mutable message of that type. 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Calling this method twice with the same Descriptor returns the same 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // object. The returned object remains property of the factory. Also, any 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // objects created by calling the prototype's New() method share some data 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // with the prototype, so these must be destoyed before the MessageFactory 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // is destroyed. 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The given descriptor must outlive the returned message, and hence must 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // outlive the MessageFactory. 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Some implementations do not support all types. GetPrototype() will 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // return NULL if the descriptor passed in is not supported. 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This method may or may not be thread-safe depending on the implementation. 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Each implementation should document its own degree thread-safety. 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual const Message* GetPrototype(const Descriptor* type) = 0; 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets a MessageFactory which supports all generated, compiled-in messages. 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // In other words, for any compiled-in type FooMessage, the following is true: 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // MessageFactory::generated_factory()->GetPrototype( 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FooMessage::descriptor()) == FooMessage::default_instance() 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This factory supports all types which are found in 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // DescriptorPool::generated_pool(). If given a descriptor from any other 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // pool, GetPrototype() will return NULL. (You can also check if a 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor is for a generated message by checking if 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor->file()->pool() == DescriptorPool::generated_pool().) 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This factory is 100% thread-safe; calling GetPrototype() does not modify 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // any shared data. 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This factory is a singleton. The caller must not delete the object. 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static MessageFactory* generated_factory(); 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For internal use only: Registers a .proto file at static initialization 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // time, to be placed in generated_factory. The first time GetPrototype() 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // is called with a descriptor from this file, |register_messages| will be 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // called, with the file name as the parameter. It must call 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // InternalRegisterGeneratedMessage() (below) to register each message type 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in the file. This strange mechanism is necessary because descriptors are 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // built lazily, so we can't register types by their descriptor until we 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // know that the descriptor exists. |filename| must be a permanent string. 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void InternalRegisterGeneratedFile( 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const char* filename, void (*register_messages)(const string&)); 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For internal use only: Registers a message type. Called only by the 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // functions which are registered with InternalRegisterGeneratedFile(), 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // above. 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void InternalRegisterGeneratedMessage(const Descriptor* descriptor, 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message* prototype); 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFactory); 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GOOGLE_PROTOBUF_MESSAGE_H__ 711