1// Protocol Buffers - Google's data interchange format 2// Copyright 2008 Google Inc. All rights reserved. 3// http://code.google.com/p/protobuf/ 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions are 7// met: 8// 9// * Redistributions of source code must retain the above copyright 10// notice, this list of conditions and the following disclaimer. 11// * Redistributions in binary form must reproduce the above 12// copyright notice, this list of conditions and the following disclaimer 13// in the documentation and/or other materials provided with the 14// distribution. 15// * Neither the name of Google Inc. nor the names of its 16// contributors may be used to endorse or promote products derived from 17// this software without specific prior written permission. 18// 19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31// Author: kenton@google.com (Kenton Varda) 32// Based on original Protocol Buffers design by 33// Sanjay Ghemawat, Jeff Dean, and others. 34// 35// The messages in this file describe the definitions found in .proto files. 36// A valid .proto file can be translated directly to a FileDescriptorProto 37// without any other information (e.g. without reading its imports). 38 39 40 41package google.protobuf; 42option java_package = "com.google.protobuf"; 43option java_outer_classname = "DescriptorProtos"; 44 45// descriptor.proto must be optimized for speed because reflection-based 46// algorithms don't work during bootstrapping. 47option optimize_for = SPEED; 48 49// The protocol compiler can output a FileDescriptorSet containing the .proto 50// files it parses. 51message FileDescriptorSet { 52 repeated FileDescriptorProto file = 1; 53} 54 55// Describes a complete .proto file. 56message FileDescriptorProto { 57 optional string name = 1; // file name, relative to root of source tree 58 optional string package = 2; // e.g. "foo", "foo.bar", etc. 59 60 // Names of files imported by this file. 61 repeated string dependency = 3; 62 63 // All top-level definitions in this file. 64 repeated DescriptorProto message_type = 4; 65 repeated EnumDescriptorProto enum_type = 5; 66 repeated ServiceDescriptorProto service = 6; 67 repeated FieldDescriptorProto extension = 7; 68 69 optional FileOptions options = 8; 70} 71 72// Describes a message type. 73message DescriptorProto { 74 optional string name = 1; 75 76 repeated FieldDescriptorProto field = 2; 77 repeated FieldDescriptorProto extension = 6; 78 79 repeated DescriptorProto nested_type = 3; 80 repeated EnumDescriptorProto enum_type = 4; 81 82 message ExtensionRange { 83 optional int32 start = 1; 84 optional int32 end = 2; 85 } 86 repeated ExtensionRange extension_range = 5; 87 88 optional MessageOptions options = 7; 89} 90 91// Describes a field within a message. 92message FieldDescriptorProto { 93 enum Type { 94 // 0 is reserved for errors. 95 // Order is weird for historical reasons. 96 TYPE_DOUBLE = 1; 97 TYPE_FLOAT = 2; 98 TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers 99 // take 10 bytes. Use TYPE_SINT64 if negative 100 // values are likely. 101 TYPE_UINT64 = 4; 102 TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers 103 // take 10 bytes. Use TYPE_SINT32 if negative 104 // values are likely. 105 TYPE_FIXED64 = 6; 106 TYPE_FIXED32 = 7; 107 TYPE_BOOL = 8; 108 TYPE_STRING = 9; 109 TYPE_GROUP = 10; // Tag-delimited aggregate. 110 TYPE_MESSAGE = 11; // Length-delimited aggregate. 111 112 // New in version 2. 113 TYPE_BYTES = 12; 114 TYPE_UINT32 = 13; 115 TYPE_ENUM = 14; 116 TYPE_SFIXED32 = 15; 117 TYPE_SFIXED64 = 16; 118 TYPE_SINT32 = 17; // Uses ZigZag encoding. 119 TYPE_SINT64 = 18; // Uses ZigZag encoding. 120 }; 121 122 enum Label { 123 // 0 is reserved for errors 124 LABEL_OPTIONAL = 1; 125 LABEL_REQUIRED = 2; 126 LABEL_REPEATED = 3; 127 // TODO(sanjay): Should we add LABEL_MAP? 128 }; 129 130 optional string name = 1; 131 optional int32 number = 3; 132 optional Label label = 4; 133 134 // If type_name is set, this need not be set. If both this and type_name 135 // are set, this must be either TYPE_ENUM or TYPE_MESSAGE. 136 optional Type type = 5; 137 138 // For message and enum types, this is the name of the type. If the name 139 // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping 140 // rules are used to find the type (i.e. first the nested types within this 141 // message are searched, then within the parent, on up to the root 142 // namespace). 143 optional string type_name = 6; 144 145 // For extensions, this is the name of the type being extended. It is 146 // resolved in the same manner as type_name. 147 optional string extendee = 2; 148 149 // For numeric types, contains the original text representation of the value. 150 // For booleans, "true" or "false". 151 // For strings, contains the default text contents (not escaped in any way). 152 // For bytes, contains the C escaped value. All bytes >= 128 are escaped. 153 // TODO(kenton): Base-64 encode? 154 optional string default_value = 7; 155 156 optional FieldOptions options = 8; 157} 158 159// Describes an enum type. 160message EnumDescriptorProto { 161 optional string name = 1; 162 163 repeated EnumValueDescriptorProto value = 2; 164 165 optional EnumOptions options = 3; 166} 167 168// Describes a value within an enum. 169message EnumValueDescriptorProto { 170 optional string name = 1; 171 optional int32 number = 2; 172 173 optional EnumValueOptions options = 3; 174} 175 176// Describes a service. 177message ServiceDescriptorProto { 178 optional string name = 1; 179 repeated MethodDescriptorProto method = 2; 180 181 optional ServiceOptions options = 3; 182} 183 184// Describes a method of a service. 185message MethodDescriptorProto { 186 optional string name = 1; 187 188 // Input and output type names. These are resolved in the same way as 189 // FieldDescriptorProto.type_name, but must refer to a message type. 190 optional string input_type = 2; 191 optional string output_type = 3; 192 193 optional MethodOptions options = 4; 194} 195 196// =================================================================== 197// Options 198 199// Each of the definitions above may have "options" attached. These are 200// just annotations which may cause code to be generated slightly differently 201// or may contain hints for code that manipulates protocol messages. 202// 203// Clients may define custom options as extensions of the *Options messages. 204// These extensions may not yet be known at parsing time, so the parser cannot 205// store the values in them. Instead it stores them in a field in the *Options 206// message called uninterpreted_option. This field must have the same name 207// across all *Options messages. We then use this field to populate the 208// extensions when we build a descriptor, at which point all protos have been 209// parsed and so all extensions are known. 210// 211// Extension numbers for custom options may be chosen as follows: 212// * For options which will only be used within a single application or 213// organization, or for experimental options, use field numbers 50000 214// through 99999. It is up to you to ensure that you do not use the 215// same number for multiple options. 216// * For options which will be published and used publicly by multiple 217// independent entities, e-mail kenton@google.com to reserve extension 218// numbers. Simply tell me how many you need and I'll send you back a 219// set of numbers to use -- there's no need to explain how you intend to 220// use them. If this turns out to be popular, a web service will be set up 221// to automatically assign option numbers. 222 223 224message FileOptions { 225 226 // Sets the Java package where classes generated from this .proto will be 227 // placed. By default, the proto package is used, but this is often 228 // inappropriate because proto packages do not normally start with backwards 229 // domain names. 230 optional string java_package = 1; 231 232 233 // If set, all the classes from the .proto file are wrapped in a single 234 // outer class with the given name. This applies to both Proto1 235 // (equivalent to the old "--one_java_file" option) and Proto2 (where 236 // a .proto always translates to a single class, but you may want to 237 // explicitly choose the class name). 238 optional string java_outer_classname = 8; 239 240 // If set true, then the Java code generator will generate a separate .java 241 // file for each top-level message, enum, and service defined in the .proto 242 // file. Thus, these types will *not* be nested inside the outer class 243 // named by java_outer_classname. However, the outer class will still be 244 // generated to contain the file's getDescriptor() method as well as any 245 // top-level extensions defined in the file. 246 optional bool java_multiple_files = 10 [default=false]; 247 248 // Generated classes can be optimized for speed or code size. 249 enum OptimizeMode { 250 SPEED = 1; // Generate complete code for parsing, serialization, 251 // etc. 252 CODE_SIZE = 2; // Use ReflectionOps to implement these methods. 253 LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. 254 } 255 optional OptimizeMode optimize_for = 9 [default=SPEED]; 256 257 258 259 260 // Should generic services be generated in each language? "Generic" services 261 // are not specific to any particular RPC system. They are generated by the 262 // main code generators in each language (without additional plugins). 263 // Generic services were the only kind of service generation supported by 264 // early versions of proto2. 265 // 266 // Generic services are now considered deprecated in favor of using plugins 267 // that generate code specific to your particular RPC system. If you are 268 // using such a plugin, set these to false. In the future, we may change 269 // the default to false, so if you explicitly want generic services, you 270 // should explicitly set these to true. 271 optional bool cc_generic_services = 16 [default=true]; 272 optional bool java_generic_services = 17 [default=true]; 273 optional bool py_generic_services = 18 [default=true]; 274 275 // The parser stores options it doesn't recognize here. See above. 276 repeated UninterpretedOption uninterpreted_option = 999; 277 278 // Clients can define custom options in extensions of this message. See above. 279 extensions 1000 to max; 280} 281 282message MessageOptions { 283 // Set true to use the old proto1 MessageSet wire format for extensions. 284 // This is provided for backwards-compatibility with the MessageSet wire 285 // format. You should not use this for any other reason: It's less 286 // efficient, has fewer features, and is more complicated. 287 // 288 // The message must be defined exactly as follows: 289 // message Foo { 290 // option message_set_wire_format = true; 291 // extensions 4 to max; 292 // } 293 // Note that the message cannot have any defined fields; MessageSets only 294 // have extensions. 295 // 296 // All extensions of your type must be singular messages; e.g. they cannot 297 // be int32s, enums, or repeated messages. 298 // 299 // Because this is an option, the above two restrictions are not enforced by 300 // the protocol compiler. 301 optional bool message_set_wire_format = 1 [default=false]; 302 303 // Disables the generation of the standard "descriptor()" accessor, which can 304 // conflict with a field of the same name. This is meant to make migration 305 // from proto1 easier; new code should avoid fields named "descriptor". 306 optional bool no_standard_descriptor_accessor = 2 [default=false]; 307 308 // The parser stores options it doesn't recognize here. See above. 309 repeated UninterpretedOption uninterpreted_option = 999; 310 311 // Clients can define custom options in extensions of this message. See above. 312 extensions 1000 to max; 313} 314 315message FieldOptions { 316 // The ctype option instructs the C++ code generator to use a different 317 // representation of the field than it normally would. See the specific 318 // options below. This option is not yet implemented in the open source 319 // release -- sorry, we'll try to include it in a future version! 320 optional CType ctype = 1 [default = STRING]; 321 enum CType { 322 // Default mode. 323 STRING = 0; 324 325 CORD = 1; 326 327 STRING_PIECE = 2; 328 } 329 // The packed option can be enabled for repeated primitive fields to enable 330 // a more efficient representation on the wire. Rather than repeatedly 331 // writing the tag and type for each element, the entire array is encoded as 332 // a single length-delimited blob. 333 optional bool packed = 2; 334 335 336 // Is this field deprecated? 337 // Depending on the target platform, this can emit Deprecated annotations 338 // for accessors, or it will be completely ignored; in the very least, this 339 // is a formalization for deprecating fields. 340 optional bool deprecated = 3 [default=false]; 341 342 // EXPERIMENTAL. DO NOT USE. 343 // For "map" fields, the name of the field in the enclosed type that 344 // is the key for this map. For example, suppose we have: 345 // message Item { 346 // required string name = 1; 347 // required string value = 2; 348 // } 349 // message Config { 350 // repeated Item items = 1 [experimental_map_key="name"]; 351 // } 352 // In this situation, the map key for Item will be set to "name". 353 // TODO: Fully-implement this, then remove the "experimental_" prefix. 354 optional string experimental_map_key = 9; 355 356 // The parser stores options it doesn't recognize here. See above. 357 repeated UninterpretedOption uninterpreted_option = 999; 358 359 // Clients can define custom options in extensions of this message. See above. 360 extensions 1000 to max; 361} 362 363message EnumOptions { 364 365 // The parser stores options it doesn't recognize here. See above. 366 repeated UninterpretedOption uninterpreted_option = 999; 367 368 // Clients can define custom options in extensions of this message. See above. 369 extensions 1000 to max; 370} 371 372message EnumValueOptions { 373 // The parser stores options it doesn't recognize here. See above. 374 repeated UninterpretedOption uninterpreted_option = 999; 375 376 // Clients can define custom options in extensions of this message. See above. 377 extensions 1000 to max; 378} 379 380message ServiceOptions { 381 382 // Note: Field numbers 1 through 32 are reserved for Google's internal RPC 383 // framework. We apologize for hoarding these numbers to ourselves, but 384 // we were already using them long before we decided to release Protocol 385 // Buffers. 386 387 // The parser stores options it doesn't recognize here. See above. 388 repeated UninterpretedOption uninterpreted_option = 999; 389 390 // Clients can define custom options in extensions of this message. See above. 391 extensions 1000 to max; 392} 393 394message MethodOptions { 395 396 // Note: Field numbers 1 through 32 are reserved for Google's internal RPC 397 // framework. We apologize for hoarding these numbers to ourselves, but 398 // we were already using them long before we decided to release Protocol 399 // Buffers. 400 401 // The parser stores options it doesn't recognize here. See above. 402 repeated UninterpretedOption uninterpreted_option = 999; 403 404 // Clients can define custom options in extensions of this message. See above. 405 extensions 1000 to max; 406} 407 408// A message representing a option the parser does not recognize. This only 409// appears in options protos created by the compiler::Parser class. 410// DescriptorPool resolves these when building Descriptor objects. Therefore, 411// options protos in descriptor objects (e.g. returned by Descriptor::options(), 412// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions 413// in them. 414message UninterpretedOption { 415 // The name of the uninterpreted option. Each string represents a segment in 416 // a dot-separated name. is_extension is true iff a segment represents an 417 // extension (denoted with parentheses in options specs in .proto files). 418 // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents 419 // "foo.(bar.baz).qux". 420 message NamePart { 421 required string name_part = 1; 422 required bool is_extension = 2; 423 } 424 repeated NamePart name = 2; 425 426 // The value of the uninterpreted option, in whatever type the tokenizer 427 // identified it as during parsing. Exactly one of these should be set. 428 optional string identifier_value = 3; 429 optional uint64 positive_int_value = 4; 430 optional int64 negative_int_value = 5; 431 optional double double_value = 6; 432 optional bytes string_value = 7; 433} 434