| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "public/fpdf_ppo.h" | 7 #include "public/fpdf_ppo.h" |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 CPDF_Object* pType = pDict->GetObjectBy("Type")->GetDirect(); | 184 CPDF_Object* pType = pDict->GetObjectBy("Type")->GetDirect(); |
| 185 if (!ToName(pType)) | 185 if (!ToName(pType)) |
| 186 return nullptr; | 186 return nullptr; |
| 187 if (pType->GetString().Compare("Page")) | 187 if (pType->GetString().Compare("Page")) |
| 188 return nullptr; | 188 return nullptr; |
| 189 | 189 |
| 190 CPDF_Dictionary* pp = ToDictionary(pDict->GetObjectBy("Parent")->GetDirect()); | 190 CPDF_Dictionary* pp = ToDictionary(pDict->GetObjectBy("Parent")->GetDirect()); |
| 191 if (!pp) | 191 if (!pp) |
| 192 return nullptr; | 192 return nullptr; |
| 193 | 193 |
| 194 if (pDict->KeyExist((const char*)nSrctag)) | 194 CFX_ByteStringC sSrcTag = nSrctag.AsStringC(); |
| 195 return pDict->GetObjectBy((const char*)nSrctag); | 195 if (pDict->KeyExist(sSrcTag)) |
| 196 return pDict->GetObjectBy(sSrcTag); |
| 196 | 197 |
| 197 while (pp) { | 198 while (pp) { |
| 198 if (pp->KeyExist((const char*)nSrctag)) | 199 if (pp->KeyExist(sSrcTag)) |
| 199 return pp->GetObjectBy((const char*)nSrctag); | 200 return pp->GetObjectBy(sSrcTag); |
| 200 if (!pp->KeyExist("Parent")) | 201 if (!pp->KeyExist("Parent")) |
| 201 break; | 202 break; |
| 202 pp = ToDictionary(pp->GetObjectBy("Parent")->GetDirect()); | 203 pp = ToDictionary(pp->GetObjectBy("Parent")->GetDirect()); |
| 203 } | 204 } |
| 204 return nullptr; | 205 return nullptr; |
| 205 } | 206 } |
| 206 | 207 |
| 207 FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj, | 208 FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj, |
| 208 CPDF_Document* pDoc, | 209 CPDF_Document* pDoc, |
| 209 ObjectNumberMap* pObjNumberMap) { | 210 ObjectNumberMap* pObjNumberMap) { |
| 210 switch (pObj->GetType()) { | 211 switch (pObj->GetType()) { |
| 211 case CPDF_Object::REFERENCE: { | 212 case CPDF_Object::REFERENCE: { |
| 212 CPDF_Reference* pReference = pObj->AsReference(); | 213 CPDF_Reference* pReference = pObj->AsReference(); |
| 213 uint32_t newobjnum = GetNewObjId(pDoc, pObjNumberMap, pReference); | 214 uint32_t newobjnum = GetNewObjId(pDoc, pObjNumberMap, pReference); |
| 214 if (newobjnum == 0) | 215 if (newobjnum == 0) |
| 215 return FALSE; | 216 return FALSE; |
| 216 pReference->SetRef(pDoc, newobjnum); | 217 pReference->SetRef(pDoc, newobjnum); |
| 217 break; | 218 break; |
| 218 } | 219 } |
| 219 case CPDF_Object::DICTIONARY: { | 220 case CPDF_Object::DICTIONARY: { |
| 220 CPDF_Dictionary* pDict = pObj->AsDictionary(); | 221 CPDF_Dictionary* pDict = pObj->AsDictionary(); |
| 221 auto it = pDict->begin(); | 222 auto it = pDict->begin(); |
| 222 while (it != pDict->end()) { | 223 while (it != pDict->end()) { |
| 223 const CFX_ByteString& key = it->first; | 224 const CFX_ByteString& key = it->first; |
| 224 CPDF_Object* pNextObj = it->second; | 225 CPDF_Object* pNextObj = it->second; |
| 225 ++it; | 226 ++it; |
| 226 if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcmp(key, "Prev") || | 227 if (!FXSYS_strcmp(key.c_str(), "Parent") || |
| 227 !FXSYS_strcmp(key, "First")) { | 228 !FXSYS_strcmp(key.c_str(), "Prev") || |
| 229 !FXSYS_strcmp(key.c_str(), "First")) { |
| 228 continue; | 230 continue; |
| 229 } | 231 } |
| 230 if (pNextObj) { | 232 if (pNextObj) { |
| 231 if (!UpdateReference(pNextObj, pDoc, pObjNumberMap)) | 233 if (!UpdateReference(pNextObj, pDoc, pObjNumberMap)) |
| 232 pDict->RemoveAt(key.AsStringC()); | 234 pDict->RemoveAt(key.AsStringC()); |
| 233 } else { | 235 } else { |
| 234 return FALSE; | 236 return FALSE; |
| 235 } | 237 } |
| 236 } | 238 } |
| 237 break; | 239 break; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 if (!pDirect) | 285 if (!pDirect) |
| 284 return 0; | 286 return 0; |
| 285 | 287 |
| 286 CPDF_Object* pClone = pDirect->Clone(); | 288 CPDF_Object* pClone = pDirect->Clone(); |
| 287 if (!pClone) | 289 if (!pClone) |
| 288 return 0; | 290 return 0; |
| 289 | 291 |
| 290 if (CPDF_Dictionary* pDictClone = pClone->AsDictionary()) { | 292 if (CPDF_Dictionary* pDictClone = pClone->AsDictionary()) { |
| 291 if (pDictClone->KeyExist("Type")) { | 293 if (pDictClone->KeyExist("Type")) { |
| 292 CFX_ByteString strType = pDictClone->GetStringBy("Type"); | 294 CFX_ByteString strType = pDictClone->GetStringBy("Type"); |
| 293 if (!FXSYS_stricmp(strType, "Pages")) { | 295 if (!FXSYS_stricmp(strType.c_str(), "Pages")) { |
| 294 pDictClone->Release(); | 296 pDictClone->Release(); |
| 295 return 4; | 297 return 4; |
| 296 } | 298 } |
| 297 if (!FXSYS_stricmp(strType, "Page")) { | 299 if (!FXSYS_stricmp(strType.c_str(), "Page")) { |
| 298 pDictClone->Release(); | 300 pDictClone->Release(); |
| 299 return 0; | 301 return 0; |
| 300 } | 302 } |
| 301 } | 303 } |
| 302 } | 304 } |
| 303 dwNewObjNum = pDoc->AddIndirectObject(pClone); | 305 dwNewObjNum = pDoc->AddIndirectObject(pClone); |
| 304 (*pObjNumberMap)[dwObjnum] = dwNewObjNum; | 306 (*pObjNumberMap)[dwObjnum] = dwNewObjNum; |
| 305 if (!UpdateReference(pClone, pDoc, pObjNumberMap)) { | 307 if (!UpdateReference(pClone, pDoc, pObjNumberMap)) { |
| 306 pClone->Release(); | 308 pClone->Release(); |
| 307 return 0; | 309 return 0; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 323 CFX_ByteString cbMidRange; | 325 CFX_ByteString cbMidRange; |
| 324 int nStringFrom = 0; | 326 int nStringFrom = 0; |
| 325 int nStringTo = 0; | 327 int nStringTo = 0; |
| 326 while (nStringTo < nLength) { | 328 while (nStringTo < nLength) { |
| 327 nStringTo = rangstring.Find(',', nStringFrom); | 329 nStringTo = rangstring.Find(',', nStringFrom); |
| 328 if (nStringTo == -1) | 330 if (nStringTo == -1) |
| 329 nStringTo = nLength; | 331 nStringTo = nLength; |
| 330 cbMidRange = rangstring.Mid(nStringFrom, nStringTo - nStringFrom); | 332 cbMidRange = rangstring.Mid(nStringFrom, nStringTo - nStringFrom); |
| 331 int nMid = cbMidRange.Find('-'); | 333 int nMid = cbMidRange.Find('-'); |
| 332 if (nMid == -1) { | 334 if (nMid == -1) { |
| 333 long lPageNum = atol(cbMidRange); | 335 long lPageNum = atol(cbMidRange.c_str()); |
| 334 if (lPageNum <= 0 || lPageNum > nCount) | 336 if (lPageNum <= 0 || lPageNum > nCount) |
| 335 return FALSE; | 337 return FALSE; |
| 336 pageArray->push_back((uint16_t)lPageNum); | 338 pageArray->push_back((uint16_t)lPageNum); |
| 337 } else { | 339 } else { |
| 338 int nStartPageNum = atol(cbMidRange.Mid(0, nMid)); | 340 int nStartPageNum = atol(cbMidRange.Mid(0, nMid).c_str()); |
| 339 if (nStartPageNum == 0) | 341 if (nStartPageNum == 0) |
| 340 return FALSE; | 342 return FALSE; |
| 341 | 343 |
| 342 ++nMid; | 344 ++nMid; |
| 343 int nEnd = cbMidRange.GetLength() - nMid; | 345 int nEnd = cbMidRange.GetLength() - nMid; |
| 344 if (nEnd == 0) | 346 if (nEnd == 0) |
| 345 return FALSE; | 347 return FALSE; |
| 346 | 348 |
| 347 int nEndPageNum = atol(cbMidRange.Mid(nMid, nEnd)); | 349 int nEndPageNum = atol(cbMidRange.Mid(nMid, nEnd).c_str()); |
| 348 if (nStartPageNum < 0 || nStartPageNum > nEndPageNum || | 350 if (nStartPageNum < 0 || nStartPageNum > nEndPageNum || |
| 349 nEndPageNum > nCount) { | 351 nEndPageNum > nCount) { |
| 350 return FALSE; | 352 return FALSE; |
| 351 } | 353 } |
| 352 for (int i = nStartPageNum; i <= nEndPageNum; ++i) { | 354 for (int i = nStartPageNum; i <= nEndPageNum; ++i) { |
| 353 pageArray->push_back(i); | 355 pageArray->push_back(i); |
| 354 } | 356 } |
| 355 } | 357 } |
| 356 nStringFrom = nStringTo + 1; | 358 nStringFrom = nStringTo + 1; |
| 357 } | 359 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 if (!pSrcDict) | 404 if (!pSrcDict) |
| 403 return FALSE; | 405 return FALSE; |
| 404 | 406 |
| 405 CPDF_Dictionary* pDstDict = pDstDoc->GetRoot(); | 407 CPDF_Dictionary* pDstDict = pDstDoc->GetRoot(); |
| 406 if (!pDstDict) | 408 if (!pDstDict) |
| 407 return FALSE; | 409 return FALSE; |
| 408 | 410 |
| 409 pDstDict->SetAt("ViewerPreferences", pSrcDict->Clone(TRUE)); | 411 pDstDict->SetAt("ViewerPreferences", pSrcDict->Clone(TRUE)); |
| 410 return TRUE; | 412 return TRUE; |
| 411 } | 413 } |
| OLD | NEW |