| 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/fpdfview.h" | 7 #include "public/fpdfview.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { | 820 DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { |
| 821 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 821 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 822 if (!pDoc) | 822 if (!pDoc) |
| 823 return 0; | 823 return 0; |
| 824 | 824 |
| 825 CPDF_Dictionary* pRoot = pDoc->GetRoot(); | 825 CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
| 826 if (!pRoot) | 826 if (!pRoot) |
| 827 return 0; | 827 return 0; |
| 828 | 828 |
| 829 CPDF_NameTree nameTree(pDoc, "Dests"); | 829 CPDF_NameTree nameTree(pDoc, "Dests"); |
| 830 int count = nameTree.GetCount(); | 830 pdfium::base::CheckedNumeric<FPDF_DWORD> count = nameTree.GetCount(); |
| 831 CPDF_Dictionary* pDest = pRoot->GetDict("Dests"); | 831 CPDF_Dictionary* pDest = pRoot->GetDict("Dests"); |
| 832 if (pDest) | 832 if (pDest) |
| 833 count += pDest->GetCount(); | 833 count += pDest->GetCount(); |
| 834 return count; | 834 |
| 835 if (!count.IsValid()) |
| 836 return 0; |
| 837 |
| 838 return count.ValueOrDie(); |
| 835 } | 839 } |
| 836 | 840 |
| 837 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, | 841 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, |
| 838 FPDF_BYTESTRING name) { | 842 FPDF_BYTESTRING name) { |
| 839 if (!name || name[0] == 0) | 843 if (!name || name[0] == 0) |
| 840 return nullptr; | 844 return nullptr; |
| 841 | 845 |
| 842 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 846 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 843 if (!pDoc) | 847 if (!pDoc) |
| 844 return nullptr; | 848 return nullptr; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 858 return nullptr; | 862 return nullptr; |
| 859 | 863 |
| 860 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); | 864 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 861 if (!pDoc) | 865 if (!pDoc) |
| 862 return nullptr; | 866 return nullptr; |
| 863 | 867 |
| 864 CPDF_Dictionary* pRoot = pDoc->GetRoot(); | 868 CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
| 865 if (!pRoot) | 869 if (!pRoot) |
| 866 return nullptr; | 870 return nullptr; |
| 867 | 871 |
| 868 CPDF_Object* pDestObj = NULL; | 872 CPDF_Object* pDestObj = nullptr; |
| 869 CFX_ByteString bsName; | 873 CFX_ByteString bsName; |
| 870 CPDF_NameTree nameTree(pDoc, "Dests"); | 874 CPDF_NameTree nameTree(pDoc, "Dests"); |
| 871 int count = nameTree.GetCount(); | 875 int count = nameTree.GetCount(); |
| 872 if (index >= count) { | 876 if (index >= count) { |
| 873 CPDF_Dictionary* pDest = pRoot->GetDict("Dests"); | 877 CPDF_Dictionary* pDest = pRoot->GetDict("Dests"); |
| 874 if (!pDest) | 878 if (!pDest) |
| 875 return NULL; | 879 return nullptr; |
| 876 if (index >= count + pDest->GetCount()) | 880 |
| 877 return NULL; | 881 pdfium::base::CheckedNumeric<int> checked_count = count; |
| 882 checked_count += pDest->GetCount(); |
| 883 if (!checked_count.IsValid() || index >= checked_count.ValueOrDie()) |
| 884 return nullptr; |
| 885 |
| 878 index -= count; | 886 index -= count; |
| 879 FX_POSITION pos = pDest->GetStartPos(); | |
| 880 int i = 0; | 887 int i = 0; |
| 881 while (pos) { | 888 for (const auto& it : *pDest) { |
| 882 pDestObj = pDest->GetNextElement(pos, bsName); | 889 bsName = it.first; |
| 890 pDestObj = it.second; |
| 883 if (!pDestObj) | 891 if (!pDestObj) |
| 884 continue; | 892 continue; |
| 885 if (i == index) | 893 if (i == index) |
| 886 break; | 894 break; |
| 887 i++; | 895 i++; |
| 888 } | 896 } |
| 889 } else { | 897 } else { |
| 890 pDestObj = nameTree.LookupValue(index, bsName); | 898 pDestObj = nameTree.LookupValue(index, bsName); |
| 891 } | 899 } |
| 892 if (!pDestObj) | 900 if (!pDestObj) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 905 if (!buffer) { | 913 if (!buffer) { |
| 906 *buflen = len; | 914 *buflen = len; |
| 907 } else if (*buflen >= len) { | 915 } else if (*buflen >= len) { |
| 908 memcpy(buffer, utf16Name.c_str(), len); | 916 memcpy(buffer, utf16Name.c_str(), len); |
| 909 *buflen = len; | 917 *buflen = len; |
| 910 } else { | 918 } else { |
| 911 *buflen = -1; | 919 *buflen = -1; |
| 912 } | 920 } |
| 913 return (FPDF_DEST)pDestObj; | 921 return (FPDF_DEST)pDestObj; |
| 914 } | 922 } |
| OLD | NEW |