|  | @@ -1,600 +0,0 @@
 | 
	
		
			
				|  |  | -<?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\GPBType;
 | 
	
		
			
				|  |  | -use Google\Protobuf\Internal\MessageOptions;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class FileDescriptor
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private $package;
 | 
	
		
			
				|  |  | -    private $message_type = [];
 | 
	
		
			
				|  |  | -    private $enum_type = [];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setPackage($package)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->package = $package;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getPackage()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->package;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getMessageType()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->message_type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function addMessageType($desc)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->message_type[] = $desc;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getEnumType()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->enum_type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function addEnumType($desc)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->enum_type[]= $desc;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public static function buildFromProto($proto)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $file = new FileDescriptor();
 | 
	
		
			
				|  |  | -        $file->setPackage($proto->getPackage());
 | 
	
		
			
				|  |  | -        foreach ($proto->getMessageType() as $message_proto) {
 | 
	
		
			
				|  |  | -            $file->addMessageType(Descriptor::buildFromProto(
 | 
	
		
			
				|  |  | -                $message_proto, $proto, ""));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        foreach ($proto->getEnumType() as $enum_proto) {
 | 
	
		
			
				|  |  | -            $file->getEnumType()[] =
 | 
	
		
			
				|  |  | -                $file->addEnumType(
 | 
	
		
			
				|  |  | -                    EnumDescriptor::buildFromProto(
 | 
	
		
			
				|  |  | -                        $enum_proto,
 | 
	
		
			
				|  |  | -                        $proto,
 | 
	
		
			
				|  |  | -                        ""));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return $file;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class Descriptor
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private $full_name;
 | 
	
		
			
				|  |  | -    private $field = [];
 | 
	
		
			
				|  |  | -    private $nested_type = [];
 | 
	
		
			
				|  |  | -    private $enum_type = [];
 | 
	
		
			
				|  |  | -    private $klass;
 | 
	
		
			
				|  |  | -    private $options;
 | 
	
		
			
				|  |  | -    private $oneof_decl = [];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function addOneofDecl($oneof)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->oneof_decl[] = $oneof;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getOneofDecl()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->oneof_decl;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setFullName($full_name)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->full_name = $full_name;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getFullName()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->full_name;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function addField($field)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->field[$field->getNumber()] = $field;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getField()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->field;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function addNestedType($desc)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->nested_type[] = $desc;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getNestedType()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->nested_type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function addEnumType($desc)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->enum_type[] = $desc;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getEnumType()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->enum_type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getFieldByNumber($number)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -      if (!isset($this->field[$number])) {
 | 
	
		
			
				|  |  | -        return NULL;
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        return $this->field[$number];
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setClass($klass)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->klass = $klass;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getClass()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->klass;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setOptions($options)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->options = $options;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getOptions()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->options;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public static function buildFromProto($proto, $file_proto, $containing)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $desc = new Descriptor();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        $message_name_without_package  = "";
 | 
	
		
			
				|  |  | -        $classname = "";
 | 
	
		
			
				|  |  | -        $fullname = "";
 | 
	
		
			
				|  |  | -        getFullClassName(
 | 
	
		
			
				|  |  | -            $proto,
 | 
	
		
			
				|  |  | -            $containing,
 | 
	
		
			
				|  |  | -            $file_proto,
 | 
	
		
			
				|  |  | -            $message_name_without_package,
 | 
	
		
			
				|  |  | -            $classname,
 | 
	
		
			
				|  |  | -            $fullname);
 | 
	
		
			
				|  |  | -        $desc->setFullName($fullname);
 | 
	
		
			
				|  |  | -        $desc->setClass($classname);
 | 
	
		
			
				|  |  | -        $desc->setOptions($proto->getOptions());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        foreach ($proto->getField() as $field_proto) {
 | 
	
		
			
				|  |  | -            $desc->addField(FieldDescriptor::buildFromProto($field_proto));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // Handle nested types.
 | 
	
		
			
				|  |  | -        foreach ($proto->getNestedType() as $nested_proto) {
 | 
	
		
			
				|  |  | -            $desc->addNestedType(Descriptor::buildFromProto(
 | 
	
		
			
				|  |  | -              $nested_proto, $file_proto, $message_name_without_package));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // Handle nested enum.
 | 
	
		
			
				|  |  | -        foreach ($proto->getEnumType() as $enum_proto) {
 | 
	
		
			
				|  |  | -            $desc->addEnumType(EnumDescriptor::buildFromProto(
 | 
	
		
			
				|  |  | -              $enum_proto, $file_proto, $message_name_without_package));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // Handle oneof fields.
 | 
	
		
			
				|  |  | -        foreach ($proto->getOneofDecl() as $oneof_proto) {
 | 
	
		
			
				|  |  | -            $desc->addOneofDecl(
 | 
	
		
			
				|  |  | -                OneofDescriptor::buildFromProto($oneof_proto, $desc));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return $desc;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -function getClassNamePrefix(
 | 
	
		
			
				|  |  | -    $classname,
 | 
	
		
			
				|  |  | -    $file_proto)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    $option = $file_proto->getOptions();
 | 
	
		
			
				|  |  | -    $prefix = is_null($option) ? "" : $option->getPhpClassPrefix();
 | 
	
		
			
				|  |  | -    if ($prefix !== "") {
 | 
	
		
			
				|  |  | -        return $prefix;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $reserved_words = array("Empty", "ECHO", "ARRAY");
 | 
	
		
			
				|  |  | -    foreach ($reserved_words as $reserved_word) {
 | 
	
		
			
				|  |  | -        if ($classname === $reserved_word) {
 | 
	
		
			
				|  |  | -            if ($file_proto->getPackage() === "google.protobuf") {
 | 
	
		
			
				|  |  | -                return "GPB";
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -                return "PB";
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return "";
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -function getClassNameWithoutPackage(
 | 
	
		
			
				|  |  | -    $name,
 | 
	
		
			
				|  |  | -    $file_proto)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    $classname = implode('_', array_map('ucwords', explode('.', $name)));
 | 
	
		
			
				|  |  | -    return getClassNamePrefix($classname, $file_proto) . $classname;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -function getFullClassName(
 | 
	
		
			
				|  |  | -    $proto,
 | 
	
		
			
				|  |  | -    $containing,
 | 
	
		
			
				|  |  | -    $file_proto,
 | 
	
		
			
				|  |  | -    &$message_name_without_package,
 | 
	
		
			
				|  |  | -    &$classname,
 | 
	
		
			
				|  |  | -    &$fullname)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    // Full name needs to start with '.'.
 | 
	
		
			
				|  |  | -    $message_name_without_package = $proto->getName();
 | 
	
		
			
				|  |  | -    if ($containing !== "") {
 | 
	
		
			
				|  |  | -        $message_name_without_package =
 | 
	
		
			
				|  |  | -            $containing . "." . $message_name_without_package;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $package = $file_proto->getPackage();
 | 
	
		
			
				|  |  | -    if ($package === "") {
 | 
	
		
			
				|  |  | -        $fullname = "." . $message_name_without_package;
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -        $fullname = "." . $package . "." . $message_name_without_package;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $class_name_without_package =
 | 
	
		
			
				|  |  | -        getClassNameWithoutPackage($message_name_without_package, $file_proto);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    $option = $file_proto->getOptions();
 | 
	
		
			
				|  |  | -    if (!is_null($option) && $option->hasPhpNamespace()) {
 | 
	
		
			
				|  |  | -        $namespace = $option->getPhpNamespace();
 | 
	
		
			
				|  |  | -        if ($namespace !== "") {
 | 
	
		
			
				|  |  | -            $classname = $namespace . "\\" . $class_name_without_package;
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            $classname = $class_name_without_package;
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if ($package === "") {
 | 
	
		
			
				|  |  | -        $classname = $class_name_without_package;
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -        $classname =
 | 
	
		
			
				|  |  | -            implode('\\', array_map('ucwords', explode('.', $package))).
 | 
	
		
			
				|  |  | -            "\\".$class_name_without_package;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class OneofDescriptor
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private $name;
 | 
	
		
			
				|  |  | -    private $fields;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setName($name)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->name = $name;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getName()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->name;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function addField(&$field)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->fields[] = $field;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getFields()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->fields;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public static function buildFromProto($oneof_proto)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $oneof = new OneofDescriptor();
 | 
	
		
			
				|  |  | -        $oneof->setName($oneof_proto->getName());
 | 
	
		
			
				|  |  | -        return $oneof;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class EnumDescriptor
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private $klass;
 | 
	
		
			
				|  |  | -    private $full_name;
 | 
	
		
			
				|  |  | -    private $value;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setFullName($full_name)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->full_name = $full_name;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getFullName()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->full_name;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function addValue($number, $value)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->value[$number] = $value;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setClass($klass)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->klass = $klass;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getClass()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->klass;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public static function buildFromProto($proto, $file_proto, $containing)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $desc = new EnumDescriptor();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        $enum_name_without_package  = "";
 | 
	
		
			
				|  |  | -        $classname = "";
 | 
	
		
			
				|  |  | -        $fullname = "";
 | 
	
		
			
				|  |  | -        getFullClassName(
 | 
	
		
			
				|  |  | -            $proto,
 | 
	
		
			
				|  |  | -            $containing,
 | 
	
		
			
				|  |  | -            $file_proto,
 | 
	
		
			
				|  |  | -            $enum_name_without_package,
 | 
	
		
			
				|  |  | -            $classname,
 | 
	
		
			
				|  |  | -            $fullname);
 | 
	
		
			
				|  |  | -        $desc->setFullName($fullname);
 | 
	
		
			
				|  |  | -        $desc->setClass($classname);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return $desc;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class EnumValueDescriptor
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class FieldDescriptor
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private $name;
 | 
	
		
			
				|  |  | -    private $setter;
 | 
	
		
			
				|  |  | -    private $getter;
 | 
	
		
			
				|  |  | -    private $number;
 | 
	
		
			
				|  |  | -    private $label;
 | 
	
		
			
				|  |  | -    private $type;
 | 
	
		
			
				|  |  | -    private $message_type;
 | 
	
		
			
				|  |  | -    private $enum_type;
 | 
	
		
			
				|  |  | -    private $packed;
 | 
	
		
			
				|  |  | -    private $is_map;
 | 
	
		
			
				|  |  | -    private $oneof_index = -1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setOneofIndex($index)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->oneof_index = $index;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getOneofIndex()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->oneof_index;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setName($name)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->name = $name;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getName()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->name;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setSetter($setter)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->setter = $setter;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getSetter()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->setter;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setGetter($getter)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->getter = $getter;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getGetter()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->getter;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setNumber($number)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->number = $number;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getNumber()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->number;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setLabel($label)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->label = $label;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getLabel()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->label;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function isRepeated()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->label === GPBLabel::REPEATED;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setType($type)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->type = $type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getType()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setMessageType($message_type)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->message_type = $message_type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getMessageType()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->message_type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setEnumType($enum_type)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->enum_type = $enum_type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getEnumType()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->enum_type;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function setPacked($packed)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $this->packed = $packed;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function getPacked()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->packed;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function isPackable()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->isRepeated() && self::isTypePackable($this->type);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public function isMap()
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return $this->getType() == GPBType::MESSAGE &&
 | 
	
		
			
				|  |  | -               !is_null($this->getMessageType()->getOptions()) &&
 | 
	
		
			
				|  |  | -               $this->getMessageType()->getOptions()->getMapEntry();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private static function isTypePackable($field_type)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        return ($field_type !== GPBType::STRING  &&
 | 
	
		
			
				|  |  | -            $field_type !== GPBType::GROUP   &&
 | 
	
		
			
				|  |  | -            $field_type !== GPBType::MESSAGE &&
 | 
	
		
			
				|  |  | -            $field_type !== GPBType::BYTES);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public static function getFieldDescriptor(
 | 
	
		
			
				|  |  | -        $name,
 | 
	
		
			
				|  |  | -        $label,
 | 
	
		
			
				|  |  | -        $type,
 | 
	
		
			
				|  |  | -        $number,
 | 
	
		
			
				|  |  | -        $oneof_index,
 | 
	
		
			
				|  |  | -        $packed,
 | 
	
		
			
				|  |  | -        $type_name = null)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $field = new FieldDescriptor();
 | 
	
		
			
				|  |  | -        $field->setName($name);
 | 
	
		
			
				|  |  | -        $camel_name = implode('', array_map('ucwords', explode('_', $name)));
 | 
	
		
			
				|  |  | -        $field->setGetter('get' . $camel_name);
 | 
	
		
			
				|  |  | -        $field->setSetter('set' . $camel_name);
 | 
	
		
			
				|  |  | -        $field->setType($type);
 | 
	
		
			
				|  |  | -        $field->setNumber($number);
 | 
	
		
			
				|  |  | -        $field->setLabel($label);
 | 
	
		
			
				|  |  | -        $field->setPacked($packed);
 | 
	
		
			
				|  |  | -        $field->setOneofIndex($oneof_index);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // At this time, the message/enum type may have not been added to pool.
 | 
	
		
			
				|  |  | -        // So we use the type name as place holder and will replace it with the
 | 
	
		
			
				|  |  | -        // actual descriptor in cross building.
 | 
	
		
			
				|  |  | -        switch ($type) {
 | 
	
		
			
				|  |  | -            case GPBType::MESSAGE:
 | 
	
		
			
				|  |  | -                $field->setMessageType($type_name);
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            case GPBType::ENUM:
 | 
	
		
			
				|  |  | -                $field->setEnumType($type_name);
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            default:
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return $field;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    public static function buildFromProto($proto)
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        $type_name = null;
 | 
	
		
			
				|  |  | -        switch ($proto->getType()) {
 | 
	
		
			
				|  |  | -            case GPBType::MESSAGE:
 | 
	
		
			
				|  |  | -            case GPBType::GROUP:
 | 
	
		
			
				|  |  | -            case GPBType::ENUM:
 | 
	
		
			
				|  |  | -                $type_name = $proto->getTypeName();
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -            default:
 | 
	
		
			
				|  |  | -                break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        $oneof_index = $proto->hasOneofIndex() ? $proto->getOneofIndex() : -1;
 | 
	
		
			
				|  |  | -        $packed = false;
 | 
	
		
			
				|  |  | -        $options = $proto->getOptions();
 | 
	
		
			
				|  |  | -        if ($options !== null) {
 | 
	
		
			
				|  |  | -            $packed = $options->getPacked();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return FieldDescriptor::getFieldDescriptor(
 | 
	
		
			
				|  |  | -            $proto->getName(), $proto->getLabel(), $proto->getType(),
 | 
	
		
			
				|  |  | -            $proto->getNumber(), $oneof_index, $packed, $type_name);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 |