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