diff options
Diffstat (limited to 'php/src/Google/Protobuf/Internal/Message.php')
-rw-r--r-- | php/src/Google/Protobuf/Internal/Message.php | 87 |
1 files changed, 56 insertions, 31 deletions
diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php index 8886e61a..c0a3218b 100644 --- a/php/src/Google/Protobuf/Internal/Message.php +++ b/php/src/Google/Protobuf/Internal/Message.php @@ -699,12 +699,25 @@ class Message switch ($field->getType()) { case GPBType::MESSAGE: $klass = $field->getMessageType()->getClass(); - if (!is_object($value) && !is_array($value)) { - throw new \Exception("Expect message."); - } $submsg = new $klass; - if (!is_null($value) && - $klass !== "Google\Protobuf\Any") { + + if ($field->isTimestamp()) { + if (!is_string($value)) { + throw new GPBDecodeException("Expect string."); + } + try { + $timestamp = GPBUtil::parseTimestamp($value); + } catch (\Exception $e) { + throw new GPBDecodeException("Invalid RFC 3339 timestamp: ".$e->getMessage()); + } + + $submsg->setSeconds($timestamp->getSeconds()); + $submsg->setNanos($timestamp->getNanos()); + } else if ($klass !== "Google\Protobuf\Any") { + if (!is_object($value) && !is_array($value)) { + throw new GPBDecodeException("Expect message."); + } + $submsg->mergeFromJsonArray($value); } return $submsg; @@ -1038,22 +1051,28 @@ class Message */ public function serializeToJsonStream(&$output) { - $output->writeRaw("{", 1); - $fields = $this->desc->getField(); - $first = true; - foreach ($fields as $field) { - if ($this->existField($field)) { - if ($first) { - $first = false; - } else { - $output->writeRaw(",", 1); - } - if (!$this->serializeFieldToJsonStream($output, $field)) { - return false; + if (get_class($this) === 'Google\Protobuf\Timestamp') { + $timestamp = GPBUtil::formatTimestamp($this); + $timestamp = json_encode($timestamp); + $output->writeRaw($timestamp, strlen($timestamp)); + } else { + $output->writeRaw("{", 1); + $fields = $this->desc->getField(); + $first = true; + foreach ($fields as $field) { + if ($this->existField($field)) { + if ($first) { + $first = false; + } else { + $output->writeRaw(",", 1); + } + if (!$this->serializeFieldToJsonStream($output, $field)) { + return false; + } } } + $output->writeRaw("}", 1); } - $output->writeRaw("}", 1); return true; } @@ -1341,6 +1360,7 @@ class Message private function fieldJsonByteSize($field) { $size = 0; + if ($field->isMap()) { $getter = $field->getGetter(); $values = $this->$getter(); @@ -1443,21 +1463,26 @@ class Message public function jsonByteSize() { $size = 0; - - // Size for "{}". - $size += 2; - - $fields = $this->desc->getField(); - $count = 0; - foreach ($fields as $field) { - $field_size = $this->fieldJsonByteSize($field); - $size += $field_size; - if ($field_size != 0) { - $count++; + if (get_class($this) === 'Google\Protobuf\Timestamp') { + $timestamp = GPBUtil::formatTimestamp($this); + $timestamp = json_encode($timestamp); + $size += strlen($timestamp); + } else { + // Size for "{}". + $size += 2; + + $fields = $this->desc->getField(); + $count = 0; + foreach ($fields as $field) { + $field_size = $this->fieldJsonByteSize($field); + $size += $field_size; + if ($field_size != 0) { + $count++; + } } + // size for comma + $size += $count > 0 ? ($count - 1) : 0; } - // size for comma - $size += $count > 0 ? ($count - 1) : 0; return $size; } } |