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