Coverage Report

Created: 2024-05-20 06:28

/src/qpdf/libqpdf/QPDFOutlineObjectHelper.cc
Line
Count
Source (jump to first uncovered line)
1
#include <qpdf/QPDFOutlineObjectHelper.hh>
2
3
#include <qpdf/QPDFOutlineDocumentHelper.hh>
4
#include <qpdf/QTC.hh>
5
6
QPDFOutlineObjectHelper::Members::Members(QPDFOutlineDocumentHelper& dh) :
7
    dh(dh)
8
4.22k
{
9
4.22k
}
10
11
QPDFOutlineObjectHelper::QPDFOutlineObjectHelper(
12
    QPDFObjectHandle oh, QPDFOutlineDocumentHelper& dh, int depth) :
13
    QPDFObjectHelper(oh),
14
    m(new Members(dh))
15
4.22k
{
16
4.22k
    if (depth > 50) {
17
        // Not exercised in test suite, but was tested manually by temporarily changing max depth
18
        // to 1.
19
0
        return;
20
0
    }
21
4.22k
    if (QPDFOutlineDocumentHelper::Accessor::checkSeen(m->dh, this->oh.getObjGen())) {
22
200
        QTC::TC("qpdf", "QPDFOutlineObjectHelper loop");
23
200
        return;
24
200
    }
25
26
4.02k
    QPDFObjectHandle cur = oh.getKey("/First");
27
6.76k
    while (!cur.isNull()) {
28
2.74k
        QPDFOutlineObjectHelper new_ooh(cur, dh, 1 + depth);
29
2.74k
        new_ooh.m->parent = std::make_shared<QPDFOutlineObjectHelper>(*this);
30
2.74k
        m->kids.push_back(new_ooh);
31
2.74k
        cur = cur.getKey("/Next");
32
2.74k
    }
33
4.02k
}
34
35
std::shared_ptr<QPDFOutlineObjectHelper>
36
QPDFOutlineObjectHelper::getParent()
37
0
{
38
0
    return m->parent;
39
0
}
40
41
std::vector<QPDFOutlineObjectHelper>
42
QPDFOutlineObjectHelper::getKids()
43
3.57k
{
44
3.57k
    return m->kids;
45
3.57k
}
46
47
QPDFObjectHandle
48
QPDFOutlineObjectHelper::getDest()
49
9.87k
{
50
9.87k
    QPDFObjectHandle dest;
51
9.87k
    QPDFObjectHandle A;
52
9.87k
    if (this->oh.hasKey("/Dest")) {
53
8.84k
        QTC::TC("qpdf", "QPDFOutlineObjectHelper direct dest");
54
8.84k
        dest = this->oh.getKey("/Dest");
55
8.84k
    } else if (
56
1.02k
        (A = this->oh.getKey("/A")).isDictionary() && A.getKey("/S").isName() &&
57
1.02k
        (A.getKey("/S").getName() == "/GoTo") && A.hasKey("/D")) {
58
544
        QTC::TC("qpdf", "QPDFOutlineObjectHelper action dest");
59
544
        dest = A.getKey("/D");
60
544
    }
61
9.87k
    if (!dest.isInitialized()) {
62
482
        dest = QPDFObjectHandle::newNull();
63
482
    }
64
65
9.87k
    if (dest.isName() || dest.isString()) {
66
6.55k
        QTC::TC("qpdf", "QPDFOutlineObjectHelper named dest");
67
6.55k
        dest = m->dh.resolveNamedDest(dest);
68
6.55k
    }
69
70
9.87k
    return dest;
71
9.87k
}
72
73
QPDFObjectHandle
74
QPDFOutlineObjectHelper::getDestPage()
75
9.87k
{
76
9.87k
    QPDFObjectHandle dest = getDest();
77
9.87k
    if ((dest.isArray()) && (dest.getArrayNItems() > 0)) {
78
2.85k
        return dest.getArrayItem(0);
79
2.85k
    }
80
7.01k
    return QPDFObjectHandle::newNull();
81
9.87k
}
82
83
int
84
QPDFOutlineObjectHelper::getCount()
85
0
{
86
0
    int count = 0;
87
0
    if (this->oh.hasKey("/Count")) {
88
0
        count = this->oh.getKey("/Count").getIntValueAsInt();
89
0
    }
90
0
    return count;
91
0
}
92
93
std::string
94
QPDFOutlineObjectHelper::getTitle()
95
0
{
96
0
    std::string result;
97
0
    if (this->oh.hasKey("/Title")) {
98
0
        result = this->oh.getKey("/Title").getUTF8Value();
99
0
    }
100
0
    return result;
101
0
}