/** * Create a new RData object * * @param \LibDNS\Records\TypeDefinitions\TypeDefinition $typeDefinition * @return \LibDNS\Records\RData */ public function build(TypeDefinition $typeDefinition) { $rData = $this->rDataFactory->create($typeDefinition); foreach ($typeDefinition as $index => $type) { $rData->setField($index, $this->typeBuilder->build($type->getType())); } return $rData; }
/** * Decode a resource record * * @param \LibDNS\Decoder\DecodingContext $decodingContext * @return \LibDNS\Records\Resource * @throws \UnexpectedValueException When the record is invalid * @throws \InvalidArgumentException When a type subtype is unknown */ private function decodeResourceRecord(DecodingContext $decodingContext) { /** @var \LibDNS\Records\Types\DomainName $domainName */ $domainName = $this->typeBuilder->build(Types::DOMAIN_NAME); $this->decodeDomainName($decodingContext, $domainName); $meta = unpack('ntype/nclass/Nttl/nlength', $this->readDataFromPacket($decodingContext->getPacket(), 10)); $resource = $this->resourceBuilder->build($meta['type']); $resource->setName($domainName); $resource->setClass($meta['class']); $resource->setTTL($meta['ttl']); $data = $resource->getData(); $remainingLength = $meta['length']; $fieldDef = $index = null; foreach ($resource->getData()->getTypeDefinition() as $index => $fieldDef) { $field = $this->typeBuilder->build($fieldDef->getType()); $remainingLength -= $this->decodeType($decodingContext, $field, $remainingLength); $data->setField($index, $field); } if ($fieldDef->allowsMultiple()) { while ($remainingLength) { $field = $this->typeBuilder->build($fieldDef->getType()); $remainingLength -= $this->decodeType($decodingContext, $field, $remainingLength); $data->setField(++$index, $field); } } if ($remainingLength !== 0) { throw new \UnexpectedValueException('Decode error: Invalid length for record data section'); } return $resource; }