| Index: third_party/protobuf/php/src/Google/Protobuf/descriptor.php
|
| diff --git a/third_party/protobuf/php/src/Google/Protobuf/descriptor.php b/third_party/protobuf/php/src/Google/Protobuf/descriptor.php
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ef6b9dcf47ecdfae147db9a5a39a745a33d4d54b
|
| --- /dev/null
|
| +++ b/third_party/protobuf/php/src/Google/Protobuf/descriptor.php
|
| @@ -0,0 +1,558 @@
|
| +<?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, $file->getPackage(), ""));
|
| + }
|
| + foreach ($proto->getEnumType() as $enum_proto) {
|
| + $file->getEnumType()[] =
|
| + $file->addEnumType(
|
| + EnumDescriptor::buildFromProto(
|
| + $enum_proto,
|
| + $file->getPackage(),
|
| + ""));
|
| + }
|
| + 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)
|
| + {
|
| + 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, $package, $containing)
|
| + {
|
| + $desc = new Descriptor();
|
| +
|
| + $message_name_without_package = "";
|
| + $classname = "";
|
| + $fullname = "";
|
| + getFullClassName(
|
| + $proto,
|
| + $containing,
|
| + $package,
|
| + $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, $package, $message_name_without_package));
|
| + }
|
| +
|
| + // Handle oneof fields.
|
| + foreach ($proto->getOneofDecl() as $oneof_proto) {
|
| + $desc->addOneofDecl(
|
| + OneofDescriptor::buildFromProto($oneof_proto, $desc));
|
| + }
|
| +
|
| + return $desc;
|
| + }
|
| +}
|
| +
|
| +function addPrefixIfSpecial(
|
| + $name,
|
| + $package)
|
| +{
|
| + if ($name === "Empty" && $package === "google.protobuf") {
|
| + return "GPBEmpty";
|
| + } else {
|
| + return $name;
|
| + }
|
| +}
|
| +
|
| +function getFullClassName(
|
| + $proto,
|
| + $containing,
|
| + $package,
|
| + &$message_name_without_package,
|
| + &$classname,
|
| + &$fullname)
|
| +{
|
| + // Full name needs to start with '.'.
|
| + $message_name_without_package =
|
| + addPrefixIfSpecial($proto->getName(), $package);
|
| + if ($containing !== "") {
|
| + $message_name_without_package =
|
| + $containing . "." . $message_name_without_package;
|
| + }
|
| + if ($package === "") {
|
| + $fullname = "." . $message_name_without_package;
|
| + } else {
|
| + $fullname = "." . $package . "." . $message_name_without_package;
|
| + }
|
| +
|
| + // Nested message class names are seperated by '_', and package names are
|
| + // seperated by '\'.
|
| + $class_name_without_package =
|
| + implode('_', array_map('ucwords',
|
| + explode('.', $message_name_without_package)));
|
| + 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, $package, $containing)
|
| + {
|
| + $desc = new EnumDescriptor();
|
| +
|
| + $enum_name_without_package = "";
|
| + $classname = "";
|
| + $fullname = "";
|
| + getFullClassName(
|
| + $proto,
|
| + $containing,
|
| + $package,
|
| + $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);
|
| + }
|
| +}
|
|
|