| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 | 
							- # Protocol Buffers - Google's data interchange format
 
- # Copyright 2008 Google Inc.  All rights reserved.
 
- # http://code.google.com/p/protobuf/
 
- #
 
- # Redistribution and use in source and binary forms, with or without
 
- # modification, are permitted provided that the following conditions are
 
- # met:
 
- #
 
- #     * Redistributions of source code must retain the above copyright
 
- # notice, this list of conditions and the following disclaimer.
 
- #     * Redistributions in binary form must reproduce the above
 
- # copyright notice, this list of conditions and the following disclaimer
 
- # in the documentation and/or other materials provided with the
 
- # distribution.
 
- #     * Neither the name of Google Inc. nor the names of its
 
- # contributors may be used to endorse or promote products derived from
 
- # this software without specific prior written permission.
 
- #
 
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
- # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 
- # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 
- # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
- # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 
- # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
- # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
- # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
- # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 
- # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
- # TODO(robinson): We should just make these methods all "pure-virtual" and move
 
- # all implementation out, into reflection.py for now.
 
- """Contains an abstract base class for protocol messages."""
 
- __author__ = 'robinson@google.com (Will Robinson)'
 
- class Error(Exception): pass
 
- class DecodeError(Error): pass
 
- class EncodeError(Error): pass
 
- class Message(object):
 
-   """Abstract base class for protocol messages.
 
-   Protocol message classes are almost always generated by the protocol
 
-   compiler.  These generated types subclass Message and implement the methods
 
-   shown below.
 
-   TODO(robinson): Link to an HTML document here.
 
-   TODO(robinson): Document that instances of this class will also
 
-   have an Extensions attribute with __getitem__ and __setitem__.
 
-   Again, not sure how to best convey this.
 
-   TODO(robinson): Document that the class must also have a static
 
-     RegisterExtension(extension_field) method.
 
-     Not sure how to best express at this point.
 
-   """
 
-   # TODO(robinson): Document these fields and methods.
 
-   __slots__ = []
 
-   DESCRIPTOR = None
 
-   def __deepcopy__(self, memo=None):
 
-     clone = type(self)()
 
-     clone.MergeFrom(self)
 
-     return clone
 
-   def __eq__(self, other_msg):
 
-     raise NotImplementedError
 
-   def __ne__(self, other_msg):
 
-     # Can't just say self != other_msg, since that would infinitely recurse. :)
 
-     return not self == other_msg
 
-   def __hash__(self):
 
-     raise TypeError('unhashable object')
 
-   def __str__(self):
 
-     raise NotImplementedError
 
-   def __unicode__(self):
 
-     raise NotImplementedError
 
-   def MergeFrom(self, other_msg):
 
-     """Merges the contents of the specified message into current message.
 
-     This method merges the contents of the specified message into the current
 
-     message. Singular fields that are set in the specified message overwrite
 
-     the corresponding fields in the current message. Repeated fields are
 
-     appended. Singular sub-messages and groups are recursively merged.
 
-     Args:
 
-       other_msg: Message to merge into the current message.
 
-     """
 
-     raise NotImplementedError
 
-   def CopyFrom(self, other_msg):
 
-     """Copies the content of the specified message into the current message.
 
-     The method clears the current message and then merges the specified
 
-     message using MergeFrom.
 
-     Args:
 
-       other_msg: Message to copy into the current one.
 
-     """
 
-     if self is other_msg:
 
-       return
 
-     self.Clear()
 
-     self.MergeFrom(other_msg)
 
-   def Clear(self):
 
-     """Clears all data that was set in the message."""
 
-     raise NotImplementedError
 
-   def SetInParent(self):
 
-     """Mark this as present in the parent.
 
-     This normally happens automatically when you assign a field of a
 
-     sub-message, but sometimes you want to make the sub-message
 
-     present while keeping it empty.  If you find yourself using this,
 
-     you may want to reconsider your design."""
 
-     raise NotImplementedError
 
-   def IsInitialized(self):
 
-     """Checks if the message is initialized.
 
-     Returns:
 
-       The method returns True if the message is initialized (i.e. all of its
 
-       required fields are set).
 
-     """
 
-     raise NotImplementedError
 
-   # TODO(robinson): MergeFromString() should probably return None and be
 
-   # implemented in terms of a helper that returns the # of bytes read.  Our
 
-   # deserialization routines would use the helper when recursively
 
-   # deserializing, but the end user would almost always just want the no-return
 
