1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "public/fpdf_doc.h" 8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <set> 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_page.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_bookmark.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_bookmarktree.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_dest.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_pagelabel.h" 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/fsdk_define.h" 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h" 22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannnamespace { 24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Bookmark FindBookmark(const CPDF_BookmarkTree& tree, 26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark bookmark, 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_WideString& title, 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::set<CPDF_Dictionary*>* visited) { 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Return if already checked to avoid circular calling. 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pdfium::ContainsKey(*visited, bookmark.GetDict())) 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CPDF_Bookmark(); 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann visited->insert(bookmark.GetDict()); 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bookmark.GetDict() && 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bookmark.GetTitle().CompareNoCase(title.c_str()) == 0) { 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // First check this item. 37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bookmark; 38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Go into children items. 41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark child = tree.GetFirstChild(bookmark); 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (child.GetDict() && !pdfium::ContainsKey(*visited, child.GetDict())) { 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Check this item and its children. 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Bookmark found = FindBookmark(tree, child, title, visited); 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (found.GetDict()) 46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return found; 47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann child = tree.GetNextSibling(child); 48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return CPDF_Bookmark(); 50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_LinkList* GetLinkList(CPDF_Page* page) { 53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!page) 54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = page->m_pDocument; 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_LinkList>* pHolder = pDoc->LinksContext(); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pHolder->get()) 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *pHolder = pdfium::MakeUnique<CPDF_LinkList>(); 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pHolder->get(); 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannunsigned long Utf16EncodeMaybeCopyAndReturnLength(const CFX_WideString& text, 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void* buffer, 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned long buflen) { 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString encodedText = text.UTF16LE_Encode(); 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned long len = encodedText.GetLength(); 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (buffer && len <= buflen) 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_memcpy(buffer, encodedText.c_str(), len); 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return len; 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} // namespace 74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_BOOKMARK STDCALL 76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFPDFBookmark_GetFirstChild(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict) { 77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_BookmarkTree tree(pDoc); 81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark bookmark = 82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); 83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return tree.GetFirstChild(bookmark).GetDict(); 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_BOOKMARK STDCALL 87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFPDFBookmark_GetNextSibling(FPDF_DOCUMENT document, FPDF_BOOKMARK pDict) { 88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_BookmarkTree tree(pDoc); 94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark bookmark = 95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); 96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return tree.GetNextSibling(bookmark).GetDict(); 97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT unsigned long STDCALL FPDFBookmark_GetTitle(FPDF_BOOKMARK pDict, 100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void* buffer, 101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann unsigned long buflen) { 102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); 105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString title = bookmark.GetTitle(); 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Utf16EncodeMaybeCopyAndReturnLength(title, buffer, buflen); 107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann} 108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, 110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_WIDESTRING title) { 111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!title || title[0] == 0) 112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_BookmarkTree tree(pDoc); 117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FX_STRSIZE len = CFX_WideString::WStringLength(title); 118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_WideString encodedTitle = CFX_WideString::FromUTF16LE(title, len); 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::set<CPDF_Dictionary*> visited; 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FindBookmark(tree, CPDF_Bookmark(), encodedTitle, &visited).GetDict(); 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, 124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_BOOKMARK pDict) { 125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); 131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dest dest = bookmark.GetDest(pDoc); 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dest.GetObject()) 133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return dest.GetObject(); 134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // If this bookmark is not directly associated with a dest, we try to get 135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // action 136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Action action = bookmark.GetAction(); 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!action.GetDict()) 138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return action.GetDest(pDoc).GetObject(); 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK pDict) { 143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict))); 146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return bookmark.GetAction().GetDict(); 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION pDict) { 150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDFACTION_UNSUPPORTED; 152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict))); 154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Action::ActionType type = action.GetType(); 155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann switch (type) { 156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case CPDF_Action::GoTo: 157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDFACTION_GOTO; 158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case CPDF_Action::GoToR: 159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDFACTION_REMOTEGOTO; 160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case CPDF_Action::URI: 161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDFACTION_URI; 162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann case CPDF_Action::Launch: 163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDFACTION_LAUNCH; 164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann default: 165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return PDFACTION_UNSUPPORTED; 166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, 170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_ACTION pDict) { 171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict))); 177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return action.GetDest(pDoc).GetObject(); 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannDLLEXPORT unsigned long STDCALL FPDFAction_GetFilePath(FPDF_ACTION pDict, 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void* buffer, 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned long buflen) { 183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann unsigned long type = FPDFAction_GetType(pDict); 184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (type != PDFACTION_REMOTEGOTO && type != PDFACTION_LAUNCH) 185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict))); 188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString path = action.GetFilePath().UTF8Encode(); 189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann unsigned long len = path.GetLength() + 1; 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (buffer && len <= buflen) 191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(buffer, path.c_str(), len); 192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return len; 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, 196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_ACTION pDict, 197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void* buffer, 198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann unsigned long buflen) { 199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict))); 205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CFX_ByteString path = action.GetURI(pDoc); 206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann unsigned long len = path.GetLength() + 1; 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (buffer && len <= buflen) 208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FXSYS_memcpy(buffer, path.c_str(), len); 209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return len; 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, 213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_DEST pDict) { 214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dest dest(static_cast<CPDF_Array*>(pDict)); 220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return dest.GetPageIndex(pDoc); 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannDLLEXPORT FPDF_BOOL STDCALL FPDFDest_GetLocationInPage(FPDF_DEST pDict, 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FPDF_BOOL* hasXVal, 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FPDF_BOOL* hasYVal, 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FPDF_BOOL* hasZoomVal, 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FS_FLOAT* x, 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FS_FLOAT* y, 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FS_FLOAT* zoom) { 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDict) 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Dest> dest( 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann new CPDF_Dest(static_cast<CPDF_Object*>(pDict))); 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // FPDF_BOOL is an int, GetXYZ expects bools. 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bHasX; 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bHasY; 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bHasZoom; 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!dest->GetXYZ(&bHasX, &bHasY, &bHasZoom, x, y, zoom)) 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *hasXVal = bHasX; 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *hasYVal = bHasY; 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *hasZoomVal = bHasZoom; 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannDLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann double x, 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann double y) { 252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Page* pPage = CPDFPageFromFPDFPage(page); 253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pPage) 254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_LinkList* pLinkList = GetLinkList(pPage); 257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pLinkList) 258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 26033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann return pLinkList 26133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ->GetLinkAtPoint( 26233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pPage, CFX_PointF(static_cast<FX_FLOAT>(x), static_cast<FX_FLOAT>(y)), 26333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann nullptr) 264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann .GetDict(); 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannDLLEXPORT int STDCALL FPDFLink_GetLinkZOrderAtPoint(FPDF_PAGE page, 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann double x, 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann double y) { 270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Page* pPage = CPDFPageFromFPDFPage(page); 271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pPage) 272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_LinkList* pLinkList = GetLinkList(pPage); 275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pLinkList) 276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return -1; 277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int z_order = -1; 27933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pLinkList->GetLinkAtPoint( 28033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann pPage, CFX_PointF(static_cast<FX_FLOAT>(x), static_cast<FX_FLOAT>(y)), 28133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann &z_order); 282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return z_order; 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, 286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_LINK pDict) { 287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Link link(ToDictionary(static_cast<CPDF_Object*>(pDict))); 293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_DEST dest = link.GetDest(pDoc).GetObject(); 294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (dest) 295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return dest; 296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann // If this link is not directly associated with a dest, we try to get action 297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Action action = link.GetAction(); 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!action.GetDict()) 299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return action.GetDest(pDoc).GetObject(); 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK pDict) { 304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return nullptr; 306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann 307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Link link(ToDictionary(static_cast<CPDF_Object*>(pDict))); 308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return link.GetAction().GetDict(); 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, 312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int* startPos, 313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_LINK* linkAnnot) { 314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!startPos || !linkAnnot) 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Page* pPage = CPDFPageFromFPDFPage(page); 317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pPage || !pPage->m_pFormDict) 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pAnnots = pPage->m_pFormDict->GetArrayFor("Annots"); 320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pAnnots) 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = *startPos; i < pAnnots->GetCount(); i++) { 323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pDict = 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToDictionary(static_cast<CPDF_Object*>(pAnnots->GetDirectObjectAt(i))); 325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDict) 326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann continue; 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pDict->GetStringFor("Subtype") == "Link") { 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *startPos = static_cast<int>(i + 1); 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *linkAnnot = static_cast<FPDF_LINK>(pDict); 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, 337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FS_RECTF* rect) { 338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!linkAnnot || !rect) 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAnnotDict = 341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ToDictionary(static_cast<CPDF_Object*>(linkAnnot)); 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_FloatRect rt = pAnnotDict->GetRectFor("Rect"); 343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect->left = rt.left; 344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect->bottom = rt.bottom; 345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect->right = rt.right; 346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann rect->top = rt.top; 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot) { 351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!linkAnnot) 352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAnnotDict = 354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ToDictionary(static_cast<CPDF_Object*>(linkAnnot)); 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints"); 356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pArray) 357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return static_cast<int>(pArray->GetCount() / 8); 359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannDLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, 362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann int quadIndex, 363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FS_QUADPOINTSF* quadPoints) { 364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!linkAnnot || !quadPoints) 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pAnnotDict = 367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann ToDictionary(static_cast<CPDF_Object*>(linkAnnot)); 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints"); 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pArray) 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (quadIndex < 0 || 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<size_t>(quadIndex) >= pArray->GetCount() / 8 || 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (static_cast<size_t>(quadIndex * 8 + 7) >= pArray->GetCount())) { 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann } 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann quadPoints->x1 = pArray->GetNumberAt(quadIndex * 8); 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann quadPoints->y1 = pArray->GetNumberAt(quadIndex * 8 + 1); 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann quadPoints->x2 = pArray->GetNumberAt(quadIndex * 8 + 2); 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann quadPoints->y2 = pArray->GetNumberAt(quadIndex * 8 + 3); 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann quadPoints->x3 = pArray->GetNumberAt(quadIndex * 8 + 4); 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann quadPoints->y3 = pArray->GetNumberAt(quadIndex * 8 + 5); 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann quadPoints->x4 = pArray->GetNumberAt(quadIndex * 8 + 6); 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann quadPoints->y4 = pArray->GetNumberAt(quadIndex * 8 + 7); 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannDLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT document, 390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann FPDF_BYTESTRING tag, 391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann void* buffer, 392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann unsigned long buflen) { 393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!tag) 394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); 396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pDoc) 397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann CPDF_Dictionary* pInfo = pDoc->GetInfo(); 399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann if (!pInfo) 400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann return 0; 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString text = pInfo->GetUnicodeTextFor(tag); 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Utf16EncodeMaybeCopyAndReturnLength(text, buffer, buflen); 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannDLLEXPORT unsigned long STDCALL FPDF_GetPageLabel(FPDF_DOCUMENT document, 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int page_index, 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann void* buffer, 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned long buflen) { 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (page_index < 0) 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // CPDF_PageLabel can deal with NULL |document|. 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_PageLabel label(CPDFDocumentFromFPDFDocument(document)); 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString str; 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!label.GetLabel(page_index, &str)) 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Utf16EncodeMaybeCopyAndReturnLength(str, buffer, buflen); 418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 419