15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Protocol Buffers - Google's data interchange format
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2008 Google Inc.  All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# http://code.google.com/p/protobuf/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions are
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Redistributions of source code must retain the above copyright
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# notice, this list of conditions and the following disclaimer.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Redistributions in binary form must reproduce the above
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the documentation and/or other materials provided with the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distribution.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     * Neither the name of Google Inc. nor the names of its
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# contributors may be used to endorse or promote products derived from
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this software without specific prior written permission.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Descriptors essentially contain exactly the information found in a .proto
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)file, in types that make this information accessible in Python.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__author__ = 'robinson@google.com (Will Robinson)'
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import api_implementation
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if api_implementation.Type() == 'cpp':
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if api_implementation.Version() == 2:
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    from google.protobuf.internal.cpp import _message
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  else:
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    from google.protobuf.internal import cpp_message
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Error(Exception):
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Base error for this module."""
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass TypeTransformationError(Error):
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  """Error transforming between python proto type and corresponding C++ type."""
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DescriptorBase(object):
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptors base class.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  This class is the base of all descriptor classes. It provides common options
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  related functionaility.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Attributes:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    has_options:  True if the descriptor has non-default options.  Usually it
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is not necessary to read this -- just call GetOptions() which will
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        happily return the default instance.  However, it's sometimes useful
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for efficiency, and also useful inside the protobuf implementation to
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        avoid some bootstrapping issues.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, options, options_class_name):
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Initialize the descriptor given its options message and the name of the
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class of the options message. The name of the class is required in case
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the options message is None and has to be created.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._options = options
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._options_class_name = options_class_name
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Does this descriptor have non-default options?
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.has_options = options is not None
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def _SetOptions(self, options, options_class_name):
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Sets the descriptor's options
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    This function is used in generated proto2 files to update descriptor
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    options. It must not be used outside proto2.
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self._options = options
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self._options_class_name = options_class_name
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    # Does this descriptor have non-default options?
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    self.has_options = options is not None
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetOptions(self):
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Retrieves descriptor options.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    This method returns the options set or creates the default options for the
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    descriptor.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self._options:
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return self._options
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    from google.protobuf import descriptor_pb2
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options_class = getattr(descriptor_pb2, self._options_class_name)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    except AttributeError:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise RuntimeError('Unknown options class name %s!' %
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         (self._options_class_name))
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._options = options_class()
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self._options
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class _NestedDescriptorBase(DescriptorBase):
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Common class for descriptors that can be nested."""
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, options, options_class_name, name, full_name,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               file, containing_type, serialized_start=None,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               serialized_end=None):
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Constructor.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options: Protocol message options or None
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        to use default message options.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options_class_name: (str) The class name of the above options.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name: (str) Name of this protocol message type.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      full_name: (str) Fully-qualified name of this protocol message type,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        which will include protocol "package" name and the name of any
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enclosing types.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file: (FileDescriptor) Reference to file info.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      containing_type: if provided, this is a nested descriptor, with this
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        descriptor as parent, otherwise None.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      serialized_start: The start index (inclusive) in block in the
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.serialized_pb that describes this descriptor.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      serialized_end: The end index (exclusive) in block in the
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.serialized_pb that describes this descriptor.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(_NestedDescriptorBase, self).__init__(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options, options_class_name)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(falk): Add function to calculate full_name instead of having it in
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #             memory?
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.full_name = full_name
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.file = file
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.containing_type = containing_type
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_start = serialized_start
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_end = serialized_end
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetTopLevelContainingType(self):
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns the root if this is a nested type, or itself if its the root."""
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    desc = self
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while desc.containing_type is not None:
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      desc = desc.containing_type
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return desc
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to the matching proto in descriptor_pb2.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty proto instance from descriptor_pb2.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Raises:
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Error: If self couldnt be serialized, due to to few constructor arguments.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (self.file is not None and
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self._serialized_start is not None and
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self._serialized_end is not None):
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto.ParseFromString(self.file.serialized_pb[
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self._serialized_start:self._serialized_end])
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise Error('Descriptor does not contain serialization.')
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Descriptor(_NestedDescriptorBase):
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a protocol message type.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A Descriptor instance has the following attributes:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of this protocol message type.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name: (str) Fully-qualified name of this protocol message type,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      which will include protocol "package" name and the name of any
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enclosing types.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containing_type: (Descriptor) Reference to the descriptor of the
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type containing us, or None if this is top-level.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fields: (list of FieldDescriptors) Field descriptors for all
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fields in this type.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as in |fields|, but indexed by "number" attribute in each
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FieldDescriptor.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as in |fields|, but indexed by "name" attribute in each
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FieldDescriptor.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_types: (list of Descriptors) Descriptor references
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for all protocol message types nested within this one.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_types_by_name: (dict str -> Descriptor) Same Descriptor
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as in |nested_types|, but indexed by "name" attribute
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in each Descriptor.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_types: (list of EnumDescriptors) EnumDescriptor references
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for all enums contained within this type.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as in |enum_types|, but indexed by "name" attribute
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in each EnumDescriptor.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      from enum value name to EnumValueDescriptor for that value.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions: (list of FieldDescriptor) All extensions defined directly
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      within this message type (NOT within a nested type).
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      objects as |extensions|, but indexed by "name" attribute of each
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FieldDescriptor.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_extendable:  Does this type define any extension ranges?
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.MessageOptions) Protocol message options or None
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      to use default message options.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file: (FileDescriptor) Reference to file descriptor.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, filename, containing_type, fields,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               nested_types, enum_types, extensions, options=None,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               is_extendable=True, extension_ranges=None, file=None,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               serialized_start=None, serialized_end=None):
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Arguments to __init__() are as described in the description
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    of Descriptor fields above.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Note that filename is an obsolete argument, that is not used anymore.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Please use file.name to access this as an attribute.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(Descriptor, self).__init__(
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options, 'MessageOptions', name, full_name, file,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        containing_type, serialized_start=serialized_start,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        serialized_end=serialized_start)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # We have fields in addition to fields_by_name and fields_by_number,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # so that:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   1. Clients can index fields by "order in which they're listed."
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #   2. Clients can easily iterate over all fields with the terse
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #      syntax: for f in descriptor.fields: ...
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.fields = fields
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for field in self.fields:
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      field.containing_type = self
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.fields_by_number = dict((f.number, f) for f in fields)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.fields_by_name = dict((f.name, f) for f in fields)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.nested_types = nested_types
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.nested_types_by_name = dict((t.name, t) for t in nested_types)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.enum_types = enum_types
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for enum_type in self.enum_types:
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enum_type.containing_type = self
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.enum_types_by_name = dict((t.name, t) for t in enum_types)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.enum_values_by_name = dict(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (v.name, v) for t in enum_types for v in t.values)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extensions = extensions
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for extension in self.extensions:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension.extension_scope = self
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extensions_by_name = dict((f.name, f) for f in extensions)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.is_extendable = is_extendable
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extension_ranges = extension_ranges
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_start = serialized_start
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_end = serialized_end
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def EnumValueName(self, enum, value):
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Returns the string name of an enum value.
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    This is just a small helper method to simplify a common operation.
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Args:
278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      enum: string name of the Enum.
279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      value: int, value of the enum.
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Returns:
282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      string name of the enum value.
283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Raises:
285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      KeyError if either the Enum doesn't exist or the value is not a valid
286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        value for the enum.
287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """
288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return self.enum_types_by_name[enum].values_by_number[value].name
289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to a descriptor_pb2.DescriptorProto.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty descriptor_pb2.DescriptorProto.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This function is overriden to give a better doc comment.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(Descriptor, self).CopyToProto(proto)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# TODO(robinson): We should have aggressive checking here,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# for example:
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * If you specify a repeated field, you should not be allowed
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     to specify a default value.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   * [Other examples here as needed].
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# TODO(robinson): for this and other *Descriptor classes, we
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# might also want to lock things down aggressively (e.g.,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# prevent clients from setting the attributes).  Having
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# stronger invariants here in general will reduce the number
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# of runtime checks we must do in reflection.py...
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FieldDescriptor(DescriptorBase):
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a single field in a .proto file.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  A FieldDescriptor instance has the following attributes:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of this field, exactly as it appears in .proto.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name: (str) Name of this field, including containing scope.  This is
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      particularly relevant for extensions.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index: (int) Dense, 0-indexed index giving the order that this
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      field textually appears within its message in the .proto file.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number: (int) Tag number declared for this field in the .proto file.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type: (One of the TYPE_* constants below) Declared type.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cpp_type: (One of the CPPTYPE_* constants below) C++ type used to
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      represent this field.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label: (One of the LABEL_* constants below) Tells whether this
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      field is optional, required, or repeated.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    has_default_value: (bool) True if this field has a default value defined,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      otherwise false.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_value: (Varies) Default value of this field.  Only
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      meaningful for non-repeated scalar fields.  Repeated fields
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      should always set this to [], and non-repeated composite
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fields should always set this to None.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containing_type: (Descriptor) Descriptor of the protocol message
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type that contains this field.  Set by the Descriptor constructor
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if we're passed into one.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Somewhat confusingly, for extension fields, this is the
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      descriptor of the EXTENDED message, not the descriptor
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      of the message containing this field.  (See is_extension and
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_scope below).
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_type: (Descriptor) If a composite field, a descriptor
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      of the message type contained in this field.  Otherwise, this is None.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_type: (EnumDescriptor) If this field contains an enum, a
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      descriptor of that enum.  Otherwise, this is None.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_extension: True iff this describes an extension field.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension_scope: (Descriptor) Only meaningful if is_extension is True.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Gives the message that immediately contains this extension field.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Will be None iff we're a top-level (file-level) extension field.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.FieldOptions) Protocol message field options or
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      None to use default field options.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Must be consistent with C++ FieldDescriptor::Type enum in
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # descriptor.h.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # TODO(robinson): Find a way to eliminate this repetition.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_DOUBLE         = 1
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_FLOAT          = 2
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_INT64          = 3
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_UINT64         = 4
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_INT32          = 5
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_FIXED64        = 6
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_FIXED32        = 7
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_BOOL           = 8
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_STRING         = 9
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_GROUP          = 10
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_MESSAGE        = 11
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_BYTES          = 12
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_UINT32         = 13
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_ENUM           = 14
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SFIXED32       = 15
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SFIXED64       = 16
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SINT32         = 17
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SINT64         = 18
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_TYPE            = 18
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Must be consistent with C++ FieldDescriptor::CppType enum in
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # descriptor.h.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # TODO(robinson): Find a way to eliminate this repetition.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT32       = 1
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_INT64       = 2
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_UINT32      = 3
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_UINT64      = 4
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_DOUBLE      = 5
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_FLOAT       = 6
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_BOOL        = 7
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_ENUM        = 8
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_STRING      = 9
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE_MESSAGE     = 10
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_CPPTYPE         = 10
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  _PYTHON_TO_CPP_PROTO_TYPE_MAP = {
399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_DOUBLE: CPPTYPE_DOUBLE,
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_FLOAT: CPPTYPE_FLOAT,
401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_ENUM: CPPTYPE_ENUM,
402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_INT64: CPPTYPE_INT64,
403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_SINT64: CPPTYPE_INT64,
404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_SFIXED64: CPPTYPE_INT64,
405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_UINT64: CPPTYPE_UINT64,
406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_FIXED64: CPPTYPE_UINT64,
407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_INT32: CPPTYPE_INT32,
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_SFIXED32: CPPTYPE_INT32,
409ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_SINT32: CPPTYPE_INT32,
410ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_UINT32: CPPTYPE_UINT32,
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_FIXED32: CPPTYPE_UINT32,
412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_BYTES: CPPTYPE_STRING,
413ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_STRING: CPPTYPE_STRING,
414ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_BOOL: CPPTYPE_BOOL,
415ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_MESSAGE: CPPTYPE_MESSAGE,
416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TYPE_GROUP: CPPTYPE_MESSAGE
417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Must be consistent with C++ FieldDescriptor::Label enum in
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # descriptor.h.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # TODO(robinson): Find a way to eliminate this repetition.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LABEL_OPTIONAL      = 1
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LABEL_REQUIRED      = 2
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LABEL_REPEATED      = 3
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_LABEL           = 3
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, index, number, type, cpp_type, label,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               default_value, message_type, enum_type, containing_type,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               is_extension, extension_scope, options=None,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               has_default_value=True):
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """The arguments are as described in the description of FieldDescriptor
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attributes above.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Note that containing_type may be None, and may be set later if necessary
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (to deal with circular references between message types, for example).
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Likewise for extension_scope.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(FieldDescriptor, self).__init__(options, 'FieldOptions')
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.full_name = full_name
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.index = index
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.number = number
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type = type
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.cpp_type = cpp_type
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.label = label
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.has_default_value = has_default_value
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.default_value = default_value
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.containing_type = containing_type
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.message_type = message_type
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.enum_type = enum_type
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.is_extension = is_extension
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.extension_scope = extension_scope
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if api_implementation.Type() == 'cpp':
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if is_extension:
456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        if api_implementation.Version() == 2:
457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          self._cdescriptor = _message.GetExtensionDescriptor(full_name)
458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        else:
459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        if api_implementation.Version() == 2:
462ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          self._cdescriptor = _message.GetFieldDescriptor(full_name)
463ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        else:
464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          self._cdescriptor = cpp_message.GetFieldDescriptor(full_name)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self._cdescriptor = None
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  @staticmethod
469ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  def ProtoTypeToCppProtoType(proto_type):
470ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """Converts from a Python proto type to a C++ Proto Type.
471ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
472ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    The Python ProtocolBuffer classes specify both the 'Python' datatype and the
473ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    'C++' datatype - and they're not the same. This helper method should
474ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    translate from one to another.
475ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Args:
477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      proto_type: the Python proto type (descriptor.FieldDescriptor.TYPE_*)
478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Returns:
479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      descriptor.FieldDescriptor.CPPTYPE_*, the C++ type.
480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Raises:
481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TypeTransformationError: when the Python proto type isn't known.
482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    """
483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    try:
484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      return FieldDescriptor._PYTHON_TO_CPP_PROTO_TYPE_MAP[proto_type]
485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    except KeyError:
486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      raise TypeTransformationError('Unknown proto_type: %s' % proto_type)
487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumDescriptor(_NestedDescriptorBase):
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for an enum defined in a .proto file.
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  An EnumDescriptor instance has the following attributes:
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of the enum type.
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name: (str) Full name of the type, including package name
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      and any enclosing type(s).
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values: (list of EnumValueDescriptors) List of the values
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in this enum.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_by_name: (dict str -> EnumValueDescriptor) Same as |values|,
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      but indexed by the "name" field of each EnumValueDescriptor.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_by_number: (dict int -> EnumValueDescriptor) Same as |values|,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      but indexed by the "number" field of each EnumValueDescriptor.
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    containing_type: (Descriptor) Descriptor of the immediate containing
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type of this enum, or None if this is an enum defined at the
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      top level in a .proto file.  Set by Descriptor's constructor
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if we're passed into one.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file: (FileDescriptor) Reference to file descriptor.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.EnumOptions) Enum options message or
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      None to use default enum options.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, filename, values,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               containing_type=None, options=None, file=None,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               serialized_start=None, serialized_end=None):
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Arguments are as described in the attribute description above.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Note that filename is an obsolete argument, that is not used anymore.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Please use file.name to access this as an attribute.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(EnumDescriptor, self).__init__(
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options, 'EnumOptions', name, full_name, file,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        containing_type, serialized_start=serialized_start,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        serialized_end=serialized_start)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.values = values
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value in self.values:
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value.type = self
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.values_by_name = dict((v.name, v) for v in values)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.values_by_number = dict((v.number, v) for v in values)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_start = serialized_start
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._serialized_end = serialized_end
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to a descriptor_pb2.EnumDescriptorProto.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty descriptor_pb2.EnumDescriptorProto.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This function is overriden to give a better doc comment.
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(EnumDescriptor, self).CopyToProto(proto)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumValueDescriptor(DescriptorBase):
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a single value within an enum.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of this value.
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index: (int) Dense, 0-indexed index giving the order that this
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value appears textually within its enum in the .proto file.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number: (int) Actual number assigned to this enum value.
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type: (EnumDescriptor) EnumDescriptor to which this value
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      belongs.  Set by EnumDescriptor's constructor if we're
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      passed into one.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.EnumValueOptions) Enum value options message or
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      None to use default enum value options options.
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, index, number, type=None, options=None):
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Arguments are as described in the attribute description above."""
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions')
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.index = index
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.number = number
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type = type
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceDescriptor(_NestedDescriptorBase):
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a service.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name: (str) Name of the service.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    full_name: (str) Full name of the service, including package name.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    index: (int) 0-indexed index giving the order that this services
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      definition appears withing the .proto file.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    methods: (list of MethodDescriptor) List of methods provided by this
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service.
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options: (descriptor_pb2.ServiceOptions) Service options message or
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      None to use default service options.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file: (FileDescriptor) Reference to file info.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, index, methods, options=None, file=None,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               serialized_start=None, serialized_end=None):
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(ServiceDescriptor, self).__init__(
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        options, 'ServiceOptions', name, full_name, file,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        None, serialized_start=serialized_start,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        serialized_end=serialized_end)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.index = index
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.methods = methods
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # Set the containing service for each method in this service.
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for method in self.methods:
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      method.containing_service = self
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def FindMethodByName(self, name):
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Searches for the specified method, and returns its descriptor."""
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for method in self.methods:
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if name == method.name:
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return method
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to a descriptor_pb2.ServiceDescriptorProto.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty descriptor_pb2.ServiceDescriptorProto.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This function is overriden to give a better doc comment.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(ServiceDescriptor, self).CopyToProto(proto)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MethodDescriptor(DescriptorBase):
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a method in a service.
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name: (str) Name of the method within the service.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  full_name: (str) Full name of method.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index: (int) 0-indexed index of the method inside the service.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  containing_service: (ServiceDescriptor) The service that contains this
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    method.
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_type: The descriptor of the message that this method accepts.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output_type: The descriptor of the message that this method returns.
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options: (descriptor_pb2.MethodOptions) Method options message or
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    None to use default method options.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, full_name, index, containing_service,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               input_type, output_type, options=None):
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """The arguments are as described in the description of MethodDescriptor
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    attributes above.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Note that containing_service may be None, and may be set later if necessary.
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(MethodDescriptor, self).__init__(options, 'MethodOptions')
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.full_name = full_name
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.index = index
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.containing_service = containing_service
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.input_type = input_type
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.output_type = output_type
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileDescriptor(DescriptorBase):
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name: name of file, relative to root of source tree.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  package: name of the package
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  serialized_pb: (str) Byte string of serialized
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    descriptor_pb2.FileDescriptorProto.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, package, options=None, serialized_pb=None):
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Constructor."""
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    super(FileDescriptor, self).__init__(options, 'FileOptions')
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.message_types_by_name = {}
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.package = package
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.serialized_pb = serialized_pb
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (api_implementation.Type() == 'cpp' and
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.serialized_pb is not None):
664ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if api_implementation.Version() == 2:
665ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        _message.BuildFile(self.serialized_pb)
666ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      else:
667ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        cpp_message.BuildFile(self.serialized_pb)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CopyToProto(self, proto):
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Copies this to a descriptor_pb2.FileDescriptorProto.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto: An empty descriptor_pb2.FileDescriptorProto.
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto.ParseFromString(self.serialized_pb)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _ParseOptions(message, string):
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Parses serialized options.
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  This helper function is used to parse serialized options in generated
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto2 files. It must not be used outside proto2.
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message.ParseFromString(string)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return message
686ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochdef MakeDescriptor(desc_proto, package=''):
689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  """Make a protobuf Descriptor given a DescriptorProto protobuf.
690ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Args:
692ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    desc_proto: The descriptor_pb2.DescriptorProto protobuf message.
693ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    package: Optional package name for the new message Descriptor (string).
694ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
695ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Returns:
696ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    A Descriptor for protobuf messages.
697ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  """
698ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  full_message_name = [desc_proto.name]
699ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if package: full_message_name.insert(0, package)
700ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  fields = []
701ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for field_proto in desc_proto.field:
702ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    full_name = '.'.join(full_message_name + [field_proto.name])
703ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    field = FieldDescriptor(
704ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        field_proto.name, full_name, field_proto.number - 1,
705ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        field_proto.number, field_proto.type,
706ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type),
707ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        field_proto.label, None, None, None, None, False, None,
708ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        has_default_value=False)
709ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    fields.append(field)
710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
711ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  desc_name = '.'.join(full_message_name)
712ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return Descriptor(desc_proto.name, desc_name, None, None, fields,
713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    [], [], [])
714