Follows proper autoloading standards (#3123)
* Follows proper autoloading standards - Splits PHP classes in descriptor.php into separate files - Splits MapFieldIter and RepeatedFieldIter into separate files - Moves descriptor.php to Internal/functions.php - Moves all namespaced functions into Iternal/functions.php * fixes Makefile.am for added php files * [PHP] moves all functions to GPBUtil * removes description.php from the makefilepull/3232/head
parent
09d2994b1f
commit
b9b34e9b11
16 changed files with 1048 additions and 841 deletions
@ -0,0 +1,167 @@ |
|||||||
|
<?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; |
||||||
|
|
||||||
|
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; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Google\Protobuf\Internal; |
||||||
|
|
||||||
|
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 = ""; |
||||||
|
GPBUtil::getFullClassName( |
||||||
|
$proto, |
||||||
|
$containing, |
||||||
|
$file_proto, |
||||||
|
$enum_name_without_package, |
||||||
|
$classname, |
||||||
|
$fullname); |
||||||
|
$desc->setFullName($fullname); |
||||||
|
$desc->setClass($classname); |
||||||
|
|
||||||
|
return $desc; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
<?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; |
||||||
|
|
||||||
|
class EnumValueDescriptor |
||||||
|
{ |
||||||
|
} |
@ -0,0 +1,236 @@ |
|||||||
|
<?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; |
||||||
|
|
||||||
|
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); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,90 @@ |
|||||||
|
<?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; |
||||||
|
|
||||||
|
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; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,113 @@ |
|||||||
|
<?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. |
||||||
|
|
||||||
|
/** |
||||||
|
* MapField and MapFieldIter are used by generated protocol message classes to |
||||||
|
* manipulate map fields. |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace Google\Protobuf\Internal; |
||||||
|
|
||||||
|
/** |
||||||
|
* MapFieldIter is used to iterate MapField. It is also need for the foreach |
||||||
|
* syntax. |
||||||
|
*/ |
||||||
|
class MapFieldIter implements \Iterator |
||||||
|
{ |
||||||
|
|
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
private $container; |
||||||
|
|
||||||
|
/** |
||||||
|
* Create iterator instance for MapField. |
||||||
|
* |
||||||
|
* @param MapField The MapField instance for which this iterator is |
||||||
|
* created. |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
public function __construct($container) |
||||||
|
{ |
||||||
|
$this->container = $container; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reset the status of the iterator |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function rewind() |
||||||
|
{ |
||||||
|
return reset($this->container); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the element at the current position. |
||||||
|
* |
||||||
|
* @return object The element at the current position. |
||||||
|
*/ |
||||||
|
public function current() |
||||||
|
{ |
||||||
|
return current($this->container); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the current key. |
||||||
|
* |
||||||
|
* @return object The current key. |
||||||
|
*/ |
||||||
|
public function key() |
||||||
|
{ |
||||||
|
return key($this->container); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Move to the next position. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function next() |
||||||
|
{ |
||||||
|
return next($this->container); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check whether there are more elements to iterate. |
||||||
|
* |
||||||
|
* @return bool True if there are more elements to iterate. |
||||||
|
*/ |
||||||
|
public function valid() |
||||||
|
{ |
||||||
|
return key($this->container) !== null; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,67 @@ |
|||||||
|
<?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; |
||||||
|
|
||||||
|
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; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,118 @@ |
|||||||
|
<?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. |
||||||
|
|
||||||
|
/** |
||||||
|
* RepeatedField and RepeatedFieldIter are used by generated protocol message |
||||||
|
* classes to manipulate repeated fields. |
||||||
|
*/ |
||||||
|
|
||||||
|
namespace Google\Protobuf\Internal; |
||||||
|
|
||||||
|
/** |
||||||
|
* RepeatedFieldIter is used to iterate RepeatedField. It is also need for the |
||||||
|
* foreach syntax. |
||||||
|
*/ |
||||||
|
class RepeatedFieldIter implements \Iterator |
||||||
|
{ |
||||||
|
|
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
private $position; |
||||||
|
/** |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
private $container; |
||||||
|
|
||||||
|
/** |
||||||
|
* Create iterator instance for RepeatedField. |
||||||
|
* |
||||||
|
* @param RepeatedField The RepeatedField instance for which this iterator |
||||||
|
* is created. |
||||||
|
* @ignore |
||||||
|
*/ |
||||||
|
public function __construct($container) |
||||||
|
{ |
||||||
|
$this->position = 0; |
||||||
|
$this->container = $container; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reset the status of the iterator |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function rewind() |
||||||
|
{ |
||||||
|
$this->position = 0; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the element at the current position. |
||||||
|
* |
||||||
|
* @return object The element at the current position. |
||||||
|
*/ |
||||||
|
public function current() |
||||||
|
{ |
||||||
|
return $this->container[$this->position]; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the current position. |
||||||
|
* |
||||||
|
* @return integer The current position. |
||||||
|
*/ |
||||||
|
public function key() |
||||||
|
{ |
||||||
|
return $this->position; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Move to the next position. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function next() |
||||||
|
{ |
||||||
|
++$this->position; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check whether there are more elements to iterate. |
||||||
|
* |
||||||
|
* @return bool True if there are more elements to iterate. |
||||||
|
*/ |
||||||
|
public function valid() |
||||||
|
{ |
||||||
|
return isset($this->container[$this->position]); |
||||||
|
} |
||||||
|
} |
@ -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); |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue