diff options
Diffstat (limited to 'libqpdf/QPDFObjectHandle.cc')
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 112 |
1 files changed, 57 insertions, 55 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 66087dd4..753493ec 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -53,6 +53,24 @@ QPDFObjectHandle::StreamDataProvider::~StreamDataProvider() void QPDFObjectHandle::StreamDataProvider::provideStreamData( + QPDFObjGen const& og, Pipeline* pipeline) +{ + return provideStreamData(og.getObj(), og.getGen(), pipeline); +} + +bool +QPDFObjectHandle::StreamDataProvider::provideStreamData( + QPDFObjGen const& og, + Pipeline* pipeline, + bool suppress_warnings, + bool will_retry) +{ + return provideStreamData( + og.getObj(), og.getGen(), pipeline, suppress_warnings, will_retry); +} + +void +QPDFObjectHandle::StreamDataProvider::provideStreamData( int objid, int generation, Pipeline* pipeline) { throw std::logic_error( @@ -90,8 +108,7 @@ namespace { } virtual ~CoalesceProvider() = default; - virtual void - provideStreamData(int objid, int generation, Pipeline* pipeline); + virtual void provideStreamData(QPDFObjGen const&, Pipeline* pipeline); private: QPDFObjectHandle containing_page; @@ -100,12 +117,11 @@ namespace } // namespace void -CoalesceProvider::provideStreamData(int, int, Pipeline* p) +CoalesceProvider::provideStreamData(QPDFObjGen const&, Pipeline* p) { QTC::TC("qpdf", "QPDFObjectHandle coalesce provide stream data"); - std::string description = "page object " + - QUtil::int_to_string(containing_page.getObjectID()) + " " + - QUtil::int_to_string(containing_page.getGeneration()); + std::string description = + "page object " + containing_page.getObjGen().unparse(' '); std::string all_description; old_contents.pipeContentStreams(p, description, all_description); } @@ -219,27 +235,22 @@ LastChar::getLastChar() QPDFObjectHandle::QPDFObjectHandle() : initialized(false), - qpdf(0), - objid(0), - generation(0), + qpdf(nullptr), reserved(false) { } -QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, int objid, int generation) : +QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, QPDFObjGen const& og) : initialized(true), qpdf(qpdf), - objid(objid), - generation(generation), + og(og), reserved(false) { } QPDFObjectHandle::QPDFObjectHandle(std::shared_ptr<QPDFObject> const& data) : initialized(true), - qpdf(0), - objid(0), - generation(0), + qpdf(nullptr), obj(data), reserved(false) { @@ -1431,15 +1442,14 @@ namespace } virtual void - provideStreamData(int, int, Pipeline* pipeline) override + provideStreamData(QPDFObjGen const&, Pipeline* pipeline) override { p1(pipeline); } virtual bool provideStreamData( - int, - int, + QPDFObjGen const&, Pipeline* pipeline, bool suppress_warnings, bool will_retry) override @@ -1482,26 +1492,19 @@ QPDFObjectHandle::replaceStreamData( QPDFObjGen QPDFObjectHandle::getObjGen() const { - return QPDFObjGen(this->objid, this->generation); -} - -std::string -QPDFObjectHandle::getObjGenAsStr() const -{ - return QUtil::int_to_string(this->objid) + " " + - QUtil::int_to_string(this->generation); + return og; } int QPDFObjectHandle::getObjectID() const { - return this->objid; + return og.getObj(); } int QPDFObjectHandle::getGeneration() const { - return this->generation; + return og.getGen(); } std::map<std::string, QPDFObjectHandle> @@ -1556,7 +1559,7 @@ QPDFObjectHandle::arrayOrStreamToStreamArray( } else { all_description += ","; } - all_description += " stream " + item.getObjGenAsStr(); + all_description += " stream " + item.getObjGen().unparse(' '); } return result; @@ -1565,7 +1568,7 @@ QPDFObjectHandle::arrayOrStreamToStreamArray( std::vector<QPDFObjectHandle> QPDFObjectHandle::getPageContents() { - std::string description = "page object " + getObjGenAsStr(); + std::string description = "page object " + getObjGen().unparse(' '); std::string all_description; return this->getKey("/Contents") .arrayOrStreamToStreamArray(description, all_description); @@ -1674,7 +1677,7 @@ QPDFObjectHandle::unparse() { std::string result; if (this->isIndirect()) { - result = getObjGenAsStr() + " R"; + result = getObjGen().unparse(' ') + " R"; } else { result = unparseResolved(); } @@ -1789,7 +1792,7 @@ QPDFObjectHandle::parse( void QPDFObjectHandle::pipePageContents(Pipeline* p) { - std::string description = "page object " + getObjGenAsStr(); + std::string description = "page object " + getObjGen().unparse(' '); std::string all_description; this->getKey("/Contents") .pipeContentStreams(p, description, all_description); @@ -1813,7 +1816,7 @@ QPDFObjectHandle::pipeContentStreams( throw QPDFExc( qpdf_e_damaged_pdf, "content stream", - "content stream object " + stream.getObjGenAsStr(), + "content stream object " + stream.getObjGen().unparse(' '), 0, "errors while decoding content stream"); } @@ -1829,7 +1832,7 @@ QPDFObjectHandle::pipeContentStreams( void QPDFObjectHandle::parsePageContents(ParserCallbacks* callbacks) { - std::string description = "page object " + getObjGenAsStr(); + std::string description = "page object " + getObjGen().unparse(' '); this->getKey("/Contents") .parseContentStream_internal(description, callbacks); } @@ -1837,14 +1840,15 @@ QPDFObjectHandle::parsePageContents(ParserCallbacks* callbacks) void QPDFObjectHandle::parseAsContents(ParserCallbacks* callbacks) { - std::string description = "object " + getObjGenAsStr(); + std::string description = "object " + getObjGen().unparse(' '); this->parseContentStream_internal(description, callbacks); } void QPDFObjectHandle::filterPageContents(TokenFilter* filter, Pipeline* next) { - auto description = "token filter for page object " + getObjGenAsStr(); + auto description = + "token filter for page object " + getObjGen().unparse(' '); Pl_QPDFTokenizer token_pipeline(description.c_str(), filter, next); this->pipePageContents(&token_pipeline); } @@ -1852,7 +1856,7 @@ QPDFObjectHandle::filterPageContents(TokenFilter* filter, Pipeline* next) void QPDFObjectHandle::filterAsContents(TokenFilter* filter, Pipeline* next) { - auto description = "token filter for object " + getObjGenAsStr(); + auto description = "token filter for object " + getObjGen().unparse(' '); Pl_QPDFTokenizer token_pipeline(description.c_str(), filter, next); this->pipeStreamData(&token_pipeline, 0, qpdf_dl_specialized); } @@ -2192,8 +2196,9 @@ QPDFObjectHandle::parseInternal( // Try to resolve indirect objects object = newIndirect( context, - olist.at(olist.size() - 2).getIntValueAsInt(), - olist.at(olist.size() - 1).getIntValueAsInt()); + QPDFObjGen( + olist.at(olist.size() - 2).getIntValueAsInt(), + olist.at(olist.size() - 1).getIntValueAsInt())); olist.remove_last(); olist.remove_last(); } else if ((value == "endobj") && (state == st_top)) { @@ -2481,9 +2486,9 @@ QPDFObjectHandle::setParsedOffset(qpdf_offset_t offset) } QPDFObjectHandle -QPDFObjectHandle::newIndirect(QPDF* qpdf, int objid, int generation) +QPDFObjectHandle::newIndirect(QPDF* qpdf, QPDFObjGen const& og) { - if (objid == 0) { + if (!og.isIndirect()) { // Special case: QPDF uses objid 0 as a sentinel for direct // objects, and the PDF specification doesn't allow for object // 0. Treat indirect references to object 0 as null so that we @@ -2492,7 +2497,7 @@ QPDFObjectHandle::newIndirect(QPDF* qpdf, int objid, int generation) return newNull(); } - return QPDFObjectHandle(qpdf, objid, generation); + return QPDFObjectHandle(qpdf, og); } QPDFObjectHandle @@ -2640,14 +2645,13 @@ QPDFObjectHandle::newDictionary( QPDFObjectHandle QPDFObjectHandle::newStream( QPDF* qpdf, - int objid, - int generation, + QPDFObjGen const& og, QPDFObjectHandle stream_dict, qpdf_offset_t offset, size_t length) { - QPDFObjectHandle result = QPDFObjectHandle(QPDF_Stream::create( - qpdf, objid, generation, stream_dict, offset, length)); + QPDFObjectHandle result = QPDFObjectHandle( + QPDF_Stream::create(qpdf, og, stream_dict, offset, length)); if (offset) { result.setParsedOffset(offset); } @@ -2663,11 +2667,11 @@ QPDFObjectHandle::newStream(QPDF* qpdf) } QTC::TC("qpdf", "QPDFObjectHandle newStream"); QPDFObjectHandle stream_dict = newDictionary(); - QPDFObjectHandle result = qpdf->makeIndirectObject( - QPDFObjectHandle(QPDF_Stream::create(qpdf, 0, 0, stream_dict, 0, 0))); + QPDFObjectHandle result = qpdf->makeIndirectObject(QPDFObjectHandle( + QPDF_Stream::create(qpdf, QPDFObjGen(), stream_dict, 0, 0))); result.dereference(); QPDF_Stream* stream = dynamic_cast<QPDF_Stream*>(result.obj.get()); - stream->setObjGen(result.getObjectID(), result.getGeneration()); + stream->setObjGen(result.getObjGen()); return result; } @@ -2695,8 +2699,7 @@ QPDFObjectHandle::newReserved(QPDF* qpdf) // Reserve a spot for this object by assigning it an object // number, but then return an unresolved handle to the object. QPDFObjectHandle reserved = qpdf->makeIndirectObject(makeReserved()); - QPDFObjectHandle result = - newIndirect(qpdf, reserved.objid, reserved.generation); + QPDFObjectHandle result = newIndirect(qpdf, reserved.getObjGen()); result.reserved = true; return result; } @@ -2796,9 +2799,8 @@ QPDFObjectHandle::copyObject( " reserved object handle direct"); } - this->qpdf = 0; - this->objid = 0; - this->generation = 0; + qpdf = nullptr; + og = QPDFObjGen(); std::shared_ptr<QPDFObject> new_obj; @@ -3112,7 +3114,7 @@ QPDFObjectHandle::dereference() } if (this->obj.get() == 0) { std::shared_ptr<QPDFObject> obj = - QPDF::Resolver::resolve(this->qpdf, getObjectID(), getGeneration()); + QPDF::Resolver::resolve(this->qpdf, getObjGen()); if (obj.get() == 0) { // QPDF::resolve never returns an uninitialized object, but // check just in case. |