Commit 21b7481b0e6a47665eb9a804c34470d85d3c7f93

Authored by Jay Berkenbilt
1 parent e410b0fe

Push members of QPDFObjectHandle into a Members object

As in other cases, this is to enable adding new member variables in
the future without breaking ABI compatibility.
include/qpdf/QPDFObjectHandle.hh
... ... @@ -111,6 +111,7 @@ class QPDFObjectHandle
111 111 {
112 112 }
113 113 virtual void handleToken(QPDFTokenizer::Token const&) = 0;
  114 + QPDF_DLL
114 115 virtual void handleEOF();
115 116  
116 117 class PipelineAccessor
... ... @@ -175,6 +176,11 @@ class QPDFObjectHandle
175 176 QPDF_DLL
176 177 QPDFObjectHandle();
177 178 QPDF_DLL
  179 + QPDFObjectHandle(QPDFObjectHandle const&);
  180 + QPDF_DLL
  181 + QPDFObjectHandle&
  182 + operator=(QPDFObjectHandle const&);
  183 + QPDF_DLL
178 184 bool isInitialized() const;
179 185  
180 186 // Return type code and type name of underlying object. These are
... ... @@ -743,7 +749,7 @@ class QPDFObjectHandle
743 749 static PointerHolder<QPDFObject> getObject(QPDFObjectHandle& o)
744 750 {
745 751 o.dereference();
746   - return o.obj;
  752 + return o.m->obj;
747 753 }
748 754 };
749 755 friend class ObjAccessor;
... ... @@ -847,13 +853,28 @@ class QPDFObjectHandle
847 853 std::string const& description, std::string& all_description);
848 854 static void warn(QPDF*, QPDFExc const&);
849 855  
850   - bool initialized;
  856 + class Members
  857 + {
  858 + friend class QPDFObjectHandle;
851 859  
852   - QPDF* qpdf; // 0 for direct object
853   - int objid; // 0 for direct object
854   - int generation;
855   - PointerHolder<QPDFObject> obj;
856   - bool reserved;
  860 + public:
  861 + QPDF_DLL
  862 + ~Members();
  863 +
  864 + private:
  865 + Members();
  866 + Members(QPDF* qpdf, int objid, int generation);
  867 + Members(QPDFObject* data);
  868 +
  869 + bool initialized;
  870 +
  871 + QPDF* qpdf; // 0 for direct object
  872 + int objid; // 0 for direct object
  873 + int generation;
  874 + PointerHolder<QPDFObject> obj;
  875 + bool reserved;
  876 + };
  877 + PointerHolder<Members> m;
857 878 };
858 879  
859 880 #endif // __QPDFOBJECTHANDLE_HH__
... ...
libqpdf/QPDFObjectHandle.cc
... ... @@ -106,7 +106,11 @@ QPDFObjectHandle::ParserCallbacks::terminateParsing()
106 106 throw TerminateParsing();
107 107 }
108 108  
109   -QPDFObjectHandle::QPDFObjectHandle() :
  109 +QPDFObjectHandle::Members::~Members()
  110 +{
  111 +}
  112 +
  113 +QPDFObjectHandle::Members::Members() :
110 114 initialized(false),
111 115 qpdf(0),
112 116 objid(0),
... ... @@ -115,7 +119,7 @@ QPDFObjectHandle::QPDFObjectHandle() :
115 119 {
116 120 }
117 121  
118   -QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, int objid, int generation) :
  122 +QPDFObjectHandle::Members::Members(QPDF* qpdf, int objid, int generation) :
119 123 initialized(true),
120 124 qpdf(qpdf),
121 125 objid(objid),
... ... @@ -124,7 +128,7 @@ QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, int objid, int generation) :
124 128 {
125 129 }
126 130  
127   -QPDFObjectHandle::QPDFObjectHandle(QPDFObject* data) :
  131 +QPDFObjectHandle::Members::Members(QPDFObject* data) :
