1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc.  All rights reserved.
3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson# https://developers.google.com/protocol-buffers/
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# TODO(robinson): We should just make these methods all "pure-virtual" and move
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# all implementation out, into reflection.py for now.
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Contains an abstract base class for protocol messages."""
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'robinson@google.com (Will Robinson)'
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Error(Exception): pass
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DecodeError(Error): pass
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EncodeError(Error): pass
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Message(object):
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Abstract base class for protocol messages.
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Protocol message classes are almost always generated by the protocol
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  compiler.  These generated types subclass Message and implement the methods
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  shown below.
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TODO(robinson): Link to an HTML document here.
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TODO(robinson): Document that instances of this class will also
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  have an Extensions attribute with __getitem__ and __setitem__.
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Again, not sure how to best convey this.
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TODO(robinson): Document that the class must also have a static
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    RegisterExtension(extension_field) method.
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Not sure how to best express at this point.
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Document these fields and methods.
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  __slots__ = []
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DESCRIPTOR = None
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __deepcopy__(self, memo=None):
70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    clone = type(self)()
71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    clone.MergeFrom(self)
72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return clone
73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __eq__(self, other_msg):
75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Recursively compares two messages by value and structure."""
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __ne__(self, other_msg):
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Can't just say self != other_msg, since that would infinitely recurse. :)
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return not self == other_msg
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __hash__(self):
83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    raise TypeError('unhashable object')
84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __str__(self):
86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Outputs a human-readable representation of the message."""
87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    raise NotImplementedError
88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __unicode__(self):
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Outputs a human-readable representation of the message."""
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def MergeFrom(self, other_msg):
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Merges the contents of the specified message into current message.
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    This method merges the contents of the specified message into the current
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message. Singular fields that are set in the specified message overwrite
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    the corresponding fields in the current message. Repeated fields are
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    appended. Singular sub-messages and groups are recursively merged.
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      other_msg: Message to merge into the current message.
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def CopyFrom(self, other_msg):
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Copies the content of the specified message into the current message.
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    The method clears the current message and then merges the specified
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message using MergeFrom.
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      other_msg: Message to copy into the current one.
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if self is other_msg:
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.Clear()
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.MergeFrom(other_msg)
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def Clear(self):
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Clears all data that was set in the message."""
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def SetInParent(self):
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Mark this as present in the parent.
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    This normally happens automatically when you assign a field of a
128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    sub-message, but sometimes you want to make the sub-message
129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    present while keeping it empty.  If you find yourself using this,
130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    you may want to reconsider your design."""
131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    raise NotImplementedError
132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def IsInitialized(self):
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Checks if the message is initialized.
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Returns:
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      The method returns True if the message is initialized (i.e. all of its
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      required fields are set).
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): MergeFromString() should probably return None and be
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # implemented in terms of a helper that returns the # of bytes read.  Our
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # deserialization routines would use the helper when recursively
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # deserializing, but the end user would almost always just want the no-return
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # MergeFromString().
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def MergeFromString(self, serialized):
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Merges serialized protocol buffer data into this message.
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    When we find a field in |serialized| that is already present
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    in this message:
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      - If it's a "repeated" field, we append to the end of our list.
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      - Else, if it's a scalar, we overwrite our field.
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      - Else, (it's a nonrepeated composite), we recursively merge
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        into the existing composite.
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TODO(robinson): Document handling of unknown fields.
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      serialized: Any object that allows us to call buffer(serialized)
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        to access a string of bytes using the buffer interface.
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TODO(robinson): When we switch to a helper, this will return None.
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Returns:
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      The number of bytes read from |serialized|.
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      For non-group messages, this will always be len(serialized),
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      but for messages which are actually groups, this will
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      generally be less than len(serialized), since we must
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      stop when we reach an END_GROUP tag.  Note that if
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      we *do* stop because of an END_GROUP tag, the number
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      of bytes returned does not include the bytes
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      for the END_GROUP tag information.
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ParseFromString(self, serialized):
179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Parse serialized protocol buffer data into this message.
180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Like MergeFromString(), except we clear the object first and
182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    do not return the value that MergeFromString returns.
183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.Clear()
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.MergeFromString(serialized)
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def SerializeToString(self):
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Serializes the protocol message to a binary string.
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Returns:
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      A binary string representation of the message if all of the required
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      fields in the message are set (i.e. the message is initialized).
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Raises:
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message.EncodeError if the message isn't initialized.
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def SerializePartialToString(self):
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Serializes the protocol message to a binary string.
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    This method is similar to SerializeToString but doesn't check if the
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message is initialized.
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Returns:
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      A string representation of the partial message.
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Decide whether we like these better
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # than auto-generated has_foo() and clear_foo() methods
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # on the instances themselves.  This way is less consistent
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # with C++, but it makes reflection-type access easier and
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # reduces the number of magically autogenerated things.
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Be sure to document (and test) exactly
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # which field names are accepted here.  Are we case-sensitive?
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # What do we do with fields that share names with Python keywords
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # like 'lambda' and 'yield'?
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # nnorwitz says:
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # """
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Typically (in python), an underscore is appended to names that are
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # keywords. So they would become lambda_ or yield_.
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # """
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ListFields(self):
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Returns a list of (FieldDescriptor, value) tuples for all
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields in the message which are not empty.  A singular field is non-empty
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if HasField() would return true, and a repeated field is non-empty if
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    it contains at least one element.  The fields are ordered by field
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    number"""
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def HasField(self, field_name):
235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    """Checks if a certain field is set for the message, or if any field inside
236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    a oneof group is set.  Note that if the field_name is not defined in the
237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message descriptor, ValueError will be raised."""
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ClearField(self, field_name):
241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    """Clears the contents of a given field, or the field set inside a oneof
242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    group.  If the name neither refers to a defined field or oneof group,
243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ValueError is raised."""
244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    raise NotImplementedError
245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  def WhichOneof(self, oneof_group):
247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    """Returns the name of the field that is set inside a oneof group, or
248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    None if no field is set.  If no group with the given name exists, ValueError
249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    will be raised."""
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def HasExtension(self, extension_handle):
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ClearExtension(self, extension_handle):
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  def DiscardUnknownFields(self):
259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    raise NotImplementedError
260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ByteSize(self):
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Returns the serialized size of this message.
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Recursively calls ByteSize() on all contained messages.
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def _SetListener(self, message_listener):
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Internal method used by the protocol message implementation.
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Clients should not call this directly.
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Sets a listener that this message will call on certain state transitions.
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    The purpose of this method is to register back-edges from children to
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parents at runtime, for the purpose of setting "has" bits and
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    byte-size-dirty bits in the parent and ancestor objects whenever a child or
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descendant object is modified.
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    If the client wants to disconnect this Message from the object tree, she
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    explicitly sets callback to None.
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    If message_listener is None, unregisters any existing listener.  Otherwise,
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message_listener must implement the MessageListener interface in
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    internal/message_listener.py, and we discard any listener registered
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    via a previous _SetListener() call.
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __getstate__(self):
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Support the pickle protocol."""
290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return dict(serialized=self.SerializePartialToString())
291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __setstate__(self, state):
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    """Support the pickle protocol."""
294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.__init__()
295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.ParseFromString(state['serialized'])
296