Chromium Code Reviews| Index: fpdfsdk/src/fpdfview.cpp |
| diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp |
| index 653702382c6ea4389604a397503f3568f073b153..a97730a8d38457e484ab5e2062dc14ecd2e68cd1 100644 |
| --- a/fpdfsdk/src/fpdfview.cpp |
| +++ b/fpdfsdk/src/fpdfview.cpp |
| @@ -789,14 +789,75 @@ 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, char* name, unsigned int& len) |
| +{ |
| + if (!name) |
| + len = 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; |
| + if (!name) { |
| + len = bsName.GetLength() + 1; |
| + } else { |
| + CFX_WideString wsName = PDF_DecodeText(bsName); |
|
Tom Sepez
2015/01/07 16:56:24
need to check that len was sufficient here to get
Bo Xu
2015/01/09 19:35:21
Return -1 if length not sufficient.
|
| + CFX_ByteString utf16Name = wsName.UTF16LE_Encode(); |
| + memcpy(name, utf16Name.c_str(), len-1); |
| + name[len-1] = '\0'; |
| + } |
| + return (FPDF_DEST)pDestObj; |
| +} |