Commit 4325e6e4a79da854157c1ef3b95fe2c925f68194

Authored by m-holger
Committed by Jay Berkenbilt
1 parent 585ecf17

Refactor QPDFObjectHandle::copyObject and rename to makeDirect

include/qpdf/QPDFObjectHandle.hh
... ... @@ -1628,7 +1628,7 @@ class QPDFObjectHandle
1628 1628 void objectWarning(std::string const& warning);
1629 1629 void assertType(char const* type_name, bool istype);
1630 1630 bool dereference();
1631   - void copyObject(std::set<QPDFObjGen>& visited, bool stop_at_streams);
  1631 + void makeDirect(std::set<QPDFObjGen>& visited, bool stop_at_streams);
1632 1632 void disconnect();
1633 1633 void setParsedOffset(qpdf_offset_t offset);
1634 1634 void parseContentStream_internal(
... ...
libqpdf/QPDFObjectHandle.cc
... ... @@ -2218,19 +2218,10 @@ QPDFObjectHandle::unsafeShallowCopy()
2218 2218 }
2219 2219  
2220 2220 void
2221   -QPDFObjectHandle::copyObject(
  2221 +QPDFObjectHandle::makeDirect(
2222 2222 std::set<QPDFObjGen>& visited, bool stop_at_streams)
2223 2223 {
2224 2224 assertInitialized();
2225   - if (isStream()) {
2226   - QTC::TC(
2227   - "qpdf", "QPDFObjectHandle copy stream", stop_at_streams ? 0 : 1);
2228   - if (stop_at_streams) {
2229   - return;
2230   - }
2231   - throw std::runtime_error(
2232   - "attempt to make a stream into a direct object");
2233   - }
2234 2225  
2235 2226 auto cur_og = getObjGen();
2236 2227 if (cur_og.getObj() != 0) {
... ... @@ -2243,40 +2234,41 @@ QPDFObjectHandle::copyObject(
2243 2234 visited.insert(cur_og);
2244 2235 }
2245 2236  
2246   - if (isReserved()) {
2247   - throw std::logic_error("QPDFObjectHandle: attempting to make a"
2248   - " reserved object handle direct");
2249   - }
2250   -
2251   - std::shared_ptr<QPDFObject> new_obj;
2252   -
2253 2237 if (isBool() || isInteger() || isName() || isNull() || isReal() ||
2254 2238 isString()) {
2255   - new_obj = obj->copy(true);
  2239 + this->obj = obj->copy(true);
2256 2240 } else if (isArray()) {
2257 2241 std::vector<QPDFObjectHandle> items;
2258 2242 auto array = asArray();
2259 2243 int n = array->getNItems();
2260 2244 for (int i = 0; i < n; ++i) {
2261 2245 items.push_back(array->getItem(i));
2262   - items.back().copyObject(visited, stop_at_streams);
  2246 + items.back().makeDirect(visited, stop_at_streams);
2263 2247 }
2264   - new_obj = QPDF_Array::create(items);
  2248 + this->obj = QPDF_Array::create(items);
2265 2249 } else if (isDictionary()) {
2266 2250 std::map<std::string, QPDFObjectHandle> items;
2267 2251 auto dict = asDictionary();
2268 2252 for (auto const& key: getKeys()) {
2269 2253 items[key] = dict->getKey(key);
2270   - items[key].copyObject(visited, stop_at_streams);
  2254 + items[key].makeDirect(visited, stop_at_streams);
2271 2255 }
2272   - new_obj = QPDF_Dictionary::create(items);
  2256 + this->obj = QPDF_Dictionary::create(items);
  2257 + } else if (isStream()) {
  2258 + QTC::TC(
  2259 + "qpdf", "QPDFObjectHandle copy stream", stop_at_streams ? 0 : 1);
  2260 + if (!stop_at_streams) {
  2261 + throw std::runtime_error(
  2262 + "attempt to make a stream into a direct object");
  2263 + }
  2264 + } else if (isReserved()) {
  2265 + throw std::logic_error("QPDFObjectHandle: attempting to make a"
  2266 + " reserved object handle direct");
2273 2267 } else {
2274 2268 throw std::logic_error("QPDFObjectHandle::makeDirectInternal: "
2275 2269 "unknown object type");
2276 2270 }
2277 2271  
2278   - this->obj = new_obj;
2279   -
2280 2272 if (cur_og.getObj()) {
2281 2273 visited.erase(cur_og);
2282 2274 }
... ... @@ -2304,7 +2296,7 @@ void
2304 2296 QPDFObjectHandle::makeDirect(bool allow_streams)
2305 2297 {
2306 2298 std::set<QPDFObjGen> visited;
2307   - copyObject(visited, allow_streams);
  2299 + makeDirect(visited, allow_streams);
2308 2300 }
2309 2301  
2310 2302 void
... ...