1<?php
2/**
3 * This file is part of FPDI
4 *
5 * @package   setasign\Fpdi
6 * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com)
7 * @license   http://opensource.org/licenses/mit-license The MIT License
8 */
9
10namespace setasign\Fpdi\PdfParser\Type;
11
12use setasign\Fpdi\PdfParser\PdfParser;
13use setasign\Fpdi\PdfParser\StreamReader;
14use setasign\Fpdi\PdfParser\Tokenizer;
15
16/**
17 * Class representing an indirect object
18 *
19 * @package setasign\Fpdi\PdfParser\Type
20 */
21class PdfIndirectObject extends PdfType
22{
23    /**
24     * Parses an indirect object from a tokenizer, parser and stream-reader.
25     *
26     * @param int $objectNumberToken
27     * @param int $objectGenerationNumberToken
28     * @param PdfParser $parser
29     * @param Tokenizer $tokenizer
30     * @param StreamReader $reader
31     * @return bool|self
32     * @throws PdfTypeException
33     */
34    public static function parse(
35        $objectNumberToken,
36        $objectGenerationNumberToken,
37        PdfParser $parser,
38        Tokenizer $tokenizer,
39        StreamReader $reader
40    ) {
41        $value = $parser->readValue();
42        if ($value === false) {
43            return false;
44        }
45
46        $nextToken = $tokenizer->getNextToken();
47        if ($nextToken === 'stream') {
48            $value = PdfStream::parse($value, $reader, $parser);
49        } elseif ($nextToken !== false) {
50            $tokenizer->pushStack($nextToken);
51        }
52
53        $v = new self;
54        $v->objectNumber = (int) $objectNumberToken;
55        $v->generationNumber = (int) $objectGenerationNumberToken;
56        $v->value = $value;
57
58        return $v;
59    }
60
61    /**
62     * Helper method to create an instance.
63     *
64     * @param int $objectNumber
65     * @param int $generationNumber
66     * @param PdfType $value
67     * @return self
68     */
69    public static function create($objectNumber, $generationNumber, PdfType $value)
70    {
71        $v = new self;
72        $v->objectNumber = (int) $objectNumber;
73        $v->generationNumber = (int) $generationNumber;
74        $v->value = $value;
75
76        return $v;
77    }
78
79    /**
80     * Ensures that the passed value is a PdfIndirectObject instance.
81     *
82     * @param mixed $indirectObject
83     * @return self
84     * @throws PdfTypeException
85     */
86    public static function ensure($indirectObject)
87    {
88        return PdfType::ensureType(self::class, $indirectObject, 'Indirect object expected.');
89    }
90
91    /**
92     * The object number.
93     *
94     * @var int
95     */
96    public $objectNumber;
97
98    /**
99     * The generation number.
100     *
101     * @var int
102     */
103    public $generationNumber;
104}
105