Commit e50ee3b65b96cc58a2d4b0a560e002889a510dd2

Authored by m-holger
Committed by GitHub
2 parents 778a9721 dbfdbd97

Merge pull request #1536 from m-holger/afdh3

Refactor: consolidate `field_to_annotations` and `field_to_name` maps…
libqpdf/QPDFAcroFormDocumentHelper.cc
... ... @@ -20,10 +20,15 @@ class QPDFAcroFormDocumentHelper::Members
20 20 Members(Members const&) = delete;
21 21 ~Members() = default;
22 22  
  23 + struct FieldData
  24 + {
  25 + std::vector<QPDFAnnotationObjectHelper> annotations;
  26 + std::string name;
  27 + };
  28 +
23 29 bool cache_valid{false};
24   - std::map<QPDFObjGen, std::vector<QPDFAnnotationObjectHelper>> field_to_annotations;
  30 + std::map<QPDFObjGen, FieldData> field_to;
25 31 std::map<QPDFObjGen, QPDFFormFieldObjectHelper> annotation_to_field;
26   - std::map<QPDFObjGen, std::string> field_to_name;
27 32 std::map<std::string, std::set<QPDFObjGen>> name_to_fields;
28 33 };
29 34  
... ... @@ -53,7 +58,7 @@ void
53 58 QPDFAcroFormDocumentHelper::invalidateCache()
54 59 {
55 60 m->cache_valid = false;
56   - m->field_to_annotations.clear();
  61 + m->field_to.clear();
57 62 m->annotation_to_field.clear();
58 63 }
59 64  
... ... @@ -151,20 +156,19 @@ QPDFAcroFormDocumentHelper::removeFormFields(std::set&lt;QPDFObjGen&gt; const&amp; to_remo
151 156 }
152 157  
153 158 for (auto const& og: to_remove) {
154   - auto annotations = m->field_to_annotations.find(og);
155   - if (annotations != m->field_to_annotations.end()) {
156   - for (auto aoh: annotations->second) {
  159 + auto it = m->field_to.find(og);
  160 + if (it != m->field_to.end()) {
  161 + for (auto aoh: it->second.annotations) {
157 162 m->annotation_to_field.erase(aoh.getObjectHandle().getObjGen());
158 163 }
159   - m->field_to_annotations.erase(og);
160   - }
161   - auto name = m->field_to_name.find(og);
162   - if (name != m->field_to_name.end()) {
163   - m->name_to_fields[name->second].erase(og);
164   - if (m->name_to_fields[name->second].empty()) {
165   - m->name_to_fields.erase(name->second);
  164 + auto const& name = it->second.name;
  165 + if (!name.empty()) {
  166 + m->name_to_fields[name].erase(og);
  167 + if (m->name_to_fields[name].empty()) {
  168 + m->name_to_fields.erase(name);
  169 + }
166 170 }
167   - m->field_to_name.erase(og);
  171 + m->field_to.erase(og);
168 172 }
169 173 }
170 174  
... ... @@ -193,8 +197,10 @@ QPDFAcroFormDocumentHelper::getFormFields()
193 197 {
194 198 analyze();
195 199 std::vector<QPDFFormFieldObjectHelper> result;
196   - for (auto const& iter: m->field_to_annotations) {
197   - result.emplace_back(qpdf.getObject(iter.first));
  200 + for (auto const& [og, data]: m->field_to) {
  201 + if (!(data.annotations.empty())) {
  202 + result.emplace_back(qpdf.getObject(og));
  203 + }
198 204 }
199 205 return result;
200 206 }
... ... @@ -217,8 +223,8 @@ QPDFAcroFormDocumentHelper::getAnnotationsForField(QPDFFormFieldObjectHelper h)
217 223 analyze();
218 224 std::vector<QPDFAnnotationObjectHelper> result;
219 225 QPDFObjGen og(h.getObjectHandle().getObjGen());
220   - if (m->field_to_annotations.contains(og)) {
221   - result = m->field_to_annotations[og];
  226 + if (m->field_to.contains(og)) {
  227 + result = m->field_to[og].annotations;
222 228 }
223 229 return result;
224 230 }
... ... @@ -308,7 +314,7 @@ QPDFAcroFormDocumentHelper::analyze()
308 314 "this widget annotation is not reachable from /AcroForm in the document "
309 315 "catalog");
310 316 m->annotation_to_field[og] = QPDFFormFieldObjectHelper(annot);
311   - m->field_to_annotations[og].emplace_back(annot);
  317 + m->field_to[og].annotations.emplace_back(annot);
312 318 }
313 319 }
314 320 }
... ... @@ -371,7 +377,7 @@ QPDFAcroFormDocumentHelper::traverseField(
371 377  
372 378 if (is_annotation) {
373 379 QPDFObjectHandle our_field = (is_field ? field : parent);
374   - m->field_to_annotations[our_field.getObjGen()].emplace_back(field);
  380 + m->field_to[our_field.getObjGen()].annotations.emplace_back(field);
375 381 m->annotation_to_field[og] = QPDFFormFieldObjectHelper(our_field);
376 382 }
377 383  
... ... @@ -379,13 +385,12 @@ QPDFAcroFormDocumentHelper::traverseField(
379 385 QPDFFormFieldObjectHelper foh(field);
380 386 auto f_og = field.getObjGen();
381 387 std::string name = foh.getFullyQualifiedName();
382   - auto old = m->field_to_name.find(f_og);
383   - if (old != m->field_to_name.end()) {
  388 + auto old = m->field_to.find(f_og);
  389 + if (old != m->field_to.end() && !old->second.name.empty()) {
384 390 // We might be updating after a name change, so remove any old information
385   - std::string old_name = old->second;
386   - m->name_to_fields[old_name].erase(f_og);
  391 + m->name_to_fields[old->second.name].erase(f_og);
387 392 }
388   - m->field_to_name[f_og] = name;
  393 + m->field_to[f_og].name = name;
389 394 m->name_to_fields[name].insert(f_og);
390 395 }
391 396 }
... ...