/**
  * Creates \Google\Protobuf\FileDescriptorProto object from serialized Protocol Buffers message.
  *
  * @param string $input
  * @param FileDescriptorProto $object
  * @param int $start
  * @param int $end
  *
  * @throws \Exception
  *
  * @return FileDescriptorProto
  */
 public static function fromProtobuf($input, $object = NULL, &$start = 0, $end = NULL)
 {
     if ($object === null) {
         $object = new FileDescriptorProto();
     }
     if ($end === null) {
         $end = strlen($input);
     }
     while ($start < $end) {
         $tag = Binary::decodeVarint($input, $start);
         $wireType = $tag & 0x7;
         $number = $tag >> 3;
         switch ($number) {
             case 1:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->name = substr($input, $start, $length);
                 $start += $length;
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 2:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->package = substr($input, $start, $length);
                 $start += $length;
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 3:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->dependency) && is_array($object->dependency))) {
                     $object->dependency = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->dependency[] = substr($input, $start, $length);
                 $start += $length;
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 10:
                 if ($wireType !== 0) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 0.', $number);
                 }
                 if (!(isset($object->publicDependency) && is_array($object->publicDependency))) {
                     $object->publicDependency = array();
                 }
                 $object->publicDependency[] = Binary::decodeVarint($input, $start);
                 break;
             case 11:
                 if ($wireType !== 0) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 0.', $number);
                 }
                 if (!(isset($object->weakDependency) && is_array($object->weakDependency))) {
                     $object->weakDependency = array();
                 }
                 $object->weakDependency[] = Binary::decodeVarint($input, $start);
                 break;
             case 4:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->messageType) && is_array($object->messageType))) {
                     $object->messageType = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->messageType[] = DescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 5:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->enumType) && is_array($object->enumType))) {
                     $object->enumType = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->enumType[] = EnumDescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 6:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->service) && is_array($object->service))) {
                     $object->service = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->service[] = ServiceDescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 7:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->extension) && is_array($object->extension))) {
                     $object->extension = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->extension[] = FieldDescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 8:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->options = FileOptionsMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 9:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->sourceCodeInfo = SourceCodeInfoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 12:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->syntax = substr($input, $start, $length);
                 $start += $length;
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             default:
                 switch ($wireType) {
                     case 0:
                         Binary::decodeVarint($input, $start);
                         break;
                     case 1:
                         $start += 8;
                         break;
                     case 2:
                         $start += Binary::decodeVarint($input, $start);
                         break;
                     case 5:
                         $start += 4;
                         break;
                     default:
                         throw new ProtobufException('Unexpected wire type ' . $wireType . '.', $number);
                 }
         }
     }
     return $object;
 }
Esempio n. 2
0
 /**
  * Creates \Google\Protobuf\DescriptorProto object from serialized Protocol Buffers message.
  *
  * @param string $input
  * @param DescriptorProto $object
  * @param int $start
  * @param int $end
  *
  * @throws \Exception
  *
  * @return DescriptorProto
  */
 public static function fromProtobuf($input, $object = NULL, &$start = 0, $end = NULL)
 {
     if ($object === null) {
         $object = new DescriptorProto();
     }
     if ($end === null) {
         $end = strlen($input);
     }
     while ($start < $end) {
         $tag = Binary::decodeVarint($input, $start);
         $wireType = $tag & 0x7;
         $number = $tag >> 3;
         switch ($number) {
             case 1:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->name = substr($input, $start, $length);
                 $start += $length;
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 2:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->field) && is_array($object->field))) {
                     $object->field = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->field[] = FieldDescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 6:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->extension) && is_array($object->extension))) {
                     $object->extension = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->extension[] = FieldDescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 3:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->nestedType) && is_array($object->nestedType))) {
                     $object->nestedType = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->nestedType[] = DescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 4:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->enumType) && is_array($object->enumType))) {
                     $object->enumType = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->enumType[] = EnumDescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 5:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->extensionRange) && is_array($object->extensionRange))) {
                     $object->extensionRange = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->extensionRange[] = ExtensionRangeMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 8:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->oneofDecl) && is_array($object->oneofDecl))) {
                     $object->oneofDecl = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->oneofDecl[] = OneofDescriptorProtoMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 7:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->options = MessageOptionsMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 9:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->reservedRange) && is_array($object->reservedRange))) {
                     $object->reservedRange = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->reservedRange[] = ReservedRangeMeta::fromProtobuf($input, null, $start, $start + $length);
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             case 10:
                 if ($wireType !== 2) {
                     throw new ProtobufException('Unexpected wire type ' . $wireType . ', expected 2.', $number);
                 }
                 if (!(isset($object->reservedName) && is_array($object->reservedName))) {
                     $object->reservedName = array();
                 }
                 $length = Binary::decodeVarint($input, $start);
                 $expectedStart = $start + $length;
                 if ($expectedStart > $end) {
                     throw new ProtobufException('Not enough data.');
                 }
                 $object->reservedName[] = substr($input, $start, $length);
                 $start += $length;
                 if ($start !== $expectedStart) {
                     throw new ProtobufException('Unexpected start. Expected ' . $expectedStart . ', got ' . $start . '.', $number);
                 }
                 break;
             default:
                 switch ($wireType) {
                     case 0:
                         Binary::decodeVarint($input, $start);
                         break;
                     case 1:
                         $start += 8;
                         break;
                     case 2:
                         $start += Binary::decodeVarint($input, $start);
                         break;
                     case 5:
                         $start += 4;
                         break;
                     default:
                         throw new ProtobufException('Unexpected wire type ' . $wireType . '.', $number);
                 }
         }
     }
     return $object;
 }