Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
cpdf_object_walker.cpp
Go to the documentation of this file.
1
// Copyright 2017 The PDFium Authors
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
#
include
"core/fpdfapi/parser/cpdf_object_walker.h"
6
7
#
include
<
utility
>
8
9
#
include
"core/fpdfapi/parser/cpdf_array.h"
10
#
include
"core/fpdfapi/parser/cpdf_dictionary.h"
11
#
include
"core/fpdfapi/parser/cpdf_stream.h"
12
#
include
"core/fxcrt/check.h"
13
14
namespace
{
15
16
class
StreamIterator
final
:
public
CPDF_ObjectWalker
::
SubobjectIterator
{
17
public
:
18
explicit
StreamIterator(
RetainPtr
<
const
CPDF_Stream> stream)
19
:
SubobjectIterator
(
std
::move(stream)) {}
20
21
~StreamIterator()
override
=
default
;
22
23
bool
IsFinished()
const
override
{
return
IsStarted
() && is_finished_; }
24
25
RetainPtr
<
const
CPDF_Object
> IncrementImpl()
override
{
26
DCHECK
(IsStarted());
27
DCHECK
(!IsFinished());
28
is_finished_ =
true
;
29
return
object
()->GetDict();
30
}
31
32
void
Start()
override
{}
33
34
private
:
35
bool
is_finished_ =
false
;
36
};
37
38
class
DictionaryIterator
final
:
public
CPDF_ObjectWalker
::
SubobjectIterator
{
39
public
:
40
explicit
DictionaryIterator(
RetainPtr
<
const
CPDF_Dictionary
> dictionary)
41
:
SubobjectIterator
(dictionary), locker_(dictionary) {}
42
43
~DictionaryIterator()
override
=
default
;
44
45
bool
IsFinished()
const
override
{
46
return
IsStarted() && dict_iterator_ == locker_.end();
47
}
48
49
RetainPtr
<
const
CPDF_Object
> IncrementImpl()
override
{
50
DCHECK
(IsStarted());
51
DCHECK
(!IsFinished());
52
RetainPtr
<
const
CPDF_Object
> result = dict_iterator_->second;
53
dict_key_ = dict_iterator_->first;
54
++dict_iterator_;
55
return
result;
56
}
57
58
void
Start()
override
{
59
DCHECK
(!IsStarted());
60
dict_iterator_ = locker_.begin();
61
}
62
63
ByteString
dict_key()
const
{
return
dict_key_; }
64
65
private
:
66
CPDF_Dictionary::const_iterator dict_iterator_;
67
CPDF_DictionaryLocker
locker_;
68
ByteString
dict_key_;
69
};
70
71
class
ArrayIterator
final
:
public
CPDF_ObjectWalker
::
SubobjectIterator
{
72
public
:
73
explicit
ArrayIterator(
RetainPtr
<
const
CPDF_Array
> array)
74
:
SubobjectIterator
(array), locker_(array) {}
75
76
~ArrayIterator()
override
=
default
;
77
78
bool
IsFinished()
const
override
{
79
return
IsStarted() && arr_iterator_ == locker_.end();
80
}
81
82
RetainPtr
<
const
CPDF_Object
> IncrementImpl()
override
{
83
DCHECK
(IsStarted());
84
DCHECK
(!IsFinished());
85
RetainPtr
<
const
CPDF_Object
> result = *arr_iterator_;
86
++arr_iterator_;
87
return
result;
88
}
89
90
void
Start()
override
{ arr_iterator_ = locker_.begin(); }
91
92
public
:
93
CPDF_Array::const_iterator arr_iterator_;
94
CPDF_ArrayLocker
locker_;
95
};
96
97
}
// namespace
98
99
CPDF_ObjectWalker
::
SubobjectIterator
::~
SubobjectIterator
() =
default
;
100
101
RetainPtr
<
const
CPDF_Object
>
CPDF_ObjectWalker
::
SubobjectIterator
::
Increment
() {
102
if
(!
IsStarted
(
)
) {
103
Start
(
)
;
104
is_started_ =
true
;
105
}
106
while
(!
IsFinished
(
)
) {
107
RetainPtr
<
const
CPDF_Object
> result = IncrementImpl();
108
if
(result)
109
return
result;
110
}
111
return
nullptr
;
112
}
113
114
CPDF_ObjectWalker
::
SubobjectIterator
::
SubobjectIterator
(
115
RetainPtr
<
const
CPDF_Object
> object)
116
:
object_
(
std
::
move
(
object
)) {
117
DCHECK
(object_);
118
}
119
120
// static
121
std::unique_ptr<CPDF_ObjectWalker::SubobjectIterator>
122
CPDF_ObjectWalker
::MakeIterator(
RetainPtr
<
const
CPDF_Object
> object) {
123
if
(object->IsStream())
124
return
std
::make_unique<StreamIterator>(ToStream(object));
125
if
(object->IsDictionary())
126
return
std
::make_unique<DictionaryIterator>(ToDictionary(object));
127
if
(object->IsArray())
128
return
std
::make_unique<ArrayIterator>(ToArray(object));
129
return
nullptr
;
130
}
131
132
CPDF_ObjectWalker
::
CPDF_ObjectWalker
(
RetainPtr
<
const
CPDF_Object
> root)
133
:
next_object_
(
std
::
move
(
root
)) {}
134
135
CPDF_ObjectWalker
::~
CPDF_ObjectWalker
() =
default
;
136
137
RetainPtr
<
const
CPDF_Object
>
CPDF_ObjectWalker
::
GetNext
() {
138
while
(!stack_.empty() || next_object_) {
139
if
(next_object_) {
140
auto
new_iterator = MakeIterator(next_object_);
141
if
(new_iterator) {
142
// Schedule walk within composite objects.
143
stack_.push(std::move(new_iterator));
144
}
145
return
std
::move(next_object_);
// next_object_ is NULL after move.
146
}
147
148
SubobjectIterator
* it = stack_.top().get();
149
if
(it
->
IsFinished
(
)
) {
150
stack_.pop();
151
}
else
{
152
next_object_ = it->Increment();
153
parent_object_.Reset(it->object());
154
dict_key_ = parent_object_->IsDictionary()
155
?
static_cast
<DictionaryIterator*>(it)->dict_key()
156
: ByteString();
157
current_depth_ = stack_.size();
158
}
159
}
160
dict_key_ = ByteString();
161
current_depth_ = 0;
162
return
nullptr
;
163
}
164
165
void
CPDF_ObjectWalker
::
SkipWalkIntoCurrentObject
() {
166
if
(stack_.empty() || stack_.top()->IsStarted())
167
return
;
168
stack_.pop();
169
}
170
171
CPDF_NonConstObjectWalker::
CPDF_NonConstObjectWalker
(
172
RetainPtr
<
CPDF_Object
> root)
173
:
CPDF_ObjectWalker
(
std
::move(root)) {}
174
175
RetainPtr
<
CPDF_Object
> CPDF_NonConstObjectWalker::
GetNext
() {
176
return
pdfium
::WrapRetain(
177
const_cast
<CPDF_Object*>(CPDF_ObjectWalker::GetNext().Get()));
178
}
ByteString
fxcrt::ByteString ByteString
Definition
bytestring.h:180
DCHECK
#define DCHECK
Definition
check.h:33
CPDF_ArrayLocker
Definition
cpdf_array.h:175
CPDF_Array::const_iterator
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
Definition
cpdf_array.h:29
CPDF_DictionaryLocker
Definition
cpdf_dictionary.h:157
CPDF_Dictionary::DictMap
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
Definition
cpdf_dictionary.h:31
CPDF_NonConstObjectWalker::GetNext
RetainPtr< CPDF_Object > GetNext()
Definition
cpdf_object_walker.cpp:175
CPDF_NonConstObjectWalker::CPDF_NonConstObjectWalker
CPDF_NonConstObjectWalker(RetainPtr< CPDF_Object > root)
Definition
cpdf_object_walker.cpp:171
CPDF_ObjectWalker::SubobjectIterator
Definition
cpdf_object_walker.h:20
CPDF_ObjectWalker::SubobjectIterator::IsFinished
virtual bool IsFinished() const =0
CPDF_ObjectWalker::SubobjectIterator::object
const CPDF_Object * object() const
Definition
cpdf_object_walker.h:26
CPDF_ObjectWalker::SubobjectIterator::Start
virtual void Start()=0
CPDF_ObjectWalker::SubobjectIterator::~SubobjectIterator
virtual ~SubobjectIterator()
CPDF_ObjectWalker::SubobjectIterator::SubobjectIterator
SubobjectIterator(RetainPtr< const CPDF_Object > object)
Definition
cpdf_object_walker.cpp:114
CPDF_ObjectWalker::SubobjectIterator::IsStarted
bool IsStarted() const
Definition
cpdf_object_walker.h:24
CPDF_ObjectWalker::SubobjectIterator::Increment
RetainPtr< const CPDF_Object > Increment()
Definition
cpdf_object_walker.cpp:101
CPDF_ObjectWalker
Definition
cpdf_object_walker.h:18
CPDF_ObjectWalker::~CPDF_ObjectWalker
~CPDF_ObjectWalker()
CPDF_ObjectWalker::CPDF_ObjectWalker
CPDF_ObjectWalker(RetainPtr< const CPDF_Object > root)
Definition
cpdf_object_walker.cpp:132
CPDF_ObjectWalker::GetNext
RetainPtr< const CPDF_Object > GetNext()
Definition
cpdf_object_walker.cpp:137
CPDF_ObjectWalker::SkipWalkIntoCurrentObject
void SkipWalkIntoCurrentObject()
Definition
cpdf_object_walker.cpp:165
CPDF_Object
Definition
cpdf_object.h:50
fxcrt::RetainPtr
Definition
retain_ptr.h:28
pdfium::CFDETextOutLargeBitmapTest
Definition
cfde_textout_unittest.cpp:117
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
qtwebengine
src
3rdparty
chromium
third_party
pdfium
core
fpdfapi
parser
cpdf_object_walker.cpp
Generated on
for Qt by
1.18.0