1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 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 Saville
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Error(Exception): pass
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DecodeError(Error): pass
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EncodeError(Error): pass
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Message(object):
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Abstract base class for protocol messages.
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Protocol message classes are almost always generated by the protocol
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  compiler.  These generated types subclass Message and implement the methods
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  shown below.
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TODO(robinson): Link to an HTML document here.
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TODO(robinson): Document that instances of this class will also
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  have an Extensions attribute with __getitem__ and __setitem__.
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Again, not sure how to best convey this.
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TODO(robinson): Document that the class must also have a static
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    RegisterExtension(extension_field) method.
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Not sure how to best express at this point.
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Document these fields and methods.
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  __slots__ = []
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  DESCRIPTOR = None
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __eq__(self, other_msg):
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __ne__(self, other_msg):
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Can't just say self != other_msg, since that would infinitely recurse. :)
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return not self == other_msg
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __str__(self):
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def MergeFrom(self, other_msg):
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Merges the contents of the specified message into current message.
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    This method merges the contents of the specified message into the current
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message. Singular fields that are set in the specified message overwrite
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    the corresponding fields in the current message. Repeated fields are
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    appended. Singular sub-messages and groups are recursively merged.
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      other_msg: Message to merge into the current message.
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def CopyFrom(self, other_msg):
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Copies the content of the specified message into the current message.
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    The method clears the current message and then merges the specified
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message using MergeFrom.
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      other_msg: Message to copy into the current one.
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if self is other_msg:
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.Clear()
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.MergeFrom(other_msg)
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def Clear(self):
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Clears all data that was set in the message."""
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
111d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def SetInParent(self):
112d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Mark this as present in the parent.
113d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    This normally happens automatically when you assign a field of a
115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    sub-message, but sometimes you want to make the sub-message
116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    present while keeping it empty.  If you find yourself using this,
117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    you may want to reconsider your design."""
118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    raise NotImplementedError
119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def IsInitialized(self):
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Checks if the message is initialized.
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Returns:
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      The method returns True if the message is initialized (i.e. all of its
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      required fields are set).
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): MergeFromString() should probably return None and be
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # implemented in terms of a helper that returns the # of bytes read.  Our
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # deserialization routines would use the helper when recursively
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # deserializing, but the end user would almost always just want the no-return
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # MergeFromString().
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def MergeFromString(self, serialized):
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Merges serialized protocol buffer data into this message.
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    When we find a field in |serialized| that is already present
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    in this message:
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      - If it's a "repeated" field, we append to the end of our list.
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      - Else, if it's a scalar, we overwrite our field.
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      - Else, (it's a nonrepeated composite), we recursively merge
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        into the existing composite.
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TODO(robinson): Document handling of unknown fields.
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      serialized: Any object that allows us to call buffer(serialized)
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        to access a string of bytes using the buffer interface.
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TODO(robinson): When we switch to a helper, this will return None.
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Returns:
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      The number of bytes read from |serialized|.
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      For non-group messages, this will always be len(serialized),
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      but for messages which are actually groups, this will
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      generally be less than len(serialized), since we must
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      stop when we reach an END_GROUP tag.  Note that if
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      we *do* stop because of an END_GROUP tag, the number
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      of bytes returned does not include the bytes
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      for the END_GROUP tag information.
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ParseFromString(self, serialized):
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Like MergeFromString(), except we clear the object first."""
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.Clear()
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.MergeFromString(serialized)
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def SerializeToString(self):
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Serializes the protocol message to a binary string.
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Returns:
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      A binary string representation of the message if all of the required
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      fields in the message are set (i.e. the message is initialized).
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Raises:
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message.EncodeError if the message isn't initialized.
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def SerializePartialToString(self):
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Serializes the protocol message to a binary string.
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    This method is similar to SerializeToString but doesn't check if the
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message is initialized.
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Returns:
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      A string representation of the partial message.
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Decide whether we like these better
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # than auto-generated has_foo() and clear_foo() methods
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # on the instances themselves.  This way is less consistent
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # with C++, but it makes reflection-type access easier and
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # reduces the number of magically autogenerated things.
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # TODO(robinson): Be sure to document (and test) exactly
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # which field names are accepted here.  Are we case-sensitive?
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # What do we do with fields that share names with Python keywords
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # like 'lambda' and 'yield'?
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  #
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # nnorwitz says:
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # """
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Typically (in python), an underscore is appended to names that are
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # keywords. So they would become lambda_ or yield_.
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # """
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ListFields(self):
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Returns a list of (FieldDescriptor, value) tuples for all
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    fields in the message which are not empty.  A singular field is non-empty
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if HasField() would return true, and a repeated field is non-empty if
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    it contains at least one element.  The fields are ordered by field
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    number"""
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def HasField(self, field_name):
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ClearField(self, field_name):
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def HasExtension(self, extension_handle):
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ClearExtension(self, extension_handle):
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def ByteSize(self):
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Returns the serialized size of this message.
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Recursively calls ByteSize() on all contained messages.
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def _SetListener(self, message_listener):
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Internal method used by the protocol message implementation.
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Clients should not call this directly.
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Sets a listener that this message will call on certain state transitions.
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    The purpose of this method is to register back-edges from children to
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    parents at runtime, for the purpose of setting "has" bits and
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    byte-size-dirty bits in the parent and ancestor objects whenever a child or
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descendant object is modified.
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    If the client wants to disconnect this Message from the object tree, she
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    explicitly sets callback to None.
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    If message_listener is None, unregisters any existing listener.  Otherwise,
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message_listener must implement the MessageListener interface in
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    internal/message_listener.py, and we discard any listener registered
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    via a previous _SetListener() call.
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    raise NotImplementedError
255