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