-   # MergeFromString().
 
-   def MergeFromString(self, serialized):
 
-     """Merges serialized protocol buffer data into this message.
 
-     When we find a field in |serialized| that is already present
 
-     in this message:
 
-       - If it's a "repeated" field, we append to the end of our list.
 
-       - Else, if it's a scalar, we overwrite our field.
 
-       - Else, (it's a nonrepeated composite), we recursively merge
 
-         into the existing composite.
 
-     TODO(robinson): Document handling of unknown fields.
 
-     Args:
 
-       serialized: Any object that allows us to call buffer(serialized)
 
-         to access a string of bytes using the buffer interface.
 
-     TODO(robinson): When we switch to a helper, this will return None.
 
-     Returns:
 
-       The number of bytes read from |serialized|.
 
-       For non-group messages, this will always be len(serialized),
 
-       but for messages which are actually groups, this will
 
-       generally be less than len(serialized), since we must
 
-       stop when we reach an END_GROUP tag.  Note that if
 
-       we *do* stop because of an END_GROUP tag, the number
 
-       of bytes returned does not include the bytes
 
-       for the END_GROUP tag information.
 
-     """
 
-     raise NotImplementedError
 
-   def ParseFromString(self, serialized):
 
-     """Like MergeFromString(), except we clear the object first."""
 
-     self.Clear()
 
-     self.MergeFromString(serialized)
 
-   def SerializeToString(self):
 
-     """Serializes the protocol message to a binary string.
 
-     Returns:
 
-       A binary string representation of the message if all of the required
 
-       fields in the message are set (i.e. the message is initialized).
 
-     Raises:
 
-       message.EncodeError if the message isn't initialized.
 
-     """
 
-     raise NotImplementedError
 
-   def SerializePartialToString(self):
 
-     """Serializes the protocol message to a binary string.
 
-     This method is similar to SerializeToString but doesn't check if the
 
-     message is initialized.
 
-     Returns:
 
-       A string representation of the partial message.
 
-     """
 
-     raise NotImplementedError
 
-   # TODO(robinson): Decide whether we like these better
 
-   # than auto-generated has_foo() and clear_foo() methods
 
-   # on the instances themselves.  This way is less consistent
 
-   # with C++, but it makes reflection-type access easier and
 
-   # reduces the number of magically autogenerated things.
 
-   #
 
-   # TODO(robinson): Be sure to document (and test) exactly
 
-   # which field names are accepted here.  Are we case-sensitive?
 
-   # What do we do with fields that share names with Python keywords
 
-   # like 'lambda' and 'yield'?
 
-   #
 
-   # nnorwitz says:
 
-   # """
 
-   # Typically (in python), an underscore is appended to names that are
 
-   # keywords. So they would become lambda_ or yield_.
 
-   # """
 
-   def ListFields(self):
 
-     """Returns a list of (FieldDescriptor, value) tuples for all
 
-     fields in the message which are not empty.  A singular field is non-empty
 
-     if HasField() would return true, and a repeated field is non-empty if
 
-     it contains at least one element.  The fields are ordered by field
 
-     number"""
 
-     raise NotImplementedError
 
-   def HasField(self, field_name):
 
-     raise NotImplementedError
 
-   def ClearField(self, field_name):
 
-     raise NotImplementedError
 
-   def HasExtension(self, extension_handle):
 
-     raise NotImplementedError
 
-   def ClearExtension(self, extension_handle):
 
-     raise NotImplementedError
 
-   def ByteSize(self):
 
-     """Returns the serialized size of this message.
 
-     Recursively calls ByteSize() on all contained messages.
 
-     """
 
-     raise NotImplementedError
 
-   def _SetListener(self, message_listener):
 
-     """Internal method used by the protocol message implementation.
 
-     Clients should not call this directly.
 
-     Sets a listener that this message will call on certain state transitions.
 
-     The purpose of this method is to register back-edges from children to
 
-     parents at runtime, for the purpose of setting "has" bits and
 
-     byte-size-dirty bits in the parent and ancestor objects whenever a child or
 
-     descendant object is modified.
 
-     If the client wants to disconnect this Message from the object tree, she
 
-     explicitly sets callback to None.
 
-     If message_listener is None, unregisters any existing listener.  Otherwise,
 
-     message_listener must implement the MessageListener interface in
 
-     internal/message_listener.py, and we discard any listener registered
 
-     via a previous _SetListener() call.
 
-     """
 
-     raise NotImplementedError
 
 
  |