1*1b3f573fSAndroid Build Coastguard Worker# Protocol Buffers - Google's data interchange format 2*1b3f573fSAndroid Build Coastguard Worker# Copyright 2008 Google Inc. All rights reserved. 3*1b3f573fSAndroid Build Coastguard Worker# https://developers.google.com/protocol-buffers/ 4*1b3f573fSAndroid Build Coastguard Worker# 5*1b3f573fSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 6*1b3f573fSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are 7*1b3f573fSAndroid Build Coastguard Worker# met: 8*1b3f573fSAndroid Build Coastguard Worker# 9*1b3f573fSAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright 10*1b3f573fSAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 11*1b3f573fSAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above 12*1b3f573fSAndroid Build Coastguard Worker# copyright notice, this list of conditions and the following disclaimer 13*1b3f573fSAndroid Build Coastguard Worker# in the documentation and/or other materials provided with the 14*1b3f573fSAndroid Build Coastguard Worker# distribution. 15*1b3f573fSAndroid Build Coastguard Worker# * Neither the name of Google Inc. nor the names of its 16*1b3f573fSAndroid Build Coastguard Worker# contributors may be used to endorse or promote products derived from 17*1b3f573fSAndroid Build Coastguard Worker# this software without specific prior written permission. 18*1b3f573fSAndroid Build Coastguard Worker# 19*1b3f573fSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20*1b3f573fSAndroid Build Coastguard Worker# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21*1b3f573fSAndroid Build Coastguard Worker# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22*1b3f573fSAndroid Build Coastguard Worker# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23*1b3f573fSAndroid Build Coastguard Worker# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24*1b3f573fSAndroid Build Coastguard Worker# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25*1b3f573fSAndroid Build Coastguard Worker# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26*1b3f573fSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27*1b3f573fSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28*1b3f573fSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*1b3f573fSAndroid Build Coastguard Worker# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*1b3f573fSAndroid Build Coastguard Worker 31*1b3f573fSAndroid Build Coastguard Worker# This code is meant to work on Python 2.4 and above only. 32*1b3f573fSAndroid Build Coastguard Worker 33*1b3f573fSAndroid Build Coastguard Worker"""Contains a metaclass and helper functions used to create 34*1b3f573fSAndroid Build Coastguard Workerprotocol message classes from Descriptor objects at runtime. 35*1b3f573fSAndroid Build Coastguard Worker 36*1b3f573fSAndroid Build Coastguard WorkerRecall that a metaclass is the "type" of a class. 37*1b3f573fSAndroid Build Coastguard Worker(A class is to a metaclass what an instance is to a class.) 38*1b3f573fSAndroid Build Coastguard Worker 39*1b3f573fSAndroid Build Coastguard WorkerIn this case, we use the GeneratedProtocolMessageType metaclass 40*1b3f573fSAndroid Build Coastguard Workerto inject all the useful functionality into the classes 41*1b3f573fSAndroid Build Coastguard Workeroutput by the protocol compiler at compile-time. 42*1b3f573fSAndroid Build Coastguard Worker 43*1b3f573fSAndroid Build Coastguard WorkerThe upshot of all this is that the real implementation 44*1b3f573fSAndroid Build Coastguard Workerdetails for ALL pure-Python protocol buffers are *here in 45*1b3f573fSAndroid Build Coastguard Workerthis file*. 46*1b3f573fSAndroid Build Coastguard Worker""" 47*1b3f573fSAndroid Build Coastguard Worker 48*1b3f573fSAndroid Build Coastguard Worker__author__ = '[email protected] (Will Robinson)' 49*1b3f573fSAndroid Build Coastguard Worker 50*1b3f573fSAndroid Build Coastguard Worker 51*1b3f573fSAndroid Build Coastguard Workerfrom google.protobuf import message_factory 52*1b3f573fSAndroid Build Coastguard Workerfrom google.protobuf import symbol_database 53*1b3f573fSAndroid Build Coastguard Worker 54*1b3f573fSAndroid Build Coastguard Worker# The type of all Message classes. 55*1b3f573fSAndroid Build Coastguard Worker# Part of the public interface, but normally only used by message factories. 56*1b3f573fSAndroid Build Coastguard WorkerGeneratedProtocolMessageType = message_factory._GENERATED_PROTOCOL_MESSAGE_TYPE 57*1b3f573fSAndroid Build Coastguard Worker 58*1b3f573fSAndroid Build Coastguard WorkerMESSAGE_CLASS_CACHE = {} 59*1b3f573fSAndroid Build Coastguard Worker 60*1b3f573fSAndroid Build Coastguard Worker 61*1b3f573fSAndroid Build Coastguard Worker# Deprecated. Please NEVER use reflection.ParseMessage(). 62*1b3f573fSAndroid Build Coastguard Workerdef ParseMessage(descriptor, byte_str): 63*1b3f573fSAndroid Build Coastguard Worker """Generate a new Message instance from this Descriptor and a byte string. 64*1b3f573fSAndroid Build Coastguard Worker 65*1b3f573fSAndroid Build Coastguard Worker DEPRECATED: ParseMessage is deprecated because it is using MakeClass(). 66*1b3f573fSAndroid Build Coastguard Worker Please use MessageFactory.GetPrototype() instead. 67*1b3f573fSAndroid Build Coastguard Worker 68*1b3f573fSAndroid Build Coastguard Worker Args: 69*1b3f573fSAndroid Build Coastguard Worker descriptor: Protobuf Descriptor object 70*1b3f573fSAndroid Build Coastguard Worker byte_str: Serialized protocol buffer byte string 71*1b3f573fSAndroid Build Coastguard Worker 72*1b3f573fSAndroid Build Coastguard Worker Returns: 73*1b3f573fSAndroid Build Coastguard Worker Newly created protobuf Message object. 74*1b3f573fSAndroid Build Coastguard Worker """ 75*1b3f573fSAndroid Build Coastguard Worker result_class = MakeClass(descriptor) 76*1b3f573fSAndroid Build Coastguard Worker new_msg = result_class() 77*1b3f573fSAndroid Build Coastguard Worker new_msg.ParseFromString(byte_str) 78*1b3f573fSAndroid Build Coastguard Worker return new_msg 79*1b3f573fSAndroid Build Coastguard Worker 80*1b3f573fSAndroid Build Coastguard Worker 81*1b3f573fSAndroid Build Coastguard Worker# Deprecated. Please NEVER use reflection.MakeClass(). 82*1b3f573fSAndroid Build Coastguard Workerdef MakeClass(descriptor): 83*1b3f573fSAndroid Build Coastguard Worker """Construct a class object for a protobuf described by descriptor. 84*1b3f573fSAndroid Build Coastguard Worker 85*1b3f573fSAndroid Build Coastguard Worker DEPRECATED: use MessageFactory.GetPrototype() instead. 86*1b3f573fSAndroid Build Coastguard Worker 87*1b3f573fSAndroid Build Coastguard Worker Args: 88*1b3f573fSAndroid Build Coastguard Worker descriptor: A descriptor.Descriptor object describing the protobuf. 89*1b3f573fSAndroid Build Coastguard Worker Returns: 90*1b3f573fSAndroid Build Coastguard Worker The Message class object described by the descriptor. 91*1b3f573fSAndroid Build Coastguard Worker """ 92*1b3f573fSAndroid Build Coastguard Worker # Original implementation leads to duplicate message classes, which won't play 93*1b3f573fSAndroid Build Coastguard Worker # well with extensions. Message factory info is also missing. 94*1b3f573fSAndroid Build Coastguard Worker # Redirect to message_factory. 95*1b3f573fSAndroid Build Coastguard Worker return symbol_database.Default().GetPrototype(descriptor) 96