| Index: fpdfsdk/fpdfdoc.cpp
|
| diff --git a/fpdfsdk/fpdfdoc.cpp b/fpdfsdk/fpdfdoc.cpp
|
| index 01d91242f44da662af6ca90c98d8895d8fd8d3da..254be3f883acca4fc25fadd3bb971ec0812fd0c5 100644
|
| --- a/fpdfsdk/fpdfdoc.cpp
|
| +++ b/fpdfsdk/fpdfdoc.cpp
|
| @@ -15,6 +15,7 @@
|
| #include "core/fpdfdoc/cpdf_bookmark.h"
|
| #include "core/fpdfdoc/cpdf_bookmarktree.h"
|
| #include "core/fpdfdoc/cpdf_dest.h"
|
| +#include "core/fpdfdoc/cpdf_pagelabel.h"
|
| #include "fpdfsdk/fsdk_define.h"
|
| #include "third_party/base/stl_util.h"
|
|
|
| @@ -58,6 +59,16 @@ CPDF_LinkList* GetLinkList(CPDF_Page* page) {
|
| return pHolder->get();
|
| }
|
|
|
| +unsigned long Utf16EncodeMaybeCopyAndReturnLength(const CFX_WideString& text,
|
| + void* buffer,
|
| + unsigned long buflen) {
|
| + CFX_ByteString encodedText = text.UTF16LE_Encode();
|
| + unsigned long len = encodedText.GetLength();
|
| + if (buffer && buflen >= len)
|
| + FXSYS_memcpy(buffer, encodedText.c_str(), len);
|
| + return len;
|
| +}
|
| +
|
| } // namespace
|
|
|
| DLLEXPORT FPDF_BOOKMARK STDCALL
|
| @@ -91,12 +102,7 @@ DLLEXPORT unsigned long STDCALL FPDFBookmark_GetTitle(FPDF_BOOKMARK pDict,
|
| return 0;
|
| CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
|
| CFX_WideString title = bookmark.GetTitle();
|
| - CFX_ByteString encodedTitle = title.UTF16LE_Encode();
|
| - unsigned long len = encodedTitle.GetLength();
|
| - if (buffer && buflen >= len) {
|
| - FXSYS_memcpy(buffer, encodedTitle.c_str(), len);
|
| - }
|
| - return len;
|
| + return Utf16EncodeMaybeCopyAndReturnLength(title, buffer, buflen);
|
| }
|
|
|
| DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document,
|
| @@ -354,42 +360,53 @@ DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot,
|
| CPDF_Dictionary* pAnnotDict =
|
| ToDictionary(static_cast<CPDF_Object*>(linkAnnot));
|
| CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
|
| - if (pArray) {
|
| - if (quadIndex < 0 ||
|
| - static_cast<size_t>(quadIndex) >= pArray->GetCount() / 8 ||
|
| - (static_cast<size_t>(quadIndex * 8 + 7) >= pArray->GetCount()))
|
| - return false;
|
| - quadPoints->x1 = pArray->GetNumberAt(quadIndex * 8);
|
| - quadPoints->y1 = pArray->GetNumberAt(quadIndex * 8 + 1);
|
| - quadPoints->x2 = pArray->GetNumberAt(quadIndex * 8 + 2);
|
| - quadPoints->y2 = pArray->GetNumberAt(quadIndex * 8 + 3);
|
| - quadPoints->x3 = pArray->GetNumberAt(quadIndex * 8 + 4);
|
| - quadPoints->y3 = pArray->GetNumberAt(quadIndex * 8 + 5);
|
| - quadPoints->x4 = pArray->GetNumberAt(quadIndex * 8 + 6);
|
| - quadPoints->y4 = pArray->GetNumberAt(quadIndex * 8 + 7);
|
| - return true;
|
| + if (!pArray)
|
| + return false;
|
| +
|
| + if (quadIndex < 0 ||
|
| + static_cast<size_t>(quadIndex) >= pArray->GetCount() / 8 ||
|
| + (static_cast<size_t>(quadIndex * 8 + 7) >= pArray->GetCount())) {
|
| + return false;
|
| }
|
| - return false;
|
| +
|
| + quadPoints->x1 = pArray->GetNumberAt(quadIndex * 8);
|
| + quadPoints->y1 = pArray->GetNumberAt(quadIndex * 8 + 1);
|
| + quadPoints->x2 = pArray->GetNumberAt(quadIndex * 8 + 2);
|
| + quadPoints->y2 = pArray->GetNumberAt(quadIndex * 8 + 3);
|
| + quadPoints->x3 = pArray->GetNumberAt(quadIndex * 8 + 4);
|
| + quadPoints->y3 = pArray->GetNumberAt(quadIndex * 8 + 5);
|
| + quadPoints->x4 = pArray->GetNumberAt(quadIndex * 8 + 6);
|
| + quadPoints->y4 = pArray->GetNumberAt(quadIndex * 8 + 7);
|
| + return true;
|
| }
|
|
|
| -DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc,
|
| +DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT document,
|
| FPDF_BYTESTRING tag,
|
| void* buffer,
|
| unsigned long buflen) {
|
| if (!tag)
|
| return 0;
|
| - CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc);
|
| + CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
|
| if (!pDoc)
|
| return 0;
|
| CPDF_Dictionary* pInfo = pDoc->GetInfo();
|
| if (!pInfo)
|
| return 0;
|
| CFX_WideString text = pInfo->GetUnicodeTextFor(tag);
|
| - // Use UTF-16LE encoding
|
| - CFX_ByteString encodedText = text.UTF16LE_Encode();
|
| - unsigned long len = encodedText.GetLength();
|
| - if (buffer && buflen >= len) {
|
| - FXSYS_memcpy(buffer, encodedText.c_str(), len);
|
| - }
|
| - return len;
|
| + return Utf16EncodeMaybeCopyAndReturnLength(text, buffer, buflen);
|
| +}
|
| +
|
| +DLLEXPORT unsigned long STDCALL FPDF_GetPagelLabel(FPDF_DOCUMENT document,
|
| + int page_index,
|
| + void* buffer,
|
| + unsigned long buflen) {
|
| + if (page_index < 0)
|
| + return 0;
|
| +
|
| + // CPDF_PageLabel can deal with NULL |document|.
|
| + CPDF_PageLabel label(CPDFDocumentFromFPDFDocument(document));
|
| + CFX_WideString str;
|
| + if (!label.GetLabel(page_index, &str))
|
| + return 0;
|
| + return Utf16EncodeMaybeCopyAndReturnLength(str, buffer, buflen);
|
| }
|
|
|