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,6 +111,7 @@ class QPDFObjectHandle
111 { 111 {
112 } 112 }
113 virtual void handleToken(QPDFTokenizer::Token const&) = 0; 113 virtual void handleToken(QPDFTokenizer::Token const&) = 0;
  114 + QPDF_DLL
114 virtual void handleEOF(); 115 virtual void handleEOF();
115 116
116 class PipelineAccessor 117 class PipelineAccessor
@@ -175,6 +176,11 @@ class QPDFObjectHandle @@ -175,6 +176,11 @@ class QPDFObjectHandle
175 QPDF_DLL 176 QPDF_DLL
176 QPDFObjectHandle(); 177 QPDFObjectHandle();
177 QPDF_DLL 178 QPDF_DLL
  179 + QPDFObjectHandle(QPDFObjectHandle const&);
  180 + QPDF_DLL
  181 + QPDFObjectHandle&
  182 + operator=(QPDFObjectHandle const&);
  183 + QPDF_DLL
178 bool isInitialized() const; 184 bool isInitialized() const;
179 185
180 // Return type code and type name of underlying object. These are 186 // Return type code and type name of underlying object. These are
@@ -743,7 +749,7 @@ class QPDFObjectHandle @@ -743,7 +749,7 @@ class QPDFObjectHandle
743 static PointerHolder<QPDFObject> getObject(QPDFObjectHandle& o) 749 static PointerHolder<QPDFObject> getObject(QPDFObjectHandle& o)
744 { 750 {
745 o.dereference(); 751 o.dereference();
746 - return o.obj; 752 + return o.m->obj;
747 } 753 }
748 }; 754 };
749 friend class ObjAccessor; 755 friend class ObjAccessor;
@@ -847,13 +853,28 @@ class QPDFObjectHandle @@ -847,13 +853,28 @@ class QPDFObjectHandle
847 std::string const& description, std::string& all_description); 853 std::string const& description, std::string& all_description);
848 static void warn(QPDF*, QPDFExc const&); 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 #endif // __QPDFOBJECTHANDLE_HH__ 880 #endif // __QPDFOBJECTHANDLE_HH__
libqpdf/QPDFObjectHandle.cc
@@ -106,7 +106,11 @@ QPDFObjectHandle::ParserCallbacks::terminateParsing() @@ -106,7 +106,11 @@ QPDFObjectHandle::ParserCallbacks::terminateParsing()
106 throw TerminateParsing(); 106 throw TerminateParsing();
107 } 107 }
108 108
109 -QPDFObjectHandle::QPDFObjectHandle() : 109 +QPDFObjectHandle::Members::~Members()
  110 +{
  111 +}
  112 +
  113 +QPDFObjectHandle::Members::Members() :
