Index: fpdfsdk/src/fpdfview.cpp |
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp |
index 653702382c6ea4389604a397503f3568f073b153..43feaf4d5a9154999eb40c893fbe60ef5b59337a 100644 |
--- a/fpdfsdk/src/fpdfview.cpp |
+++ b/fpdfsdk/src/fpdfview.cpp |
@@ -789,14 +789,79 @@ DLLEXPORT FPDF_DUPLEXTYPE STDCALL FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT documen |
return DuplexUndefined; |
} |
+DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) |
+{ |
+ if (!document) return 0; |
+ CPDF_Document* pDoc = (CPDF_Document*)document; |
+ |
+ CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
+ if (!pRoot) return 0; |
+ |
+ CPDF_NameTree nameTree(pDoc, FX_BSTRC("Dests")); |
+ int count = nameTree.GetCount(); |
+ CPDF_Dictionary* pDest = pRoot->GetDict(FX_BSTRC("Dests")); |
+ if (pDest) |
+ count += pDest->GetCount(); |
+ return count; |
+} |
+ |
DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name) |
{ |
- if (document == NULL) |
+ if (!document) |
return NULL; |
- if (name == NULL || name[0] == 0) |
+ if (!name || name[0] == 0) |
return NULL; |
CPDF_Document* pDoc = (CPDF_Document*)document; |
CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests")); |
return name_tree.LookupNamedDest(pDoc, name); |
} |
+ |
+DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDest(FPDF_DOCUMENT document, int index, void* buffer, unsigned long& buflen) |
+{ |
+ if (!buffer) |
+ buflen = 0; |
+ if (!document || index < 0) return NULL; |
+ CPDF_Document* pDoc = (CPDF_Document*)document; |
+ |
+ CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
+ if (!pRoot) return NULL; |
+ |
+ CPDF_Object* pDestObj = NULL; |
+ CFX_ByteString bsName; |
+ CPDF_NameTree nameTree(pDoc, FX_BSTRC("Dests")); |
+ int count = nameTree.GetCount(); |
+ if (index >= count) { |
+ CPDF_Dictionary* pDest = pRoot->GetDict(FX_BSTRC("Dests")); |
+ if (!pDest) return NULL; |
+ if (index >= count + pDest->GetCount()) return NULL; |
+ index -= count; |
+ FX_POSITION pos = pDest->GetStartPos(); |
+ int i = 0; |
+ while (pos) { |
+ pDestObj = pDest->GetNextElement(pos, bsName); |
+ if (!pDestObj) continue; |
+ if (i == index) break; |
+ i++; |
+ } |
+ } else { |
+ pDestObj = nameTree.LookupValue(index, bsName); |
+ } |
+ if (!pDestObj) return NULL; |
+ if (pDestObj->GetType() == PDFOBJ_DICTIONARY) |
+ pDestObj = ((CPDF_Dictionary*)pDestObj)->GetArray(FX_BSTRC("D")); |
+ if (pDestObj->GetType() != PDFOBJ_ARRAY) return NULL; |
+ CFX_WideString wsName = PDF_DecodeText(bsName); |
+ CFX_ByteString utf16Name = wsName.UTF16LE_Encode(); |
+ unsigned int len = utf16Name.GetLength(); |
+ if (!buffer) { |
+ buflen = len + 2; |
+ } else if (buflen >= len + 2) { |
+ memcpy(buffer, utf16Name.c_str(), len); |
+ ((FX_BYTE*)buffer)[len] = 0; |
+ ((FX_BYTE*)buffer)[len + 1] = 0; |
+ } else { |
+ len = -1; |
+ } |
+ return (FPDF_DEST)pDestObj; |
+} |