128 132 initialized(true),
129 133 qpdf(0),
130 134 objid(0),
... ... @@ -134,6 +138,38 @@ QPDFObjectHandle::QPDFObjectHandle(QPDFObject* data) :
134 138 {
135 139 }
136 140  
  141 +
  142 +QPDFObjectHandle::QPDFObjectHandle() :
  143 + m(new Members)
  144 +{
  145 +}
  146 +
  147 +QPDFObjectHandle::QPDFObjectHandle(QPDFObjectHandle const& rhs) :
  148 + m(new Members)
  149 +{
  150 + *m = *rhs.m;
  151 +}
  152 +
  153 +QPDFObjectHandle&
  154 +QPDFObjectHandle::operator=(QPDFObjectHandle const& rhs)
  155 +{
  156 + if (this != &rhs)
  157 + {
  158 + *m = *rhs.m;
  159 + }
  160 + return *this;
  161 +}
  162 +
  163 +QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, int objid, int generation) :
  164 + m(new Members(qpdf, objid, generation))
  165 +{
  166 +}
  167 +
  168 +QPDFObjectHandle::QPDFObjectHandle(QPDFObject* data) :
  169 + m(new Members(data))
  170 +{
  171 +}
  172 +
137 173 void
138 174 QPDFObjectHandle::releaseResolved()
139 175 {
... ... @@ -143,30 +179,30 @@ QPDFObjectHandle::releaseResolved()
143 179 // destruction. See comments in QPDF::~QPDF().
144 180 if (isIndirect())
145 181 {
146   - if (this->obj.getPointer())
  182 + if (this->m->obj.getPointer())
147 183 {
148   - this->obj = 0;
  184 + this->m->obj = 0;
149 185 }
150 186 }
151 187 else
152 188 {
153   - QPDFObject::ObjAccessor::releaseResolved(this->obj.getPointer());
  189 + QPDFObject::ObjAccessor::releaseResolved(this->m->obj.getPointer());
154 190 }
155 191 }
156 192  
157 193 bool
158 194 QPDFObjectHandle::isInitialized() const
159 195 {
160   - return this->initialized;
  196 + return this->m->initialized;
161 197 }
162 198  
163 199 QPDFObject::object_type_e
164 200 QPDFObjectHandle::getTypeCode()
165 201 {
166   - if (this->initialized)
  202 + if (this->m->initialized)
167 203 {
168 204 dereference();
169   - return obj->getTypeCode();
  205 + return this->m->obj->getTypeCode();
170 206 }
171 207 else
172 208 {
... ... @@ -177,10 +213,10 @@ QPDFObjectHandle::getTypeCode()
177 213 char const*
178 214 QPDFObjectHandle::getTypeName()
179 215 {
180   - if (this->initialized)
  216 + if (this->m->initialized)
181 217 {
182 218 dereference();
183   - return obj->getTypeName();
  219 + return this->m->obj->getTypeName();
184 220 }
185 221 else
186 222 {
... ... @@ -202,28 +238,28 @@ bool
202 238 QPDFObjectHandle::isBool()
203 239 {
204 240 dereference();
205   - return QPDFObjectTypeAccessor<QPDF_Bool>::check(obj.getPointer());
  241 + return QPDFObjectTypeAccessor<QPDF_Bool>::check(m->obj.getPointer());
206 242 }
207 243  
208 244 bool
209 245 QPDFObjectHandle::isNull()
210 246 {
211 247 dereference();
212   - return QPDFObjectTypeAccessor<QPDF_Null>::check(obj.getPointer());
  248 + return QPDFObjectTypeAccessor<QPDF_Null>::check(m->obj.getPointer());
213 249 }
214 250  
215 251 bool
216 252 QPDFObjectHandle::isInteger()
217 253 {
218 254 dereference();
219   - return QPDFObjectTypeAccessor<QPDF_Integer>::check(obj.getPointer());
  255 + return QPDFObjectTypeAccessor<QPDF_Integer>::check(m->obj.getPointer());
220 256 }
221 257  
222 258 bool
223 259 QPDFObjectHandle::isReal()
224 260 {
225 261 dereference();
226   - return QPDFObjectTypeAccessor<QPDF_Real>::check(obj.getPointer());
  262 + return QPDFObjectTypeAccessor<QPDF_Real>::check(m->obj.getPointer());
227 263 }
228 264  
229 265 bool
... ... @@ -255,49 +291,49 @@ bool
255 291 QPDFObjectHandle::isName()
256 292 {
257 293 dereference();
258   - return QPDFObjectTypeAccessor<QPDF_Name>::check(obj.getPointer());
  294 + return QPDFObjectTypeAccessor<QPDF_Name>::check(m->obj.getPointer());
259 295 }
260 296  
261 297 bool
262 298 QPDFObjectHandle::isString()
263 299 {
264 300 dereference();
265   - return QPDFObjectTypeAccessor<QPDF_String>::check(obj.getPointer());
  301 + return QPDFObjectTypeAccessor<QPDF_String>::check(m->obj.getPointer());
266 302 }
267 303  
268 304 bool
269 305 QPDFObjectHandle::isOperator()
270 306 {
271 307 dereference();
272   - return QPDFObjectTypeAccessor<QPDF_Operator>::check(obj.getPointer());
  308 + return QPDFObjectTypeAccessor<QPDF_Operator>::check(m->obj.getPointer());
273 309 }
274 310  
275 311 bool
276 312 QPDFObjectHandle::isInlineImage()
277 313 {
278 314 dereference();
279   - return QPDFObjectTypeAccessor<QPDF_InlineImage>::check(obj.getPointer());
  315 + return QPDFObjectTypeAccessor<QPDF_InlineImage>::check(m->obj.getPointer());
280 316 }
281 317  
282 318 bool
283 319 QPDFObjectHandle::isArray()
284 320 {
285 321 dereference();
286   - return QPDFObjectTypeAccessor<QPDF_Array>::check(obj.getPointer());
  322 + return QPDFObjectTypeAccessor<QPDF_Array>::check(m->obj.getPointer());
287 323 }
288 324  
289 325 bool
290 326 QPDFObjectHandle::isDictionary()
291 327 {
292 328 dereference();
293   - return QPDFObjectTypeAccessor<QPDF_Dictionary>::check(obj.getPointer());
  329 + return QPDFObjectTypeAccessor<QPDF_Dictionary>::check(m->obj.getPointer());
294 330 }
295 331  
296 332 bool
297 333 QPDFObjectHandle::isStream()
298 334 {
299 335 dereference();
300   - return QPDFObjectTypeAccessor<QPDF_Stream>::check(obj.getPointer());
  336 + return QPDFObjectTypeAccessor<QPDF_Stream>::check(m->obj.getPointer());
301 337 }
302 338  
303 339 bool
... ... @@ -305,14 +341,14 @@ QPDFObjectHandle::isReserved()
305 341 {
306 342 // dereference will clear reserved if this has been replaced
307 343 dereference();
308   - return this->reserved;
  344 + return this->m->reserved;
309 345 }
310 346  
311 347 bool
312 348 QPDFObjectHandle::isIndirect()
313 349 {
314 350 assertInitialized();
315   - return (this->objid != 0);
  351 + return (this->m->objid != 0);
316 352 }
317 353  
318 354 bool
... ... @@ -328,7 +364,7 @@ bool
328 364 QPDFObjectHandle::getBoolValue()
329 365 {
330 366 assertBool();
331   - return dynamic_cast<QPDF_Bool*>(obj.getPointer())->getVal();
  367 + return dynamic_cast<QPDF_Bool*>(m->obj.getPointer())->getVal();
332 368 }
333 369  
334 370 // Integer accessors
... ... @@ -337,7 +373,7 @@ long long
337 373 QPDFObjectHandle::getIntValue()
338 374 {
339 375 assertInteger();
340   - return dynamic_cast<QPDF_Integer*>(obj.getPointer())->getVal();
  376 + return dynamic_cast<QPDF_Integer*>(m->obj.getPointer())->getVal();
341 377 }
342 378  
343 379 // Real accessors
... ... @@ -346,7 +382,7 @@ std::string
346 382 QPDFObjectHandle::getRealValue()
347 383 {
348 384 assertReal();
349   - return dynamic_cast<QPDF_Real*>(obj.getPointer())->getVal();
  385 + return dynamic_cast<QPDF_Real*>(m->obj.getPointer())->getVal();
350 386 }
351 387  
352 388 // Name accessors
... ... @@ -355,7 +391,7 @@ std::string
355 391 QPDFObjectHandle::getName()
356 392 {
357 393 assertName();
358   - return dynamic_cast<QPDF_Name*>(obj.getPointer())->getName();
  394 + return dynamic_cast<QPDF_Name*>(m->obj.getPointer())->getName();
359 395 }
360 396  
361 397 // String accessors
... ... @@ -364,14 +400,14 @@ std::string
364 400 QPDFObjectHandle::getStringValue()
365 401 {
366 402 assertString();
367   - return dynamic_cast<QPDF_String*>(obj.getPointer())->getVal();
  403 + return dynamic_cast<QPDF_String*>(m->obj.getPointer())->getVal();
368 404 }
369 405  
370 406 std::string
371 407 QPDFObjectHandle::getUTF8Value()
372 408 {
373 409 assertString();
374   - return dynamic_cast<QPDF_String*>(obj.getPointer())->getUTF8Val();
  410 + return dynamic_cast<QPDF_String*>(m->obj.getPointer())->getUTF8Val();
375 411 }
376 412  
377 413 // Operator and Inline Image accessors
... ... @@ -380,14 +416,14 @@ std::string
380 416 QPDFObjectHandle::getOperatorValue()
381 417 {
382 418 assertOperator();
383   - return dynamic_cast<QPDF_Operator*>(obj.getPointer())->getVal();
  419 + return dynamic_cast<QPDF_Operator*>(m->obj.getPointer())->getVal();
384 420 }
385 421  
386 422 std::string
387 423 QPDFObjectHandle::getInlineImageValue()
388 424 {
389 425 assertInlineImage();
390   - return dynamic_cast<QPDF_InlineImage*>(obj.getPointer())->getVal();
  426 + return dynamic_cast<QPDF_InlineImage*>(m->obj.getPointer())->getVal();
391 427 }
392 428  
393 429 // Array accessors
... ... @@ -396,21 +432,21 @@ int
396 432 QPDFObjectHandle::getArrayNItems()
397 433 {
398 434 assertArray();
399   - return dynamic_cast<QPDF_Array*>(obj.getPointer())->getNItems();
  435 + return dynamic_cast<QPDF_Array*>(m->obj.getPointer())->getNItems();
400 436 }
401 437  
402 438 QPDFObjectHandle
403 439 QPDFObjectHandle::getArrayItem(int n)
404 440 {
405 441 assertArray();
406   - return dynamic_cast<QPDF_Array*>(obj.getPointer())->getItem(n);
  442 + return dynamic_cast<QPDF_Array*>(m->obj.getPointer())->getItem(n);
407 443 }
408 444  
409 445 std::vector<QPDFObjectHandle>
410 446 QPDFObjectHandle::getArrayAsVector()
411 447 {
412 448 assertArray();
413   - return dynamic_cast<QPDF_Array*>(obj.getPointer())->getAsVector();
  449 + return dynamic_cast<QPDF_Array*>(m->obj.getPointer())->getAsVector();
414 450 }
415 451  
416 452 // Array mutators
... ... @@ -419,35 +455,35 @@ void
419 455 QPDFObjectHandle::setArrayItem(int n, QPDFObjectHandle const& item)
420 456 {
421 457 assertArray();
422   - return dynamic_cast<QPDF_Array*>(obj.getPointer())->setItem(n, item);
  458 + return dynamic_cast<QPDF_Array*>(m->obj.getPointer())->setItem(n, item);
423 459 }
424 460  
425 461 void
426 462 QPDFObjectHandle::setArrayFromVector(std::vector<QPDFObjectHandle> const& items)
427 463 {
428 464 assertArray();
429   - return dynamic_cast<QPDF_Array*>(obj.getPointer())->setFromVector(items);
  465 + return dynamic_cast<QPDF_Array*>(m->obj.getPointer())->setFromVector(items);
430 466 }
431 467  
432 468 void
433 469 QPDFObjectHandle::insertItem(int at, QPDFObjectHandle const& item)
434 470 {
435 471 assertArray();
436   - return dynamic_cast<QPDF_Array*>(obj.getPointer())->insertItem(at, item);
  472 + return dynamic_cast<QPDF_Array*>(m->obj.getPointer())->insertItem(at, item);
437 473 }
438 474  
439 475 void
440 476 QPDFObjectHandle::appendItem(QPDFObjectHandle const& item)
441 477 {
442 478 assertArray();
443   - return dynamic_cast<QPDF_Array*>(obj.getPointer())->appendItem(item);
  479 + return dynamic_cast<QPDF_Array*>(m->obj.getPointer())->appendItem(item);
444 480 }
445 481  
446 482 void
447 483 QPDFObjectHandle::eraseItem(int at)
448 484 {
449 485 assertArray();
450   - return dynamic_cast<QPDF_Array*>(obj.getPointer())->eraseItem(at);
  486 + return dynamic_cast<QPDF_Array*>(m->obj.getPointer())->eraseItem(at);
451 487 }
452 488  
453 489 // Dictionary accessors
... ... @@ -456,28 +492,28 @@ bool
456 492 QPDFObjectHandle::hasKey(std::string const& key)
457 493 {
458 494 assertDictionary();
459   - return dynamic_cast<QPDF_Dictionary*>(obj.getPointer())->hasKey(key);
  495 + return dynamic_cast<QPDF_Dictionary*>(m->obj.getPointer())->hasKey(key);
460 496 }
461 497  
462 498 QPDFObjectHandle
463 499 QPDFObjectHandle::getKey(std::string const& key)
464 500 {
465 501 assertDictionary();
466   - return dynamic_cast<QPDF_Dictionary*>(obj.getPointer())->getKey(key);
  502 + return dynamic_cast<QPDF_Dictionary*>(m->obj.getPointer())->getKey(key);
467 503 }
468 504  
469 505 std::set<std::string>
470 506 QPDFObjectHandle::getKeys()
471 507 {
472 508 assertDictionary();
473   - return dynamic_cast<QPDF_Dictionary*>(obj.getPointer())->getKeys();
  509 + return dynamic_cast<QPDF_Dictionary*>(m->obj.getPointer())->getKeys();
474 510 }
475 511  
476 512 std::map<std::string, QPDFObjectHandle>
477 513 QPDFObjectHandle::getDictAsMap()
478 514 {
479 515 assertDictionary();
480   - return dynamic_cast<QPDF_Dictionary*>(obj.getPointer())->getAsMap();
  516 + return dynamic_cast<QPDF_Dictionary*>(m->obj.getPointer())->getAsMap();
481 517 }
482 518  
483 519 // Array and Name accessors
... ... @@ -508,7 +544,7 @@ QPDF*
508 544 QPDFObjectHandle::getOwningQPDF()
509 545 {
510 546 // Will be null for direct objects
511   - return this->qpdf;
  547 + return this->m->qpdf;
512 548 }
513 549  
514 550 // Dictionary mutators
... ... @@ -519,14 +555,14 @@ QPDFObjectHandle::replaceKey(std::string const&amp; key,
519 555 {
520 556 assertDictionary();
521 557 return dynamic_cast<QPDF_Dictionary*>(
522   - obj.getPointer())->replaceKey(key, value);
  558 + m->obj.getPointer())->replaceKey(key, value);
523 559 }
524 560  
525 561 void
526 562 QPDFObjectHandle::removeKey(std::string const& key)
527 563 {
528 564 assertDictionary();
529   - return dynamic_cast<QPDF_Dictionary*>(obj.getPointer())->removeKey(key);
  565 + return dynamic_cast<QPDF_Dictionary*>(m->obj.getPointer())->removeKey(key);
530 566 }
531 567  
532 568 void
... ... @@ -535,7 +571,7 @@ QPDFObjectHandle::replaceOrRemoveKey(std::string const&amp; key,
535 571 {
536 572 assertDictionary();
537 573 return dynamic_cast<QPDF_Dictionary*>(
538   - obj.getPointer())->replaceOrRemoveKey(key, value);
  574 + m->obj.getPointer())->replaceOrRemoveKey(key, value);
539 575 }
540 576  
541 577 // Stream accessors
... ... @@ -543,35 +579,36 @@ QPDFObjectHandle
543 579 QPDFObjectHandle::getDict()
544 580 {
545 581 assertStream();
546   - return dynamic_cast<QPDF_Stream*>(obj.getPointer())->getDict();
  582 + return dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->getDict();
547 583 }
548 584  
549 585 bool
550 586 QPDFObjectHandle::isDataModified()
551 587 {
552 588 assertStream();
553   - return dynamic_cast<QPDF_Stream*>(obj.getPointer())->isDataModified();
  589 + return dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->isDataModified();
554 590 }
555 591  
556 592 void
557 593 QPDFObjectHandle::replaceDict(QPDFObjectHandle new_dict)
558 594 {
559 595 assertStream();
560   - dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceDict(new_dict);
  596 + dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->replaceDict(new_dict);
561 597 }
562 598  
563 599 PointerHolder<Buffer>
564 600 QPDFObjectHandle::getStreamData(qpdf_stream_decode_level_e level)
565 601 {
566 602 assertStream();
567   - return dynamic_cast<QPDF_Stream*>(obj.getPointer())->getStreamData(level);
  603 + return dynamic_cast<QPDF_Stream*>(
  604 + m->obj.getPointer())->getStreamData(level);
568 605 }
569 606  
570 607 PointerHolder<Buffer>
571 608 QPDFObjectHandle::getRawStreamData()
572 609 {
573 610 assertStream();
574   - return dynamic_cast<QPDF_Stream*>(obj.getPointer())->getRawStreamData();
  611 + return dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->getRawStreamData();
575 612 }
576 613  
577 614 bool
... ... @@ -581,7 +618,7 @@ QPDFObjectHandle::pipeStreamData(Pipeline* p,
581 618 bool suppress_warnings, bool will_retry)
582 619 {
583 620 assertStream();
584   - return dynamic_cast<QPDF_Stream*>(obj.getPointer())->pipeStreamData(
  621 + return dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->pipeStreamData(
585 622 p, encode_flags, decode_level, suppress_warnings, will_retry);
586 623 }
587 624  
... ... @@ -612,7 +649,7 @@ QPDFObjectHandle::replaceStreamData(PointerHolder&lt;Buffer&gt; data,
612 649 QPDFObjectHandle const& decode_parms)
613 650 {
614 651 assertStream();
615   - dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData(
  652 + dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->replaceStreamData(
616 653 data, filter, decode_parms);
617 654 }
618 655  
... ... @@ -625,7 +662,7 @@ QPDFObjectHandle::replaceStreamData(std::string const&amp; data,
625 662 PointerHolder<Buffer> b = new Buffer(data.length());
626 663 unsigned char* bp = b->getBuffer();
627 664 memcpy(bp, data.c_str(), data.length());
628   - dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData(
  665 + dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->replaceStreamData(
629 666 b, filter, decode_parms);
630 667 }
631 668  
... ... @@ -635,26 +672,26 @@ QPDFObjectHandle::replaceStreamData(PointerHolder&lt;StreamDataProvider&gt; provider,
635 672 QPDFObjectHandle const& decode_parms)
636 673 {
637 674 assertStream();
638   - dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData(
  675 + dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->replaceStreamData(
639 676 provider, filter, decode_parms);
640 677 }
641 678  
642 679 QPDFObjGen
643 680 QPDFObjectHandle::getObjGen() const
644 681 {
645   - return QPDFObjGen(this->objid, this->generation);
  682 + return QPDFObjGen(this->m->objid, this->m->generation);
646 683 }
647 684  
648 685 int
649 686 QPDFObjectHandle::getObjectID() const
650 687 {
651   - return this->objid;
  688 + return this->m->objid;
652 689 }
653 690  
654 691 int
655 692 QPDFObjectHandle::getGeneration() const
656 693 {
657   - return this->generation;
  694 + return this->m->generation;
658 695 }
659 696  
660 697 std::map<std::string, QPDFObjectHandle>
... ... @@ -771,8 +808,8 @@ std::vector&lt;QPDFObjectHandle&gt;
771 808 QPDFObjectHandle::getPageContents()
772 809 {
773 810 std::string description = "page object " +
774   - QUtil::int_to_string(this->objid) + " " +
775   - QUtil::int_to_string(this->generation);
  811 + QUtil::int_to_string(this->m->objid) + " " +
  812 + QUtil::int_to_string(this->m->generation);
776 813 std::string all_description;
777 814 return this->getKey("/Contents").arrayOrStreamToStreamArray(
778 815 description, all_description);
... ... @@ -895,8 +932,8 @@ QPDFObjectHandle::unparse()
895 932 std::string result;
896 933 if (this->isIndirect())
897 934 {
898   - result = QUtil::int_to_string(this->objid) + " " +
899   - QUtil::int_to_string(this->generation) + " R";
  935 + result = QUtil::int_to_string(this->m->objid) + " " +
  936 + QUtil::int_to_string(this->m->generation) + " R";
900 937 }
901 938 else
902 939 {
... ... @@ -908,13 +945,13 @@ QPDFObjectHandle::unparse()
908 945 std::string
909 946 QPDFObjectHandle::unparseResolved()
910 947 {
911   - if (this->reserved)
  948 + if (this->m->reserved)
912 949 {
913 950 throw std::logic_error(
914 951 "QPDFObjectHandle: attempting to unparse a reserved object");
915 952 }
916 953 dereference();
917   - return this->obj->unparse();
  954 + return this->m->obj->unparse();
918 955 }
919 956  
920 957 QPDFObjectHandle
... ... @@ -948,8 +985,8 @@ QPDFObjectHandle::pipePageContents(Pipeline* p)
948 985 {
949 986 assertPageObject();
950 987 std::string description = "page object " +
951   - QUtil::int_to_string(this->objid) + " " +
952   - QUtil::int_to_string(this->generation);
  988 + QUtil::int_to_string(this->m->objid) + " " +
  989 + QUtil::int_to_string(this->m->generation);
953 990 std::string all_description;
954 991 this->getKey("/Contents").pipeContentStreams(
955 992 p, description, all_description);
... ... @@ -986,8 +1023,8 @@ QPDFObjectHandle::parsePageContents(ParserCallbacks* callbacks)
986 1023 {
987 1024 assertPageObject();
988 1025 std::string description = "page object " +
989   - QUtil::int_to_string(this->objid) + " " +
990   - QUtil::int_to_string(this->generation);
  1026 + QUtil::int_to_string(this->m->objid) + " " +
  1027 + QUtil::int_to_string(this->m->generation);
991 1028 this->getKey("/Contents").parseContentStream_internal(
992 1029 description, callbacks);
993 1030 }
... ... @@ -997,8 +1034,8 @@ QPDFObjectHandle::filterPageContents(TokenFilter* filter, Pipeline* next)
997 1034 {
998 1035 assertPageObject();
999 1036 std::string description = "token filter for page object " +
1000   - QUtil::int_to_string(this->objid) + " " +
1001   - QUtil::int_to_string(this->generation);
  1037 + QUtil::int_to_string(this->m->objid) + " " +
  1038 + QUtil::int_to_string(this->m->generation);
1002 1039 Pl_QPDFTokenizer token_pipeline(description.c_str(), filter, next);
1003 1040 this->pipePageContents(&token_pipeline);
1004 1041 }
... ... @@ -1061,7 +1098,8 @@ QPDFObjectHandle::parseContentStream_data(
1061 1098 char ch;
1062 1099 input->read(&ch, 1);
1063 1100 tokenizer.expectInlineImage();
1064   - QPDFTokenizer::Token t = tokenizer.readToken(input, description, true);
  1101 + QPDFTokenizer::Token t =
  1102 + tokenizer.readToken(input, description, true);
1065 1103 if (t.getType() == QPDFTokenizer::tt_bad)
1066 1104 {
1067 1105 QTC::TC("qpdf", "QPDFObjectHandle EOF in inline image");
... ... @@ -1101,7 +1139,7 @@ QPDFObjectHandle::addTokenFilter(PointerHolder&lt;TokenFilter&gt; filter)
1101 1139 {
1102 1140 assertStream();
1103 1141 return dynamic_cast<QPDF_Stream*>(
1104   - obj.getPointer())->addTokenFilter(filter);
  1142 + m->obj.getPointer())->addTokenFilter(filter);
1105 1143 }
1106 1144  
1107 1145 QPDFObjectHandle
... ... @@ -1560,7 +1598,8 @@ QPDFObjectHandle::newStream(QPDF* qpdf)
1560 1598 QPDFObjectHandle(
1561 1599 new QPDF_Stream(qpdf, 0, 0, stream_dict, 0, 0)));
1562 1600 result.dereference();
1563   - QPDF_Stream* stream = dynamic_cast<QPDF_Stream*>(result.obj.getPointer());
  1601 + QPDF_Stream* stream =
  1602 + dynamic_cast<QPDF_Stream*>(result.m->obj.getPointer());
1564 1603 stream->setObjGen(result.getObjectID(), result.getGeneration());
1565 1604 return result;
1566 1605 }
... ... @@ -1591,8 +1630,8 @@ QPDFObjectHandle::newReserved(QPDF* qpdf)
1591 1630 QPDFObjectHandle reserved = qpdf->makeIndirectObject(
1592 1631 QPDFObjectHandle(new QPDF_Reserved()));
1593 1632 QPDFObjectHandle result =
1594   - newIndirect(qpdf, reserved.objid, reserved.generation);
1595   - result.reserved = true;
  1633 + newIndirect(qpdf, reserved.m->objid, reserved.m->generation);
  1634 + result.m->reserved = true;
1596 1635 return result;
1597 1636 }
1598 1637  
... ... @@ -1640,7 +1679,7 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited)
1640 1679 "attempt to make a stream into a direct object");
1641 1680 }
1642 1681  
1643   - int cur_objid = this->objid;
  1682 + int cur_objid = this->m->objid;
1644 1683 if (cur_objid != 0)
1645 1684 {
1646 1685 if (visited.count(cur_objid))
... ... @@ -1661,9 +1700,9 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited)
1661 1700 }
1662 1701  
1663 1702 dereference();
1664   - this->qpdf = 0;
1665   - this->objid = 0;
1666   - this->generation = 0;
  1703 + this->m->qpdf = 0;
  1704 + this->m->objid = 0;
  1705 + this->m->generation = 0;
1667 1706  
1668 1707 PointerHolder<QPDFObject> new_obj;
1669 1708  
... ... @@ -1728,7 +1767,7 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited)
1728 1767 "unknown object type");
1729 1768 }
1730 1769  
1731   - this->obj = new_obj;
  1770 + this->m->obj = new_obj;
1732 1771  
1733 1772 if (cur_objid)
1734 1773 {
... ... @@ -1746,7 +1785,7 @@ QPDFObjectHandle::makeDirect()
1746 1785 void
1747 1786 QPDFObjectHandle::assertInitialized() const
1748 1787 {
1749   - if (! this->initialized)
  1788 + if (! this->m->initialized)
1750 1789 {
1751 1790 throw std::logic_error("operation attempted on uninitialized "
1752 1791 "QPDFObjectHandle");
... ... @@ -1883,14 +1922,14 @@ QPDFObjectHandle::assertPageObject()
1883 1922 void
1884 1923 QPDFObjectHandle::dereference()
1885 1924 {
1886   - if (this->obj.getPointer() == 0)
  1925 + if (this->m->obj.getPointer() == 0)
1887 1926 {
1888 1927 PointerHolder<QPDFObject> obj = QPDF::Resolver::resolve(
1889   - this->qpdf, this->objid, this->generation);
  1928 + this->m->qpdf, this->m->objid, this->m->generation);
1890 1929 if (obj.getPointer() == 0)
1891 1930 {
1892 1931 QTC::TC("qpdf", "QPDFObjectHandle indirect to unknown");
1893   - this->obj = new QPDF_Null();
  1932 + this->m->obj = new QPDF_Null();
1894 1933 }
1895 1934 else if (dynamic_cast<QPDF_Reserved*>(obj.getPointer()))
1896 1935 {
... ... @@ -1898,8 +1937,8 @@ QPDFObjectHandle::dereference()
1898 1937 }
1899 1938 else
1900 1939 {
1901   - this->reserved = false;
1902   - this->obj = obj;
  1940 + this->m->reserved = false;
  1941 + this->m->obj = obj;
1903 1942 }
1904 1943 }
1905 1944 }
... ...