| 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 "../../include/fpdfdoc/fpdf_doc.h" | 7 #include "../../include/fpdfdoc/fpdf_doc.h" |
| 8 const int nMaxRecursion = 32; | 8 const int nMaxRecursion = 32; |
| 9 int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc) | 9 int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc) |
| 10 { | 10 { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 m_pRoot = NULL; | 80 m_pRoot = NULL; |
| 81 } | 81 } |
| 82 static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, const CFX_ByteString&
csName, | 82 static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, const CFX_ByteString&
csName, |
| 83 int& nIndex, CPDF_Array** ppFind, int nLevel
= 0) | 83 int& nIndex, CPDF_Array** ppFind, int nLevel
= 0) |
| 84 { | 84 { |
| 85 if (nLevel > nMaxRecursion) { | 85 if (nLevel > nMaxRecursion) { |
| 86 return NULL; | 86 return NULL; |
| 87 } | 87 } |
| 88 CPDF_Array* pLimits = pNode->GetArray(FX_BSTRC("Limits")); | 88 CPDF_Array* pLimits = pNode->GetArray(FX_BSTRC("Limits")); |
| 89 if (pLimits != NULL) { | 89 if (pLimits != NULL) { |
| 90 CFX_ByteString csLeft = pLimits->GetString(0); | 90 CFX_ByteString csLeft = pLimits->GetStringAt(0); |
| 91 CFX_ByteString csRight = pLimits->GetString(1); | 91 CFX_ByteString csRight = pLimits->GetStringAt(1); |
| 92 if (csLeft.Compare(csRight) > 0) { | 92 if (csLeft.Compare(csRight) > 0) { |
| 93 CFX_ByteString csTmp = csRight; | 93 CFX_ByteString csTmp = csRight; |
| 94 csRight = csLeft; | 94 csRight = csLeft; |
| 95 csLeft = csTmp; | 95 csLeft = csTmp; |
| 96 } | 96 } |
| 97 if (csName.Compare(csLeft) < 0 || csName.Compare(csRight) > 0) { | 97 if (csName.Compare(csLeft) < 0 || csName.Compare(csRight) > 0) { |
| 98 return NULL; | 98 return NULL; |
| 99 } | 99 } |
| 100 } | 100 } |
| 101 CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names")); | 101 CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names")); |
| 102 if (pNames) { | 102 if (pNames) { |
| 103 FX_DWORD dwCount = pNames->GetCount() / 2; | 103 FX_DWORD dwCount = pNames->GetCount() / 2; |
| 104 for (FX_DWORD i = 0; i < dwCount; i ++) { | 104 for (FX_DWORD i = 0; i < dwCount; i ++) { |
| 105 CFX_ByteString csValue = pNames->GetString(i * 2); | 105 CFX_ByteString csValue = pNames->GetStringAt(i * 2); |
| 106 int32_t iCompare = csValue.Compare(csName); | 106 int32_t iCompare = csValue.Compare(csName); |
| 107 if (iCompare <= 0) { | 107 if (iCompare <= 0) { |
| 108 if (ppFind != NULL) { | 108 if (ppFind != NULL) { |
| 109 *ppFind = pNames; | 109 *ppFind = pNames; |
| 110 } | 110 } |
| 111 if (iCompare < 0) { | 111 if (iCompare < 0) { |
| 112 continue; | 112 continue; |
| 113 } | 113 } |
| 114 } else { | 114 } else { |
| 115 break; | 115 break; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 145 CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names")); | 145 CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names")); |
| 146 if (pNames) { | 146 if (pNames) { |
| 147 int nCount = pNames->GetCount() / 2; | 147 int nCount = pNames->GetCount() / 2; |
| 148 if (nIndex >= nCurIndex + nCount) { | 148 if (nIndex >= nCurIndex + nCount) { |
| 149 nCurIndex += nCount; | 149 nCurIndex += nCount; |
| 150 return NULL; | 150 return NULL; |
| 151 } else { | 151 } else { |
| 152 if (ppFind != NULL) { | 152 if (ppFind != NULL) { |
| 153 *ppFind = pNames; | 153 *ppFind = pNames; |
| 154 } | 154 } |
| 155 csName = pNames->GetString((nIndex - nCurIndex) * 2); | 155 csName = pNames->GetStringAt((nIndex - nCurIndex) * 2); |
| 156 return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1); | 156 return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1); |
| 157 } | 157 } |
| 158 } | 158 } |
| 159 CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids")); | 159 CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids")); |
| 160 if (pKids == NULL) { | 160 if (pKids == NULL) { |
| 161 return NULL; | 161 return NULL; |
| 162 } | 162 } |
| 163 for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) { | 163 for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) { |
| 164 CPDF_Dictionary* pKid = pKids->GetDict(i); | 164 CPDF_Dictionary* pKid = pKids->GetDict(i); |
| 165 if (pKid == NULL) { | 165 if (pKid == NULL) { |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 } | 316 } |
| 317 FX_BOOL CPDF_FileSpec::GetFileName(CFX_WideString &csFileName) const | 317 FX_BOOL CPDF_FileSpec::GetFileName(CFX_WideString &csFileName) const |
| 318 { | 318 { |
| 319 if (m_pObj == NULL) { | 319 if (m_pObj == NULL) { |
| 320 return FALSE; | 320 return FALSE; |
| 321 } | 321 } |
| 322 if (m_pObj->GetType() == PDFOBJ_DICTIONARY) { | 322 if (m_pObj->GetType() == PDFOBJ_DICTIONARY) { |
| 323 CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_pObj; | 323 CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_pObj; |
| 324 csFileName = pDict->GetUnicodeText(FX_BSTRC("UF")); | 324 csFileName = pDict->GetUnicodeText(FX_BSTRC("UF")); |
| 325 if (csFileName.IsEmpty()) { | 325 if (csFileName.IsEmpty()) { |
| 326 csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F"
))); | 326 csFileName = CFX_WideString::FromLocal(pDict->GetStringAt("F")); |
| 327 } | 327 } |
| 328 if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) { | 328 if (pDict->GetStringAt("FS") == "URL") { |
| 329 return TRUE; | 329 return TRUE; |
| 330 } | 330 } |
| 331 if (csFileName.IsEmpty()) { | 331 if (csFileName.IsEmpty()) { |
| 332 if (pDict->KeyExist(FX_BSTRC("DOS"))) { | 332 if (pDict->KeyExist(FX_BSTRC("DOS"))) { |
| 333 csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC
("DOS"))); | 333 csFileName = CFX_WideString::FromLocal( |
| 334 pDict->GetStringAt("DOS")); |
| 334 } else if (pDict->KeyExist(FX_BSTRC("Mac"))) { | 335 } else if (pDict->KeyExist(FX_BSTRC("Mac"))) { |
| 335 csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC
("Mac"))); | 336 csFileName = CFX_WideString::FromLocal( |
| 337 pDict->GetStringAt("Mac")); |
| 336 } else if (pDict->KeyExist(FX_BSTRC("Unix"))) { | 338 } else if (pDict->KeyExist(FX_BSTRC("Unix"))) { |
| 337 csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC
("Unix"))); | 339 csFileName = CFX_WideString::FromLocal( |
| 340 pDict->GetStringAt("Unix")); |
| 338 } else { | 341 } else { |
| 339 return FALSE; | 342 return FALSE; |
| 340 } | 343 } |
| 341 } | 344 } |
| 342 } else { | 345 } else { |
| 343 csFileName = CFX_WideString::FromLocal(m_pObj->GetString()); | 346 csFileName = CFX_WideString::FromLocal(m_pObj->GetString()); |
| 344 } | 347 } |
| 345 csFileName = FILESPEC_DecodeFileName(csFileName); | 348 csFileName = FILESPEC_DecodeFileName(csFileName); |
| 346 return TRUE; | 349 return TRUE; |
| 347 } | 350 } |
| 348 CPDF_FileSpec::CPDF_FileSpec() | 351 CPDF_FileSpec::CPDF_FileSpec() |
| 349 { | 352 { |
| 350 m_pObj = CPDF_Dictionary::Create(); | 353 m_pObj = CPDF_Dictionary::Create(); |
| 351 if (m_pObj != NULL) { | 354 if (m_pObj != NULL) { |
| 352 ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Filesp
ec")); | 355 ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Filesp
ec")); |
| 353 } | 356 } |
| 354 } | 357 } |
| 355 FX_BOOL CPDF_FileSpec::IsURL() const | 358 FX_BOOL CPDF_FileSpec::IsURL() const |
| 356 { | 359 { |
| 357 if (m_pObj == NULL) { | 360 if (m_pObj == NULL) { |
| 358 return FALSE; | 361 return FALSE; |
| 359 } | 362 } |
| 360 if (m_pObj->GetType() != PDFOBJ_DICTIONARY) { | 363 if (m_pObj->GetType() != PDFOBJ_DICTIONARY) { |
| 361 return FALSE; | 364 return FALSE; |
| 362 } | 365 } |
| 363 return ((CPDF_Dictionary*)m_pObj)->GetString(FX_BSTRC("FS")) == FX_BSTRC("UR
L"); | 366 return ((CPDF_Dictionary*)m_pObj)->GetStringAt("FS") == "URL"; |
| 364 } | 367 } |
| 365 CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath) | 368 CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath) |
| 366 { | 369 { |
| 367 if (filepath.GetLength() <= 1) { | 370 if (filepath.GetLength() <= 1) { |
| 368 return CFX_WideString(); | 371 return CFX_WideString(); |
| 369 } | 372 } |
| 370 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 373 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
| 371 if (filepath.GetAt(1) == ':') { | 374 if (filepath.GetAt(1) == ':') { |
| 372 CFX_WideString result; | 375 CFX_WideString result; |
| 373 result = '/'; | 376 result = '/'; |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 } | 526 } |
| 524 n--; | 527 n--; |
| 525 } | 528 } |
| 526 if (pValue != NULL) { | 529 if (pValue != NULL) { |
| 527 pValue = pValue->GetDirect(); | 530 pValue = pValue->GetDirect(); |
| 528 if (pValue->GetType() == PDFOBJ_DICTIONARY) { | 531 if (pValue->GetType() == PDFOBJ_DICTIONARY) { |
| 529 CPDF_Dictionary* pLabel = (CPDF_Dictionary*)pValue; | 532 CPDF_Dictionary* pLabel = (CPDF_Dictionary*)pValue; |
| 530 if (pLabel->KeyExist(FX_BSTRC("P"))) { | 533 if (pLabel->KeyExist(FX_BSTRC("P"))) { |
| 531 wsLabel += pLabel->GetUnicodeText(FX_BSTRC("P")); | 534 wsLabel += pLabel->GetUnicodeText(FX_BSTRC("P")); |
| 532 } | 535 } |
| 533 CFX_ByteString bsNumberingStyle = pLabel->GetString(FX_BSTRC("S"), N
ULL); | 536 CFX_ByteString bsNumberingStyle = pLabel->GetStringAt("S", NULL); |
| 534 int nLabelNum = nPage - n + pLabel->GetInteger(FX_BSTRC("St"), 1); | 537 int nLabelNum = nPage - n + pLabel->GetInteger(FX_BSTRC("St"), 1); |
| 535 CFX_WideString wsNumPortion = _GetLabelNumPortion(nLabelNum, bsNumbe
ringStyle); | 538 CFX_WideString wsNumPortion = _GetLabelNumPortion(nLabelNum, bsNumbe
ringStyle); |
| 536 wsLabel += wsNumPortion; | 539 wsLabel += wsNumPortion; |
| 537 return wsLabel; | 540 return wsLabel; |
| 538 } | 541 } |
| 539 } | 542 } |
| 540 wsLabel.Format(L"%d", nPage + 1); | 543 wsLabel.Format(L"%d", nPage + 1); |
| 541 return wsLabel; | 544 return wsLabel; |
| 542 } | 545 } |
| 543 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_ByteStringC& bsLabel) const | 546 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_ByteStringC& bsLabel) const |
| (...skipping 19 matching lines...) Expand all Loading... |
| 563 if (nPage > 0 && nPage <= nPages) { | 566 if (nPage > 0 && nPage <= nPages) { |
| 564 return nPage; | 567 return nPage; |
| 565 } | 568 } |
| 566 return -1; | 569 return -1; |
| 567 } | 570 } |
| 568 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_WideStringC& wsLabel) const | 571 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_WideStringC& wsLabel) const |
| 569 { | 572 { |
| 570 CFX_ByteString bsLabel = PDF_EncodeText(wsLabel.GetPtr()); | 573 CFX_ByteString bsLabel = PDF_EncodeText(wsLabel.GetPtr()); |
| 571 return GetPageByLabel(bsLabel); | 574 return GetPageByLabel(bsLabel); |
| 572 } | 575 } |
| OLD | NEW |