2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-11-10 23:20:58 +00:00

Remove QPDFObjectHandle::Factory and ObjAccessor

This commit is contained in:
m-holger 2022-12-29 15:12:04 +00:00 committed by Jay Berkenbilt
parent 432f417429
commit d7b470761b
2 changed files with 13 additions and 61 deletions

View File

@ -1490,49 +1490,6 @@ class QPDFObjectHandle
QPDF_DLL QPDF_DLL
void warnIfPossible(std::string const& warning); void warnIfPossible(std::string const& warning);
// Initializers for objects. This Factory class gives the QPDF
// class specific permission to call factory methods without
// making it a friend of the whole QPDFObjectHandle class.
class Factory
{
friend class QPDF;
private:
static QPDFObjectHandle
newIndirect(std::shared_ptr<QPDFObject> const& obj)
{
return QPDFObjectHandle(obj);
}
};
// Accessor for raw underlying object -- only QPDF is allowed to
// call this.
class ObjAccessor
{
friend class QPDF;
private:
static std::shared_ptr<QPDFObject>
getObject(QPDFObjectHandle& o)
{
if (!o.dereference()) {
throw std::logic_error("attempted to dereference an"
" uninitialized QPDFObjectHandle");
};
return o.obj;
}
static QPDF_Array*
asArray(QPDFObjectHandle& oh)
{
return oh.asArray();
}
static QPDF_Stream*
asStream(QPDFObjectHandle& oh)
{
return oh.asStream();
}
};
// Provide access to specific classes for recursive // Provide access to specific classes for recursive
// disconnected(). // disconnected().
class DisconnectAccess class DisconnectAccess

View File

@ -1775,11 +1775,7 @@ QPDF::readObjectAtOffset(
// skip_cache_if_in_xref. // skip_cache_if_in_xref.
QTC::TC("qpdf", "QPDF skipping cache for known unchecked object"); QTC::TC("qpdf", "QPDF skipping cache for known unchecked object");
} else { } else {
updateCache( updateCache(og, oh.getObj(), end_before_space, end_after_space);
og,
QPDFObjectHandle::ObjAccessor::getObject(oh),
end_before_space,
end_after_space);
} }
} }
@ -1930,11 +1926,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
int offset = iter.second; int offset = iter.second;
input->seek(offset, SEEK_SET); input->seek(offset, SEEK_SET);
QPDFObjectHandle oh = readObject(input, "", og, true); QPDFObjectHandle oh = readObject(input, "", og, true);
updateCache( updateCache(og, oh.getObj(), end_before_space, end_after_space);
og,
QPDFObjectHandle::ObjAccessor::getObject(oh),
end_before_space,
end_after_space);
} else { } else {
QTC::TC("qpdf", "QPDF not caching overridden objstm object"); QTC::TC("qpdf", "QPDF not caching overridden objstm object");
} }
@ -1945,7 +1937,7 @@ QPDFObjectHandle
QPDF::newIndirect(QPDFObjGen const& og, std::shared_ptr<QPDFObject> const& obj) QPDF::newIndirect(QPDFObjGen const& og, std::shared_ptr<QPDFObject> const& obj)
{ {
obj->setDefaultDescription(this, og); obj->setDefaultDescription(this, og);
return QPDFObjectHandle::Factory::newIndirect(obj); return {obj};
} }
void void
@ -2000,8 +1992,11 @@ QPDF::makeIndirectFromQPDFObject(std::shared_ptr<QPDFObject> const& obj)
QPDFObjectHandle QPDFObjectHandle
QPDF::makeIndirectObject(QPDFObjectHandle oh) QPDF::makeIndirectObject(QPDFObjectHandle oh)
{ {
return makeIndirectFromQPDFObject( if (!oh.isInitialized()) {
QPDFObjectHandle::ObjAccessor::getObject(oh)); throw std::logic_error(
"attempted to make an uninitialized QPDFObjectHandle indirect");
}
return makeIndirectFromQPDFObject(oh.getObj());
} }
QPDFObjectHandle QPDFObjectHandle
@ -2043,8 +2038,8 @@ QPDF::reserveObjectIfNotExists(QPDFObjGen const& og)
QPDFObjectHandle QPDFObjectHandle
QPDF::reserveStream(QPDFObjGen const& og) QPDF::reserveStream(QPDFObjGen const& og)
{ {
return QPDFObjectHandle::Factory::newIndirect( return {
QPDF_Stream::create(this, og, QPDFObjectHandle::newDictionary(), 0, 0)); QPDF_Stream::create(this, og, QPDFObjectHandle::newDictionary(), 0, 0)};
} }
QPDFObjectHandle QPDFObjectHandle
@ -2085,12 +2080,12 @@ QPDF::replaceObject(int objid, int generation, QPDFObjectHandle oh)
void void
QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh) QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh)
{ {
if (oh.isIndirect()) { if (oh.isIndirect() || !oh.isInitialized()) {
QTC::TC("qpdf", "QPDF replaceObject called with indirect object"); QTC::TC("qpdf", "QPDF replaceObject called with indirect object");
throw std::logic_error( throw std::logic_error(
"QPDF::replaceObject called with indirect object handle"); "QPDF::replaceObject called with indirect object handle");
} }
updateCache(og, QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1); updateCache(og, oh.getObj(), -1, -1);
} }
void void
@ -2347,7 +2342,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign)
QPDF& foreign_stream_qpdf = QPDF& foreign_stream_qpdf =
foreign.getQPDF("unable to retrieve owning qpdf from foreign stream"); foreign.getQPDF("unable to retrieve owning qpdf from foreign stream");
auto stream = QPDFObjectHandle::ObjAccessor::asStream(foreign); auto stream = foreign.getObjectPtr()->as<QPDF_Stream>();
if (stream == nullptr) { if (stream == nullptr) {
throw std::logic_error("unable to retrieve underlying" throw std::logic_error("unable to retrieve underlying"
" stream object from foreign stream"); " stream object from foreign stream");