diff options
Diffstat (limited to 'third_party/protobuf/php/src/Google/Protobuf/Internal/Message.php')
-rw-r--r-- | third_party/protobuf/php/src/Google/Protobuf/Internal/Message.php | 881 |
1 files changed, 0 insertions, 881 deletions
diff --git a/third_party/protobuf/php/src/Google/Protobuf/Internal/Message.php b/third_party/protobuf/php/src/Google/Protobuf/Internal/Message.php deleted file mode 100644 index 887c86ca6e..0000000000 --- a/third_party/protobuf/php/src/Google/Protobuf/Internal/Message.php +++ /dev/null @@ -1,881 +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. - -/** - * Defines Message, the parent class extended by all protocol message classes. - */ - -namespace Google\Protobuf\Internal; - -use Google\Protobuf\Internal\InputStream; -use Google\Protobuf\Internal\OutputStream; -use Google\Protobuf\Internal\DescriptorPool; -use Google\Protobuf\Internal\GPBLabel; -use Google\Protobuf\Internal\GPBType; -use Google\Protobuf\Internal\GPBWire; -use Google\Protobuf\Internal\MapEntry; -use Google\Protobuf\Internal\RepeatedField; - -/** - * Parent class of all proto messages. Users should not instantiate this class - * or extend this class or its child classes by their own. See the comment of - * specific functions for more details. - */ -class Message -{ - - /** - * @ignore - */ - private $desc; - - /** - * @ignore - */ - public function __construct($desc = NULL) - { - // MapEntry message is shared by all types of map fields, whose - // descriptors are different from each other. Thus, we cannot find a - // specific descriptor from the descriptor pool. - if (get_class($this) === 'Google\Protobuf\Internal\MapEntry') { - $this->desc = $desc; - return; - } - $pool = DescriptorPool::getGeneratedPool(); - $this->desc = $pool->getDescriptorByClassName(get_class($this)); - foreach ($this->desc->getField() as $field) { - $setter = $field->getSetter(); - if ($field->isMap()) { - $message_type = $field->getMessageType(); - $key_field = $message_type->getFieldByNumber(1); - $value_field = $message_type->getFieldByNumber(2); - switch ($value_field->getType()) { - case GPBType::MESSAGE: - case GPBType::GROUP: - $map_field = new MapField( - $key_field->getType(), - $value_field->getType(), - $value_field->getMessageType()->getClass()); - $this->$setter($map_field); - break; - case GPBType::ENUM: - $map_field = new MapField( - $key_field->getType(), - $value_field->getType(), - $value_field->getEnumType()->getClass()); - $this->$setter($map_field); - break; - default: - $map_field = new MapField( - $key_field->getType(), - $value_field->getType()); - $this->$setter($map_field); - break; - } - } else if ($field->getLabel() === GPBLabel::REPEATED) { - switch ($field->getType()) { - case GPBType::MESSAGE: - case GPBType::GROUP: - $repeated_field = new RepeatedField( - $field->getType(), - $field->getMessageType()->getClass()); - $this->$setter($repeated_field); - break; - case GPBType::ENUM: - $repeated_field = new RepeatedField( - $field->getType(), - $field->getEnumType()->getClass()); - $this->$setter($repeated_field); - break; - default: - $repeated_field = new RepeatedField($field->getType()); - $this->$setter($repeated_field); - break; - } - } else if ($field->getOneofIndex() !== -1) { - $oneof = $this->desc->getOneofDecl()[$field->getOneofIndex()]; - $oneof_name = $oneof->getName(); - $this->$oneof_name = new OneofField($oneof); - } else if ($field->getLabel() === GPBLabel::OPTIONAL && - PHP_INT_SIZE == 4) { - switch ($field->getType()) { - case GPBType::INT64: - case GPBType::UINT64: - case GPBType::FIXED64: - case GPBType::SFIXED64: - case GPBType::SINT64: - $this->$setter("0"); - } - } - } - } - - protected function readOneof($number) - { - $field = $this->desc->getFieldByNumber($number); - $oneof = $this->desc->getOneofDecl()[$field->getOneofIndex()]; - $oneof_name = $oneof->getName(); - $oneof_field = $this->$oneof_name; - if ($number === $oneof_field->getNumber()) { - return $oneof_field->getValue(); - } else { - return $this->defaultValue($field); - } - } - - protected function writeOneof($number, $value) - { - $field = $this->desc->getFieldByNumber($number); - $oneof = $this->desc->getOneofDecl()[$field->getOneofIndex()]; - $oneof_name = $oneof->getName(); - $oneof_field = $this->$oneof_name; - $oneof_field->setValue($value); - $oneof_field->setFieldName($field->getName()); - $oneof_field->setNumber($number); - } - - protected function whichOneof($oneof_name) - { - $oneof_field = $this->$oneof_name; - $number = $oneof_field->getNumber(); - if ($number == 0) { - return ""; - } - $field = $this->desc->getFieldByNumber($number); - return $field->getName(); - } - - /** - * @ignore - */ - private function defaultValue($field) - { - $value = null; - - switch ($field->getType()) { - case GPBType::DOUBLE: - case GPBType::FLOAT: - return 0.0; - case GPBType::UINT32: - case GPBType::INT32: - case GPBType::FIXED32: - case GPBType::SFIXED32: - case GPBType::SINT32: - case GPBType::ENUM: - return 0; - case GPBType::INT64: - case GPBType::UINT64: - case GPBType::FIXED64: - case GPBType::SFIXED64: - case GPBType::SINT64: - if (PHP_INT_SIZE === 4) { - return '0'; - } else { - return 0; - } - case GPBType::BOOL: - return false; - case GPBType::STRING: - case GPBType::BYTES: - return ""; - case GPBType::GROUP: - case GPBType::MESSAGE: - return null; - default: - user_error("Unsupported type."); - return false; - } - } - - /** - * @ignore - */ - private static function parseFieldFromStreamNoTag($input, $field, &$value) - { - switch ($field->getType()) { - case GPBType::DOUBLE: - if (!GPBWire::readDouble($input, $value)) { - return false; - } - break; - case GPBType::FLOAT: - if (!GPBWire::readFloat($input, $value)) { - return false; - } - break; - case GPBType::INT64: - if (!GPBWire::readInt64($input, $value)) { - return false; - } - break; - case GPBType::UINT64: - if (!GPBWire::readUint64($input, $value)) { - return false; - } - break; - case GPBType::INT32: - if (!GPBWire::readInt32($input, $value)) { - return false; - } - break; - case GPBType::FIXED64: - if (!GPBWire::readFixed64($input, $value)) { - return false; - } - break; - case GPBType::FIXED32: - if (!GPBWire::readFixed32($input, $value)) { - return false; - } - break; - case GPBType::BOOL: - if (!GPBWire::readBool($input, $value)) { - return false; - } - break; - case GPBType::STRING: - // TODO(teboring): Add utf-8 check. - if (!GPBWire::readString($input, $value)) { - return false; - } - break; - case GPBType::GROUP: - echo "GROUP\xA"; - trigger_error("Not implemented.", E_ERROR); - break; - case GPBType::MESSAGE: - if ($field->isMap()) { - $value = new MapEntry($field->getMessageType()); - } else { - $klass = $field->getMessageType()->getClass(); - $value = new $klass; - } - if (!GPBWire::readMessage($input, $value)) { - return false; - } - break; - case GPBType::BYTES: - if (!GPBWire::readString($input, $value)) { - return false; - } - break; - case GPBType::UINT32: - if (!GPBWire::readUint32($input, $value)) { - return false; - } - break; - case GPBType::ENUM: - // TODO(teboring): Check unknown enum value. - if (!GPBWire::readInt32($input, $value)) { - return false; - } - break; - case GPBType::SFIXED32: - if (!GPBWire::readSfixed32($input, $value)) { - return false; - } - break; - case GPBType::SFIXED64: - if (!GPBWire::readSfixed64($input, $value)) { - return false; - } - break; - case GPBType::SINT32: - if (!GPBWire::readSint32($input, $value)) { - return false; - } - break; - case GPBType::SINT64: - if (!GPBWire::readSint64($input, $value)) { - return false; - } - break; - default: - user_error("Unsupported type."); - return false; - } - return true; - } - - /** - * @ignore - */ - private function parseFieldFromStream($tag, $input, $field) - { - $value = null; - $field_type = $field->getType(); - - $value_format = GPBWire::UNKNOWN; - if (GPBWire::getTagWireType($tag) === - GPBWire::getWireType($field_type)) { - $value_format = GPBWire::NORMAL_FORMAT; - } elseif ($field->isPackable() && - GPBWire::getTagWireType($tag) === - GPBWire::WIRETYPE_LENGTH_DELIMITED) { - $value_format = GPBWire::PACKED_FORMAT; - } - - if ($value_format === GPBWire::NORMAL_FORMAT) { - if (!self::parseFieldFromStreamNoTag($input, $field, $value)) { - return false; - } - } elseif ($value_format === GPBWire::PACKED_FORMAT) { - $length = 0; - if (!GPBWire::readInt32($input, $length)) { - return false; - } - $limit = $input->pushLimit($length); - $getter = $field->getGetter(); - while ($input->bytesUntilLimit() > 0) { - if (!self::parseFieldFromStreamNoTag($input, $field, $value)) { - return false; - } - $this->$getter()[] = $value; - } - $input->popLimit($limit); - return true; - } else { - return false; - } - - if ($field->isMap()) { - $getter = $field->getGetter(); - $this->$getter()[$value->getKey()] = $value->getValue(); - } else if ($field->isRepeated()) { - $getter = $field->getGetter(); - $this->$getter()[] = $value; - } else { - $setter = $field->getSetter(); - $this->$setter($value); - } - - return true; - } - - /** - * Clear all containing fields. - * @return null. - */ - public function clear() - { - foreach ($this->desc->getField() as $field) { - $setter = $field->getSetter(); - if ($field->isMap()) { - $message_type = $field->getMessageType(); - $key_field = $message_type->getFieldByNumber(1); - $value_field = $message_type->getFieldByNumber(2); - switch ($value_field->getType()) { - case GPBType::MESSAGE: - case GPBType::GROUP: - $map_field = new MapField( - $key_field->getType(), - $value_field->getType(), - $value_field->getMessageType()->getClass()); - $this->$setter($map_field); - break; - case GPBType::ENUM: - $map_field = new MapField( - $key_field->getType(), - $value_field->getType(), - $value_field->getEnumType()->getClass()); - $this->$setter($map_field); - break; - default: - $map_field = new MapField( - $key_field->getType(), - $value_field->getType()); - $this->$setter($map_field); - break; - } - } else if ($field->getLabel() === GPBLabel::REPEATED) { - switch ($field->getType()) { - case GPBType::MESSAGE: - case GPBType::GROUP: - $repeated_field = new RepeatedField( - $field->getType(), - $field->getMessageType()->getClass()); - $this->$setter($repeated_field); - break; - case GPBType::ENUM: - $repeated_field = new RepeatedField( - $field->getType(), - $field->getEnumType()->getClass()); - $this->$setter($repeated_field); - break; - default: - $repeated_field = new RepeatedField($field->getType()); - $this->$setter($repeated_field); - break; - } - } else if ($field->getOneofIndex() !== -1) { - $oneof = $this->desc->getOneofDecl()[$field->getOneofIndex()]; - $oneof_name = $oneof->getName(); - $this->$oneof_name = new OneofField($oneof); - } else if ($field->getLabel() === GPBLabel::OPTIONAL) { - switch ($field->getType()) { - case GPBType::DOUBLE : - case GPBType::FLOAT : - $this->$setter(0.0); - break; - case GPBType::INT32 : - case GPBType::FIXED32 : - case GPBType::UINT32 : - case GPBType::SFIXED32 : - case GPBType::SINT32 : - case GPBType::ENUM : - $this->$setter(0); - break; - case GPBType::BOOL : - $this->$setter(false); - break; - case GPBType::STRING : - case GPBType::BYTES : - $this->$setter(""); - break; - case GPBType::GROUP : - case GPBType::MESSAGE : - $null = null; - $this->$setter($null); - break; - } - if (PHP_INT_SIZE == 4) { - switch ($field->getType()) { - case GPBType::INT64: - case GPBType::UINT64: - case GPBType::FIXED64: - case GPBType::SFIXED64: - case GPBType::SINT64: - $this->$setter("0"); - } - } else { - switch ($field->getType()) { - case GPBType::INT64: - case GPBType::UINT64: - case GPBType::FIXED64: - case GPBType::SFIXED64: - case GPBType::SINT64: - $this->$setter(0); - } - } - } - } - } - - /** - * Merges the contents of the specified message into current message. - * - * This method merges the contents of the specified message into the - * current message. Singular fields that are set in the specified message - * overwrite the corresponding fields in the current message. Repeated - * fields are appended. Map fields key-value pairs are overritten. - * Singular/Oneof sub-messages are recursively merged. All overritten - * sub-messages are deep-copied. - * - * @param object $msg Protobuf message to be merged from. - * @return null. - */ - public function mergeFrom($msg) - { - if (get_class($this) !== get_class($msg)) { - user_error("Cannot merge messages with different class."); - return; - } - - foreach ($this->desc->getField() as $field) { - $setter = $field->getSetter(); - $getter = $field->getGetter(); - if ($field->isMap()) { - if (count($msg->$getter()) != 0) { - $value_field = $field->getMessageType()->getFieldByNumber(2); - foreach ($msg->$getter() as $key => $value) { - if ($value_field->getType() == GPBType::MESSAGE) { - $klass = $value_field->getMessageType()->getClass(); - $copy = new $klass; - $copy->mergeFrom($value); - $this->$getter()[$key] = $copy; - } else { - $this->$getter()[$key] = $value; - } - } - } - } else if ($field->getLabel() === GPBLabel::REPEATED) { - if (count($msg->$getter()) != 0) { - foreach ($msg->$getter() as $tmp) { - if ($field->getType() == GPBType::MESSAGE) { - $klass = $field->getMessageType()->getClass(); - $copy = new $klass; - $copy->mergeFrom($tmp); - $this->$getter()[] = $copy; - } else { - $this->$getter()[] = $tmp; - } - } - } - } else if ($field->getLabel() === GPBLabel::OPTIONAL) { - if($msg->$getter() !== $this->defaultValue($field)) { - $tmp = $msg->$getter(); - if ($field->getType() == GPBType::MESSAGE) { - if (is_null($this->$getter())) { - $klass = $field->getMessageType()->getClass(); - $new_msg = new $klass; - $this->$setter($new_msg); - } - $this->$getter()->mergeFrom($tmp); - } else { - $this->$setter($tmp); - } - } - } - } - } - - /** - * Parses a protocol buffer contained in a string. - * - * This function takes a string in the (non-human-readable) binary wire - * format, matching the encoding output by serializeToString(). - * See mergeFrom() for merging behavior, if the field is already set in the - * specified message. - * - * @param string $data Binary protobuf data. - * @return bool Return true on success. - */ - public function mergeFromString($data) - { - $input = new InputStream($data); - $this->parseFromStream($input); - } - - /** - * @ignore - */ - public function parseFromStream($input) - { - while (true) { - $tag = $input->readTag(); - // End of input. This is a valid place to end, so return true. - if ($tag === 0) { - return true; - } - - $number = GPBWire::getTagFieldNumber($tag); - $field = $this->desc->getFieldByNumber($number); - - // Check whether we retrieved a known field - if ($field === NULL) { - continue; - } - - if (!$this->parseFieldFromStream($tag, $input, $field)) { - return false; - } - } - } - - /** - * @ignore - */ - private function serializeSingularFieldToStream($field, &$output) - { - if (!$this->existField($field)) { - return true; - } - $getter = $field->getGetter(); - $value = $this->$getter(); - if (!GPBWire::serializeFieldToStream($value, $field, true, $output)) { - return false; - } - return true; - } - - /** - * @ignore - */ - private function serializeRepeatedFieldToStream($field, &$output) - { - $getter = $field->getGetter(); - $values = $this->$getter(); - $count = count($values); - if ($count === 0) { - return true; - } - - $packed = $field->getPacked(); - if ($packed) { - if (!GPBWire::writeTag( - $output, - GPBWire::makeTag($field->getNumber(), GPBType::STRING))) { - return false; - } - $size = 0; - foreach ($values as $value) { - $size += $this->fieldDataOnlyByteSize($field, $value); - } - if (!$output->writeVarint32($size)) { - return false; - } - } - - foreach ($values as $value) { - if (!GPBWire::serializeFieldToStream( - $value, - $field, - !$packed, - $output)) { - return false; - } - } - return true; - } - - /** - * @ignore - */ - private function serializeMapFieldToStream($field, $output) - { - $getter = $field->getGetter(); - $values = $this->$getter(); - $count = count($values); - if ($count === 0) { - return true; - } - - foreach ($values as $key => $value) { - $map_entry = new MapEntry($field->getMessageType()); - $map_entry->setKey($key); - $map_entry->setValue($value); - if (!GPBWire::serializeFieldToStream( - $map_entry, - $field, - true, - $output)) { - return false; - } - } - return true; - } - - /** - * @ignore - */ - private function serializeFieldToStream(&$output, $field) - { - if ($field->isMap()) { - return $this->serializeMapFieldToStream($field, $output); - } elseif ($field->isRepeated()) { - return $this->serializeRepeatedFieldToStream($field, $output); - } else { - return $this->serializeSingularFieldToStream($field, $output); - } - } - - /** - * @ignore - */ - public function serializeToStream(&$output) - { - $fields = $this->desc->getField(); - foreach ($fields as $field) { - if (!$this->serializeFieldToStream($output, $field)) { - return false; - } - } - return true; - } - - /** - * Serialize the message to string. - * @return string Serialized binary protobuf data. - */ - public function serializeToString() - { - $output = new OutputStream($this->byteSize()); - $this->serializeToStream($output); - return $output->getData(); - } - - /** - * @ignore - */ - private function existField($field) - { - $getter = $field->getGetter(); - $value = $this->$getter(); - return $value !== $this->defaultValue($field); - } - - /** - * @ignore - */ - private function repeatedFieldDataOnlyByteSize($field) - { - $size = 0; - - $getter = $field->getGetter(); - $values = $this->$getter(); - $count = count($values); - if ($count !== 0) { - $size += $count * GPBWire::tagSize($field); - foreach ($values as $value) { - $size += $this->singularFieldDataOnlyByteSize($field); - } - } - } - - /** - * @ignore - */ - private function fieldDataOnlyByteSize($field, $value) - { - $size = 0; - - switch ($field->getType()) { - case GPBType::BOOL: - $size += 1; - break; - case GPBType::FLOAT: - case GPBType::FIXED32: - case GPBType::SFIXED32: - $size += 4; - break; - case GPBType::DOUBLE: - case GPBType::FIXED64: - case GPBType::SFIXED64: - $size += 8; - break; - case GPBType::INT32: - case GPBType::ENUM: - $size += GPBWire::varint32Size($value, true); - break; - case GPBType::UINT32: - $size += GPBWire::varint32Size($value); - break; - case GPBType::UINT64: - case GPBType::INT64: - $size += GPBWire::varint64Size($value); - break; - case GPBType::SINT32: - $size += GPBWire::sint32Size($value); - break; - case GPBType::SINT64: - $size += GPBWire::sint64Size($value); - break; - case GPBType::STRING: - case GPBType::BYTES: - $size += strlen($value); - $size += GPBWire::varint32Size($size); - break; - case GPBType::MESSAGE: - $size += $value->byteSize(); - $size += GPBWire::varint32Size($size); - break; - case GPBType::GROUP: - // TODO(teboring): Add support. - user_error("Unsupported type."); - break; - default: - user_error("Unsupported type."); - return 0; - } - - return $size; - } - - /** - * @ignore - */ - private function fieldByteSize($field) - { - $size = 0; - if ($field->isMap()) { - $getter = $field->getGetter(); - $values = $this->$getter(); - $count = count($values); - if ($count !== 0) { - $size += $count * GPBWire::tagSize($field); - $message_type = $field->getMessageType(); - $key_field = $message_type->getFieldByNumber(1); - $value_field = $message_type->getFieldByNumber(2); - foreach ($values as $key => $value) { - $data_size = 0; - $data_size += $this->fieldDataOnlyByteSize($key_field, $key); - $data_size += $this->fieldDataOnlyByteSize( - $value_field, - $value); - $data_size += GPBWire::tagSize($key_field); - $data_size += GPBWire::tagSize($value_field); - $size += GPBWire::varint32Size($data_size) + $data_size; - } - } - } elseif ($field->isRepeated()) { - $getter = $field->getGetter(); - $values = $this->$getter(); - $count = count($values); - if ($count !== 0) { - if ($field->getPacked()) { - $data_size = 0; - foreach ($values as $value) { - $data_size += $this->fieldDataOnlyByteSize($field, $value); - } - $size += GPBWire::tagSize($field); - $size += GPBWire::varint32Size($data_size); - $size += $data_size; - } else { - $size += $count * GPBWire::tagSize($field); - foreach ($values as $value) { - $size += $this->fieldDataOnlyByteSize($field, $value); - } - } - } - } elseif ($this->existField($field)) { - $size += GPBWire::tagSize($field); - $getter = $field->getGetter(); - $value = $this->$getter(); - $size += $this->fieldDataOnlyByteSize($field, $value); - } - return $size; - } - - /** - * @ignore - */ - public function byteSize() - { - $size = 0; - - $fields = $this->desc->getField(); - foreach ($fields as $field) { - $size += $this->fieldByteSize($field); - } - return $size; - } -} |