110 initialized(false), 114 initialized(false),
111 qpdf(0), 115 qpdf(0),
112 objid(0), 116 objid(0),
@@ -115,7 +119,7 @@ QPDFObjectHandle::QPDFObjectHandle() : @@ -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 initialized(true), 123 initialized(true),
120 qpdf(qpdf), 124 qpdf(qpdf),
121 objid(objid), 125 objid(objid),
@@ -124,7 +128,7 @@ QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, int objid, int generation) : @@ -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 initialized(true), 132 initialized(true),
129 qpdf(0), 133 qpdf(0),
130 objid(0), 134 objid(0),
@@ -134,6 +138,38 @@ QPDFObjectHandle::QPDFObjectHandle(QPDFObject* data) : @@ -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 void 173 void
138 QPDFObjectHandle::releaseResolved() 174 QPDFObjectHandle::releaseResolved()
139 { 175 {
@@ -143,30 +179,30 @@ QPDFObjectHandle::releaseResolved() @@ -143,30 +179,30 @@ QPDFObjectHandle::releaseResolved()
143 // destruction. See comments in QPDF::~QPDF(). 179 // destruction. See comments in QPDF::~QPDF().
144 if (isIndirect()) 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 else 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 bool 193 bool
158 QPDFObjectHandle::isInitialized() const 194 QPDFObjectHandle::isInitialized() const
159 { 195 {
160 - return this->initialized; 196 + return this->m->initialized;
161 } 197 }
162 198
163 QPDFObject::object_type_e 199 QPDFObject::object_type_e
164 QPDFObjectHandle::getTypeCode() 200 QPDFObjectHandle::getTypeCode()
165 { 201 {
166 - if (this->initialized) 202 + if (this->m->initialized)
167 { 203 {
168 dereference(); 204 dereference();
169 - return obj->getTypeCode(); 205 + return this->m->obj->getTypeCode();
170 } 206 }
171 else 207 else
172 { 208 {
@@ -177,10 +213,10 @@ QPDFObjectHandle::getTypeCode() @@ -177,10 +213,10 @@ QPDFObjectHandle::getTypeCode()
177 char const* 213 char const*
178 QPDFObjectHandle::getTypeName() 214 QPDFObjectHandle::getTypeName()
179 { 215 {
180 - if (this->initialized) 216 + if (this->m->initialized)
181 { 217 {
182 dereference(); 218 dereference();
183 - return obj->getTypeName(); 219 + return this->m->obj->getTypeName();
184 } 220 }
185 else 221 else
186 { 222 {
@@ -202,28 +238,28 @@ bool @@ -202,28 +238,28 @@ bool
202 QPDFObjectHandle::isBool() 238 QPDFObjectHandle::isBool()
203 { 239 {
204 dereference(); 240 dereference();
205 - return QPDFObjectTypeAccessor<QPDF_Bool>::check(obj.getPointer()); 241 + return QPDFObjectTypeAccessor<QPDF_Bool>::check(m->obj.getPointer());
206 } 242 }
207 243
208 bool 244 bool
209 QPDFObjectHandle::isNull() 245 QPDFObjectHandle::isNull()
210 { 246 {
211 dereference(); 247 dereference();
212 - return QPDFObjectTypeAccessor<QPDF_Null>::check(obj.getPointer()); 248 + return QPDFObjectTypeAccessor<QPDF_Null>::check(m->obj.getPointer());
213 } 249 }
214 250
215 bool 251 bool
216 QPDFObjectHandle::isInteger() 252 QPDFObjectHandle::isInteger()
217 { 253 {
218 dereference(); 254 dereference();
219 - return QPDFObjectTypeAccessor<QPDF_Integer>::check(obj.getPointer()); 255 + return QPDFObjectTypeAccessor<QPDF_Integer>::check(m->obj.getPointer());
220 } 256 }
221 257
222 bool 258 bool
223 QPDFObjectHandle::isReal() 259 QPDFObjectHandle::isReal()
224 { 260 {
225 dereference(); 261 dereference();
226 - return QPDFObjectTypeAccessor<QPDF_Real>::check(obj.getPointer()); 262 + return QPDFObjectTypeAccessor<QPDF_Real>::check(m->obj.getPointer());
227 } 263 }
228 264
229 bool 265 bool
@@ -255,49 +291,49 @@ bool @@ -255,49 +291,49 @@ bool
255 QPDFObjectHandle::isName() 291 QPDFObjectHandle::isName()
256 { 292 {
257 dereference(); 293 dereference();
258 - return QPDFObjectTypeAccessor<QPDF_Name>::check(obj.getPointer()); 294 + return QPDFObjectTypeAccessor<QPDF_Name>::check(m->obj.getPointer());
259 } 295 }
260 296
261 bool 297 bool
262 QPDFObjectHandle::isString() 298 QPDFObjectHandle::isString()
263 { 299 {
264 dereference(); 300 dereference();
265 - return QPDFObjectTypeAccessor<QPDF_String>::check(obj.getPointer()); 301 + return QPDFObjectTypeAccessor<QPDF_String>::check(m->obj.getPointer());
266 } 302 }
267 303
268 bool 304 bool
269 QPDFObjectHandle::isOperator() 305 QPDFObjectHandle::isOperator()
270 { 306 {
271 dereference(); 307 dereference();
272 - return QPDFObjectTypeAccessor<QPDF_Operator>::check(obj.getPointer()); 308 + return QPDFObjectTypeAccessor<QPDF_Operator>::check(m->obj.getPointer());
273 } 309 }
274 310
275 bool 311 bool
276 QPDFObjectHandle::isInlineImage() 312 QPDFObjectHandle::isInlineImage()
277 { 313 {
278 dereference(); 314 dereference();
279 - return QPDFObjectTypeAccessor<QPDF_InlineImage>::check(obj.getPointer()); 315 + return QPDFObjectTypeAccessor<QPDF_InlineImage>::check(m->obj.getPointer());
280 } 316 }
281 317
282 bool 318 bool
283 QPDFObjectHandle::isArray() 319 QPDFObjectHandle::isArray()
284 { 320 {
285 dereference(); 321 dereference();
286 - return QPDFObjectTypeAccessor<QPDF_Array>::check(obj.getPointer()); 322 + return QPDFObjectTypeAccessor<QPDF_Array>::check(m->obj.getPointer());
287 } 323 }
288 324
289 bool 325 bool
290 QPDFObjectHandle::isDictionary() 326 QPDFObjectHandle::isDictionary()
291 { 327 {
292 dereference(); 328 dereference();
293 - return QPDFObjectTypeAccessor<QPDF_Dictionary>::check(obj.getPointer()); 329 + return QPDFObjectTypeAccessor<QPDF_Dictionary>::check(m->obj.getPointer());
294 } 330 }
295 331
296 bool 332 bool
297 QPDFObjectHandle::isStream() 333 QPDFObjectHandle::isStream()
298 { 334 {
299 dereference(); 335 dereference();
300 - return QPDFObjectTypeAccessor<QPDF_Stream>::check(obj.getPointer()); 336 + return QPDFObjectTypeAccessor<QPDF_Stream>::check(m->obj.getPointer());
301 } 337 }
302 338
303 bool 339 bool
@@ -305,14 +341,14 @@ QPDFObjectHandle::isReserved() @@ -305,14 +341,14 @@ QPDFObjectHandle::isReserved()
305 { 341 {
306 // dereference will clear reserved if this has been replaced 342 // dereference will clear reserved if this has been replaced
307 dereference(); 343 dereference();
308 - return this->reserved; 344 + return this->m->reserved;
309 } 345 }
310 346
311 bool 347 bool
312 QPDFObjectHandle::isIndirect() 348 QPDFObjectHandle::isIndirect()
313 { 349 {
314 assertInitialized(); 350 assertInitialized();
315 - return (this->objid != 0); 351 + return (this->m->objid != 0);
316 } 352 }
317 353
318 bool 354 bool
@@ -328,7 +364,7 @@ bool @@ -328,7 +364,7 @@ bool
328 QPDFObjectHandle::getBoolValue() 364 QPDFObjectHandle::getBoolValue()
329 { 365 {
330 assertBool(); 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 // Integer accessors 370 // Integer accessors
@@ -337,7 +373,7 @@ long long @@ -337,7 +373,7 @@ long long
337 QPDFObjectHandle::getIntValue() 373 QPDFObjectHandle::getIntValue()
338 { 374 {
339 assertInteger(); 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 // Real accessors 379 // Real accessors
@@ -346,7 +382,7 @@ std::string @@ -346,7 +382,7 @@ std::string
346 QPDFObjectHandle::getRealValue() 382 QPDFObjectHandle::getRealValue()
347 { 383 {
348 assertReal(); 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 // Name accessors 388 // Name accessors
@@ -355,7 +391,7 @@ std::string @@ -355,7 +391,7 @@ std::string
355 QPDFObjectHandle::getName() 391 QPDFObjectHandle::getName()
356 { 392 {
357 assertName(); 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 // String accessors 397 // String accessors
@@ -364,14 +400,14 @@ std::string @@ -364,14 +400,14 @@ std::string
364 QPDFObjectHandle::getStringValue() 400 QPDFObjectHandle::getStringValue()
365 { 401 {
366 assertString(); 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 std::string 406 std::string
371 QPDFObjectHandle::getUTF8Value() 407 QPDFObjectHandle::getUTF8Value()
372 { 408 {
373 assertString(); 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 // Operator and Inline Image accessors 413 // Operator and Inline Image accessors
@@ -380,14 +416,14 @@ std::string @@ -380,14 +416,14 @@ std::string
380 QPDFObjectHandle::getOperatorValue() 416 QPDFObjectHandle::getOperatorValue()
381 { 417 {
382 assertOperator(); 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 std::string 422 std::string
387 QPDFObjectHandle::getInlineImageValue() 423 QPDFObjectHandle::getInlineImageValue()
388 { 424 {
389 assertInlineImage(); 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 // Array accessors 429 // Array accessors
@@ -396,21 +432,21 @@ int @@ -396,21 +432,21 @@ int
396 QPDFObjectHandle::getArrayNItems() 432 QPDFObjectHandle::getArrayNItems()
397 { 433 {
398 assertArray(); 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 QPDFObjectHandle 438 QPDFObjectHandle
403 QPDFObjectHandle::getArrayItem(int n) 439 QPDFObjectHandle::getArrayItem(int n)
404 { 440 {
405 assertArray(); 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 std::vector<QPDFObjectHandle> 445 std::vector<QPDFObjectHandle>
410 QPDFObjectHandle::getArrayAsVector() 446 QPDFObjectHandle::getArrayAsVector()
411 { 447 {
412 assertArray(); 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 // Array mutators 452 // Array mutators
@@ -419,35 +455,35 @@ void @@ -419,35 +455,35 @@ void
419 QPDFObjectHandle::setArrayItem(int n, QPDFObjectHandle const& item) 455 QPDFObjectHandle::setArrayItem(int n, QPDFObjectHandle const& item)
420 { 456 {
421 assertArray(); 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 void 461 void
426 QPDFObjectHandle::setArrayFromVector(std::vector<QPDFObjectHandle> const& items) 462 QPDFObjectHandle::setArrayFromVector(std::vector<QPDFObjectHandle> const& items)
427 { 463 {
428 assertArray(); 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 void 468 void
433 QPDFObjectHandle::insertItem(int at, QPDFObjectHandle const& item) 469 QPDFObjectHandle::insertItem(int at, QPDFObjectHandle const& item)
434 { 470 {
435 assertArray(); 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 void 475 void
440 QPDFObjectHandle::appendItem(QPDFObjectHandle const& item) 476 QPDFObjectHandle::appendItem(QPDFObjectHandle const& item)
441 { 477 {
442 assertArray(); 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 void 482 void
447 QPDFObjectHandle::eraseItem(int at) 483 QPDFObjectHandle::eraseItem(int at)
448 { 484 {
449 assertArray(); 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 // Dictionary accessors 489 // Dictionary accessors
@@ -456,28 +492,28 @@ bool @@ -456,28 +492,28 @@ bool
456 QPDFObjectHandle::hasKey(std::string const& key) 492 QPDFObjectHandle::hasKey(std::string const& key)
457 { 493 {
458 assertDictionary(); 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 QPDFObjectHandle 498 QPDFObjectHandle
463 QPDFObjectHandle::getKey(std::string const& key) 499 QPDFObjectHandle::getKey(std::string const& key)
464 { 500 {
465 assertDictionary(); 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 std::set<std::string> 505 std::set<std::string>
470 QPDFObjectHandle::getKeys() 506 QPDFObjectHandle::getKeys()
471 { 507 {
472 assertDictionary(); 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 std::map<std::string, QPDFObjectHandle> 512 std::map<std::string, QPDFObjectHandle>
477 QPDFObjectHandle::getDictAsMap() 513 QPDFObjectHandle::getDictAsMap()
478 { 514 {
479 assertDictionary(); 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 // Array and Name accessors 519 // Array and Name accessors
@@ -508,7 +544,7 @@ QPDF* @@ -508,7 +544,7 @@ QPDF*
508 QPDFObjectHandle::getOwningQPDF() 544 QPDFObjectHandle::getOwningQPDF()
509 { 545 {
510 // Will be null for direct objects 546 // Will be null for direct objects
511 - return this->qpdf; 547 + return this->m->qpdf;
512 } 548 }
513 549
514 // Dictionary mutators 550 // Dictionary mutators
@@ -519,14 +555,14 @@ QPDFObjectHandle::replaceKey(std::string const&amp; key, @@ -519,14 +555,14 @@ QPDFObjectHandle::replaceKey(std::string const&amp; key,
519 { 555 {
520 assertDictionary(); 556 assertDictionary();
521 return dynamic_cast<QPDF_Dictionary*>( 557 return dynamic_cast<QPDF_Dictionary*>(
522 - obj.getPointer())->replaceKey(key, value); 558 + m->obj.getPointer())->replaceKey(key, value);
523 } 559 }
524 560
525 void 561 void
526 QPDFObjectHandle::removeKey(std::string const& key) 562 QPDFObjectHandle::removeKey(std::string const& key)
527 { 563 {
528 assertDictionary(); 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 void 568 void
@@ -535,7 +571,7 @@ QPDFObjectHandle::replaceOrRemoveKey(std::string const&amp; key, @@ -535,7 +571,7 @@ QPDFObjectHandle::replaceOrRemoveKey(std::string const&amp; key,
535 { 571 {
536 assertDictionary(); 572 assertDictionary();
537 return dynamic_cast<QPDF_Dictionary*>( 573 return dynamic_cast<QPDF_Dictionary*>(
538 - obj.getPointer())->replaceOrRemoveKey(key, value); 574 + m->obj.getPointer())->replaceOrRemoveKey(key, value);
539 } 575 }
540 576
541 // Stream accessors 577 // Stream accessors
@@ -543,35 +579,36 @@ QPDFObjectHandle @@ -543,35 +579,36 @@ QPDFObjectHandle
543 QPDFObjectHandle::getDict() 579 QPDFObjectHandle::getDict()
544 { 580 {
545 assertStream(); 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 bool 585 bool
550 QPDFObjectHandle::isDataModified() 586 QPDFObjectHandle::isDataModified()
551 { 587 {
552 assertStream(); 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 void 592 void
557 QPDFObjectHandle::replaceDict(QPDFObjectHandle new_dict) 593 QPDFObjectHandle::replaceDict(QPDFObjectHandle new_dict)
558 { 594 {
559 assertStream(); 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 PointerHolder<Buffer> 599 PointerHolder<Buffer>
564 QPDFObjectHandle::getStreamData(qpdf_stream_decode_level_e level) 600 QPDFObjectHandle::getStreamData(qpdf_stream_decode_level_e level)
565 { 601 {
566 assertStream(); 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 PointerHolder<Buffer> 607 PointerHolder<Buffer>
571 QPDFObjectHandle::getRawStreamData() 608 QPDFObjectHandle::getRawStreamData()
572 { 609 {
573 assertStream(); 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 bool 614 bool
@@ -581,7 +618,7 @@ QPDFObjectHandle::pipeStreamData(Pipeline* p, @@ -581,7 +618,7 @@ QPDFObjectHandle::pipeStreamData(Pipeline* p,
581 bool suppress_warnings, bool will_retry) 618 bool suppress_warnings, bool will_retry)
582 { 619 {
583 assertStream(); 620 assertStream();
584 - return dynamic_cast<QPDF_Stream*>(obj.getPointer())->pipeStreamData( 621 + return dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->pipeStreamData(
585 p, encode_flags, decode_level, suppress_warnings, will_retry); 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,7 +649,7 @@ QPDFObjectHandle::replaceStreamData(PointerHolder&lt;Buffer&gt; data,
612 QPDFObjectHandle const& decode_parms) 649 QPDFObjectHandle const& decode_parms)
613 { 650 {
614 assertStream(); 651 assertStream();
615 - dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData( 652 + dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->replaceStreamData(
616 data, filter, decode_parms); 653 data, filter, decode_parms);
617 } 654 }
618 655
@@ -625,7 +662,7 @@ QPDFObjectHandle::replaceStreamData(std::string const&amp; data, @@ -625,7 +662,7 @@ QPDFObjectHandle::replaceStreamData(std::string const&amp; data,
625 PointerHolder<Buffer> b = new Buffer(data.length()); 662 PointerHolder<Buffer> b = new Buffer(data.length());
626 unsigned char* bp = b->getBuffer(); 663 unsigned char* bp = b->getBuffer();
627 memcpy(bp, data.c_str(), data.length()); 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 b, filter, decode_parms); 666 b, filter, decode_parms);
630 } 667 }
631 668
@@ -635,26 +672,26 @@ QPDFObjectHandle::replaceStreamData(PointerHolder&lt;StreamDataProvider&gt; provider, @@ -635,26 +672,26 @@ QPDFObjectHandle::replaceStreamData(PointerHolder&lt;StreamDataProvider&gt; provider,
635 QPDFObjectHandle const& decode_parms) 672 QPDFObjectHandle const& decode_parms)
636 { 673 {
637 assertStream(); 674 assertStream();
638 - dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData( 675 + dynamic_cast<QPDF_Stream*>(m->obj.getPointer())->replaceStreamData(
639 provider, filter, decode_parms); 676 provider, filter, decode_parms);
640 } 677 }
641 678
642 QPDFObjGen 679 QPDFObjGen
643 QPDFObjectHandle::getObjGen() const 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 int 685 int
649 QPDFObjectHandle::getObjectID() const 686 QPDFObjectHandle::getObjectID() const
650 { 687 {
651 - return this->objid; 688 + return this->m->objid;
652 } 689 }
653 690
654 int 691 int
655 QPDFObjectHandle::getGeneration() const 692 QPDFObjectHandle::getGeneration() const
656 { 693 {
657 - return this->generation; 694 + return this->m->generation;
658 } 695 }
659 696
660 std::map<std::string, QPDFObjectHandle> 697 std::map<std::string, QPDFObjectHandle>
@@ -771,8 +808,8 @@ std::vector&lt;QPDFObjectHandle&gt; @@ -771,8 +808,8 @@ std::vector&lt;QPDFObjectHandle&gt;
771 QPDFObjectHandle::getPageContents() 808 QPDFObjectHandle::getPageContents()
772 { 809 {
773 std::string description = "page object " + 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 std::string all_description; 813 std::string all_description;
777 return this->getKey("/Contents").arrayOrStreamToStreamArray( 814 return this->getKey("/Contents").arrayOrStreamToStreamArray(
778 description, all_description); 815 description, all_description);
@@ -895,8 +932,8 @@ QPDFObjectHandle::unparse() @@ -895,8 +932,8 @@ QPDFObjectHandle::unparse()
895 std::string result; 932 std::string result;
896 if (this->isIndirect()) 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 else 938 else
902 { 939 {
@@ -908,13 +945,13 @@ QPDFObjectHandle::unparse() @@ -908,13 +945,13 @@ QPDFObjectHandle::unparse()
908 std::string 945 std::string
909 QPDFObjectHandle::unparseResolved() 946 QPDFObjectHandle::unparseResolved()
910 { 947 {
911 - if (this->reserved) 948 + if (this->m->reserved)
912 { 949 {
913 throw std::logic_error( 950 throw std::logic_error(
914 "QPDFObjectHandle: attempting to unparse a reserved object"); 951 "QPDFObjectHandle: attempting to unparse a reserved object");
915 } 952 }
916 dereference(); 953 dereference();
917 - return this->obj->unparse(); 954 + return this->m->obj->unparse();
918 } 955 }
919 956
920 QPDFObjectHandle 957 QPDFObjectHandle
@@ -948,8 +985,8 @@ QPDFObjectHandle::pipePageContents(Pipeline* p) @@ -948,8 +985,8 @@ QPDFObjectHandle::pipePageContents(Pipeline* p)
948 { 985 {
949 assertPageObject(); 986 assertPageObject();
950 std::string description = "page object " + 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 std::string all_description; 990 std::string all_description;
954 this->getKey("/Contents").pipeContentStreams( 991 this->getKey("/Contents").pipeContentStreams(
955 p, description, all_description); 992 p, description, all_description);
@@ -986,8 +1023,8 @@ QPDFObjectHandle::parsePageContents(ParserCallbacks* callbacks) @@ -986,8 +1023,8 @@ QPDFObjectHandle::parsePageContents(ParserCallbacks* callbacks)
986 { 1023 {
987 assertPageObject(); 1024 assertPageObject();
988 std::string description = "page object " + 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 this->getKey("/Contents").parseContentStream_internal( 1028 this->getKey("/Contents").parseContentStream_internal(
992 description, callbacks); 1029 description, callbacks);
993 } 1030 }
@@ -997,8 +1034,8 @@ QPDFObjectHandle::filterPageContents(TokenFilter* filter, Pipeline* next) @@ -997,8 +1034,8 @@ QPDFObjectHandle::filterPageContents(TokenFilter* filter, Pipeline* next)
997 { 1034 {
998 assertPageObject(); 1035 assertPageObject();
999 std::string description = "token filter for page object " + 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 Pl_QPDFTokenizer token_pipeline(description.c_str(), filter, next); 1039 Pl_QPDFTokenizer token_pipeline(description.c_str(), filter, next);
1003 this->pipePageContents(&token_pipeline); 1040 this->pipePageContents(&token_pipeline);
1004 } 1041 }
@@ -1061,7 +1098,8 @@ QPDFObjectHandle::parseContentStream_data( @@ -1061,7 +1098,8 @@ QPDFObjectHandle::parseContentStream_data(
1061 char ch; 1098 char ch;
1062 input->read(&ch, 1); 1099 input->read(&ch, 1);
1063 tokenizer.expectInlineImage(); 1100 tokenizer.expectInlineImage();
1064 - QPDFTokenizer::Token t = tokenizer.readToken(input, description, true); 1101 + QPDFTokenizer::Token t =
  1102 + tokenizer.readToken(input, description, true);
1065 if (t.getType() == QPDFTokenizer::tt_bad) 1103 if (t.getType() == QPDFTokenizer::tt_bad)
1066 { 1104 {
1067 QTC::TC("qpdf", "QPDFObjectHandle EOF in inline image"); 1105 QTC::TC("qpdf", "QPDFObjectHandle EOF in inline image");
@@ -1101,7 +1139,7 @@ QPDFObjectHandle::addTokenFilter(PointerHolder&lt;TokenFilter&gt; filter) @@ -1101,7 +1139,7 @@ QPDFObjectHandle::addTokenFilter(PointerHolder&lt;TokenFilter&gt; filter)
1101 { 1139 {
1102 assertStream(); 1140 assertStream();
1103 return dynamic_cast<QPDF_Stream*>( 1141 return dynamic_cast<QPDF_Stream*>(
1104 - obj.getPointer())->addTokenFilter(filter); 1142 + m->obj.getPointer())->addTokenFilter(filter);
1105 } 1143 }
1106 1144
1107 QPDFObjectHandle 1145 QPDFObjectHandle
@@ -1560,7 +1598,8 @@ QPDFObjectHandle::newStream(QPDF* qpdf) @@ -1560,7 +1598,8 @@ QPDFObjectHandle::newStream(QPDF* qpdf)
1560 QPDFObjectHandle( 1598 QPDFObjectHandle(
1561 new QPDF_Stream(qpdf, 0, 0, stream_dict, 0, 0))); 1599 new QPDF_Stream(qpdf, 0, 0, stream_dict, 0, 0)));
1562 result.dereference(); 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 stream->setObjGen(result.getObjectID(), result.getGeneration()); 1603 stream->setObjGen(result.getObjectID(), result.getGeneration());
1565 return result; 1604 return result;
1566 } 1605 }
@@ -1591,8 +1630,8 @@ QPDFObjectHandle::newReserved(QPDF* qpdf) @@ -1591,8 +1630,8 @@ QPDFObjectHandle::newReserved(QPDF* qpdf)
1591 QPDFObjectHandle reserved = qpdf->makeIndirectObject( 1630 QPDFObjectHandle reserved = qpdf->makeIndirectObject(
1592 QPDFObjectHandle(new QPDF_Reserved())); 1631 QPDFObjectHandle(new QPDF_Reserved()));
1593 QPDFObjectHandle result = 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 return result; 1635 return result;
1597 } 1636 }
1598 1637
@@ -1640,7 +1679,7 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited) @@ -1640,7 +1679,7 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited)
1640 "attempt to make a stream into a direct object"); 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 if (cur_objid != 0) 1683 if (cur_objid != 0)
1645 { 1684 {
1646 if (visited.count(cur_objid)) 1685 if (visited.count(cur_objid))
@@ -1661,9 +1700,9 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited) @@ -1661,9 +1700,9 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited)
1661 } 1700 }
1662 1701
1663 dereference(); 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 PointerHolder<QPDFObject> new_obj; 1707 PointerHolder<QPDFObject> new_obj;
1669 1708
@@ -1728,7 +1767,7 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited) @@ -1728,7 +1767,7 @@ QPDFObjectHandle::makeDirectInternal(std::set&lt;int&gt;&amp; visited)
1728 "unknown object type"); 1767 "unknown object type");
1729 } 1768 }
1730 1769
1731 - this->obj = new_obj; 1770 + this->m->obj = new_obj;
1732 1771
1733 if (cur_objid) 1772 if (cur_objid)
1734 { 1773 {
@@ -1746,7 +1785,7 @@ QPDFObjectHandle::makeDirect() @@ -1746,7 +1785,7 @@ QPDFObjectHandle::makeDirect()
1746 void 1785 void
1747 QPDFObjectHandle::assertInitialized() const 1786 QPDFObjectHandle::assertInitialized() const
1748 { 1787 {
1749 - if (! this->initialized) 1788 + if (! this->m->initialized)
1750 { 1789 {
1751 throw std::logic_error("operation attempted on uninitialized " 1790 throw std::logic_error("operation attempted on uninitialized "
1752 "QPDFObjectHandle"); 1791 "QPDFObjectHandle");
@@ -1883,14 +1922,14 @@ QPDFObjectHandle::assertPageObject() @@ -1883,14 +1922,14 @@ QPDFObjectHandle::assertPageObject()
1883 void 1922 void
1884 QPDFObjectHandle::dereference() 1923 QPDFObjectHandle::dereference()
1885 { 1924 {
1886 - if (this->obj.getPointer() == 0) 1925 + if (this->m->obj.getPointer() == 0)
1887 { 1926 {
1888 PointerHolder<QPDFObject> obj = QPDF::Resolver::resolve( 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 if (obj.getPointer() == 0) 1929 if (obj.getPointer() == 0)
1891 { 1930 {
1892 QTC::TC("qpdf", "QPDFObjectHandle indirect to unknown"); 1931 QTC::TC("qpdf", "QPDFObjectHandle indirect to unknown");
1893 - this->obj = new QPDF_Null(); 1932 + this->m->obj = new QPDF_Null();
1894 } 1933 }
1895 else if (dynamic_cast<QPDF_Reserved*>(obj.getPointer())) 1934 else if (dynamic_cast<QPDF_Reserved*>(obj.getPointer()))
1896 { 1935 {
@@ -1898,8 +1937,8 @@ QPDFObjectHandle::dereference() @@ -1898,8 +1937,8 @@ QPDFObjectHandle::dereference()
1898 } 1937 }
1899 else 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 }