17e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# Protocol Buffers - Google's data interchange format 27e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# Copyright 2008 Google Inc. All rights reserved. 37e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# http://code.google.com/p/protobuf/ 47e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# 57e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# Redistribution and use in source and binary forms, with or without 67e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# modification, are permitted provided that the following conditions are 77e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# met: 87e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# 97e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# * Redistributions of source code must retain the above copyright 107e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# notice, this list of conditions and the following disclaimer. 117e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# * Redistributions in binary form must reproduce the above 127e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# copyright notice, this list of conditions and the following disclaimer 137e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# in the documentation and/or other materials provided with the 147e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# distribution. 157e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# * Neither the name of Google Inc. nor the names of its 167e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# contributors may be used to endorse or promote products derived from 177e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# this software without specific prior written permission. 187e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# 197e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 207e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 217e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 227e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 237e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 247e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 257e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 267e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 277e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 287e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 297e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 307e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 317e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang""" 327e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing WangThis module is the central entity that determines which implementation of the 337e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing WangAPI is used. 347e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang""" 357e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 367e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang__author__ = 'petar@google.com (Petar Petrov)' 377e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 387e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wangimport os 397e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# This environment variable can be used to switch to a certain implementation 407e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# of the Python API. Right now only 'python' and 'cpp' are valid values. Any 417e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# other value will be ignored. 427e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang_implementation_type = os.getenv('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION', 437e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 'python') 447e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 457e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 467e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wangif _implementation_type != 'python': 477e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang # For now, by default use the pure-Python implementation. 487e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang # The code below checks if the C extension is available and 497e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang # uses it if it is available. 507e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang _implementation_type = 'cpp' 517e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang ## Determine automatically which implementation to use. 527e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang #try: 537e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang # from google.protobuf.internal import cpp_message 547e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang # _implementation_type = 'cpp' 557e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang #except ImportError, e: 567e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang # _implementation_type = 'python' 577e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 587e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 597e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# This environment variable can be used to switch between the two 607e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# 'cpp' implementations. Right now only 1 and 2 are valid values. Any 617e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# other value will be ignored. 627e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang_implementation_version_str = os.getenv( 637e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 'PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION', 647e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang '1') 657e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 667e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 677e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wangif _implementation_version_str not in ('1', '2'): 687e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang raise ValueError( 697e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang "unsupported PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION_VERSION: '" + 707e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang _implementation_version_str + "' (supported versions: 1, 2)" 717e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang ) 727e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 737e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 747e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang_implementation_version = int(_implementation_version_str) 757e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 767e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 777e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 787e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# Usage of this function is discouraged. Clients shouldn't care which 797e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# implementation of the API is in use. Note that there is no guarantee 807e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# that differences between APIs will be maintained. 817e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# Please don't use this function if possible. 827e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wangdef Type(): 837e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang return _implementation_type 847e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang 857e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang# See comment on 'Type' above. 867e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wangdef Version(): 877e7f2e9122af6c7e7e7d4ba205fdf46d50b95eefYing Wang return _implementation_version 88