| Index: third_party/protobuf/php/src/Google/Protobuf/Internal/DescriptorPool.php
 | 
| diff --git a/third_party/protobuf/php/src/Google/Protobuf/Internal/DescriptorPool.php b/third_party/protobuf/php/src/Google/Protobuf/Internal/DescriptorPool.php
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..23b304ac9ec878f8ac06678e5098b4042f1889d0
 | 
| --- /dev/null
 | 
| +++ b/third_party/protobuf/php/src/Google/Protobuf/Internal/DescriptorPool.php
 | 
| @@ -0,0 +1,162 @@
 | 
| +<?php
 | 
| +
 | 
| +// Protocol Buffers - Google's data interchange format
 | 
| +// Copyright 2008 Google Inc.  All rights reserved.
 | 
| +// https://developers.google.com/protocol-buffers/
 | 
| +//
 | 
| +// 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.
 | 
| +
 | 
| +namespace Google\Protobuf\Internal;
 | 
| +
 | 
| +use Google\Protobuf\Internal\Descriptor;
 | 
| +use Google\Protobuf\Internal\FileDescriptor;
 | 
| +use Google\Protobuf\Internal\FileDescriptorSet;
 | 
| +use Google\Protobuf\Internal\MessageBuilderContext;
 | 
| +use Google\Protobuf\Internal\EnumBuilderContext;
 | 
| +
 | 
| +class DescriptorPool
 | 
| +{
 | 
| +    private static $pool;
 | 
| +    // Map from message names to sub-maps, which are maps from field numbers to
 | 
| +    // field descriptors.
 | 
| +    private $class_to_desc = [];
 | 
| +    private $class_to_enum_desc = [];
 | 
| +    private $proto_to_class = [];
 | 
| +
 | 
| +    public static function getGeneratedPool()
 | 
| +    {
 | 
| +        if (!isset(self::$pool)) {
 | 
| +            self::$pool = new DescriptorPool();
 | 
| +        }
 | 
| +        return self::$pool;
 | 
| +    }
 | 
| +
 | 
| +    public function internalAddGeneratedFile($data)
 | 
| +    {
 | 
| +        $files = new FileDescriptorSet();
 | 
| +        $files->decode($data);
 | 
| +        $file = FileDescriptor::buildFromProto($files->getFile()[0]);
 | 
| +
 | 
| +        foreach ($file->getMessageType() as &$desc) {
 | 
| +            $this->addDescriptor($desc);
 | 
| +        }
 | 
| +        unset($desc);
 | 
| +
 | 
| +        foreach ($file->getEnumType() as &$desc) {
 | 
| +            $this->addEnumDescriptor($desc);
 | 
| +        }
 | 
| +        unset($desc);
 | 
| +
 | 
| +        foreach ($file->getMessageType() as &$desc) {
 | 
| +            $this->crossLink($desc);
 | 
| +        }
 | 
| +        unset($desc);
 | 
| +    }
 | 
| +
 | 
| +    public function addMessage($name, $klass)
 | 
| +    {
 | 
| +        return new MessageBuilderContext($name, $klass, $this);
 | 
| +    }
 | 
| +
 | 
| +    public function addEnum($name, $klass)
 | 
| +    {
 | 
| +        return new EnumBuilderContext($name, $klass, $this);
 | 
| +    }
 | 
| +
 | 
| +    public function addDescriptor($descriptor)
 | 
| +    {
 | 
| +        $this->proto_to_class[$descriptor->getFullName()] =
 | 
| +            $descriptor->getClass();
 | 
| +        $this->class_to_desc[$descriptor->getClass()] = $descriptor;
 | 
| +        foreach ($descriptor->getNestedType() as $nested_type) {
 | 
| +            $this->addDescriptor($nested_type);
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    public function addEnumDescriptor($descriptor)
 | 
| +    {
 | 
| +        $this->proto_to_class[$descriptor->getFullName()] =
 | 
| +            $descriptor->getClass();
 | 
| +        $this->class_to_enum_desc[$descriptor->getClass()] = $descriptor;
 | 
| +    }
 | 
| +
 | 
| +    public function getDescriptorByClassName($klass)
 | 
| +    {
 | 
| +        return $this->class_to_desc[$klass];
 | 
| +    }
 | 
| +
 | 
| +    public function getEnumDescriptorByClassName($klass)
 | 
| +    {
 | 
| +        return $this->class_to_enum_desc[$klass];
 | 
| +    }
 | 
| +
 | 
| +    public function getDescriptorByProtoName($proto)
 | 
| +    {
 | 
| +        $klass = $this->proto_to_class[$proto];
 | 
| +        return $this->class_to_desc[$klass];
 | 
| +    }
 | 
| +
 | 
| +    public function getEnumDescriptorByProtoName($proto)
 | 
| +    {
 | 
| +        $klass = $this->proto_to_class[$proto];
 | 
| +        return $this->class_to_enum_desc[$klass];
 | 
| +    }
 | 
| +
 | 
| +    private function crossLink(&$desc)
 | 
| +    {
 | 
| +        foreach ($desc->getField() as &$field) {
 | 
| +            switch ($field->getType()) {
 | 
| +                case GPBType::MESSAGE:
 | 
| +                    $proto = $field->getMessageType();
 | 
| +                    $field->setMessageType(
 | 
| +                        $this->getDescriptorByProtoName($proto));
 | 
| +                    break;
 | 
| +                case GPBType::ENUM:
 | 
| +                    $proto = $field->getEnumType();
 | 
| +                    $field->setEnumType(
 | 
| +                        $this->getEnumDescriptorByProtoName($proto));
 | 
| +                    break;
 | 
| +                default:
 | 
| +                    break;
 | 
| +            }
 | 
| +        }
 | 
| +        unset($field);
 | 
| +
 | 
| +        foreach ($desc->getNestedType() as &$nested_type) {
 | 
| +            $this->crossLink($nested_type);
 | 
| +        }
 | 
| +        unset($nested_type);
 | 
| +    }
 | 
| +
 | 
| +    public function finish()
 | 
| +    {
 | 
| +        foreach ($this->class_to_desc as $klass => &$desc) {
 | 
| +            $this->crossLink($desc);
 | 
| +        }
 | 
| +        unset($desc);
 | 
| +    }
 | 
| +}
 | 
| 
 |