Chromium Code Reviews| 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 "../../core/include/fpdfapi/fpdf_module.h" | 7 #include "../../core/include/fpdfapi/fpdf_module.h" |
| 8 #include "../../core/include/fxcodec/fx_codec.h" | 8 #include "../../core/include/fxcodec/fx_codec.h" |
| 9 #include "../../core/include/fxcrt/fx_safe_types.h" | 9 #include "../../core/include/fxcrt/fx_safe_types.h" |
| 10 #include "../../public/fpdf_ext.h" | 10 #include "../../public/fpdf_ext.h" |
| 11 #include "../../public/fpdf_formfill.h" | 11 #include "../../public/fpdf_formfill.h" |
| 12 #include "../../public/fpdf_progressive.h" | 12 #include "../../public/fpdf_progressive.h" |
| 13 #include "../../public/fpdfview.h" | 13 #include "../../public/fpdfview.h" |
| 14 #include "../../third_party/base/nonstd_unique_ptr.h" | 14 #include "../../third_party/base/nonstd_unique_ptr.h" |
| 15 #include "../../third_party/base/numerics/safe_conversions_impl.h" | 15 #include "../../third_party/base/numerics/safe_conversions_impl.h" |
| 16 #include "../include/fsdk_define.h" | 16 #include "../include/fsdk_define.h" |
| 17 #include "../include/fsdk_mgr.h" | 17 #include "../include/fsdk_mgr.h" |
| 18 #include "../include/fsdk_rendercontext.h" | 18 #include "../include/fsdk_rendercontext.h" |
| 19 #include "../include/fpdfxfa/fpdfxfa_doc.h" | 19 #include "../include/fpdfxfa/fpdfxfa_doc.h" |
| 20 #include "../include/fpdfxfa/fpdfxfa_app.h" | 20 #include "../include/fpdfxfa/fpdfxfa_app.h" |
| 21 #include "../include/fpdfxfa/fpdfxfa_page.h" | 21 #include "../include/fpdfxfa/fpdfxfa_page.h" |
| 22 #include "../include/fpdfxfa/fpdfxfa_util.h" | 22 #include "../include/fpdfxfa/fpdfxfa_util.h" |
| 23 #include "../include/javascript/IJavaScript.h" | 23 #include "../include/javascript/IJavaScript.h" |
| 24 | 24 |
| 25 CPDF_Document* CPDFDocumentFromFPDFDocument(FPDF_DOCUMENT doc) { | |
| 26 return doc ? static_cast<CPDFXFA_Document*>(doc)->GetPDFDoc() : nullptr; | |
| 27 } | |
| 28 | |
| 25 CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { | 29 CFPDF_FileStream::CFPDF_FileStream(FPDF_FILEHANDLER* pFS) { |
| 26 m_pFS = pFS; | 30 m_pFS = pFS; |
| 27 m_nCurPos = 0; | 31 m_nCurPos = 0; |
| 28 } | 32 } |
| 29 | 33 |
| 30 IFX_FileStream* CFPDF_FileStream::Retain() { | 34 IFX_FileStream* CFPDF_FileStream::Retain() { |
| 31 return this; | 35 return this; |
| 32 } | 36 } |
| 33 | 37 |
| 34 void CFPDF_FileStream::Release() { | 38 void CFPDF_FileStream::Release() { |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 CPDF_Document* pPDFDoc = pParser->GetDocument(); | 372 CPDF_Document* pPDFDoc = pParser->GetDocument(); |
| 369 if (!pPDFDoc) | 373 if (!pPDFDoc) |
| 370 return NULL; | 374 return NULL; |
| 371 | 375 |
| 372 CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); | 376 CPDFXFA_App* pProvider = CPDFXFA_App::GetInstance(); |
| 373 return new CPDFXFA_Document(pPDFDoc, pProvider); | 377 return new CPDFXFA_Document(pPDFDoc, pProvider); |
| 374 } | 378 } |
| 375 | 379 |
| 376 DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, | 380 DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, |
| 377 int* fileVersion) { | 381 int* fileVersion) { |
| 378 if (!doc || !fileVersion) | 382 if (!fileVersion) |
| 379 return FALSE; | 383 return FALSE; |
| 384 | |
| 380 *fileVersion = 0; | 385 *fileVersion = 0; |
|
Lei Zhang
2015/10/15 22:44:27
There's a subtle behavior change, but I don't thin
Tom Sepez
2015/10/15 23:18:09
Yes, intentional, was trying to avoid an uninitial
| |
| 381 CPDFXFA_Document* pDoc = (CPDFXFA_Document*)doc; | 386 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc); |
| 382 CPDF_Document* pPDFDoc = pDoc->GetPDFDoc(); | 387 if (!pDoc) |
| 383 if (!pPDFDoc) | 388 return FALSE; |
| 384 return (FX_DWORD)-1; | |
|
Lei Zhang
2015/10/15 22:44:27
:\
| |
| 385 CPDF_Parser* pParser = (CPDF_Parser*)pPDFDoc->GetParser(); | |
| 386 | 389 |
| 390 CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser(); | |
|
Lei Zhang
2015/10/15 22:44:27
Same pointless cast? More below.
Tom Sepez
2015/10/15 23:18:09
And you know what we do to pointless casts.
| |
| 387 if (!pParser) | 391 if (!pParser) |
| 388 return FALSE; | 392 return FALSE; |
| 393 | |
| 389 *fileVersion = pParser->GetFileVersion(); | 394 *fileVersion = pParser->GetFileVersion(); |
| 390 return TRUE; | 395 return TRUE; |
| 391 } | 396 } |
| 392 | 397 |
| 393 // jabdelmalek: changed return type from FX_DWORD to build on Linux (and match | 398 // jabdelmalek: changed return type from FX_DWORD to build on Linux (and match |
| 394 // header). | 399 // header). |
| 395 DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document) { | 400 DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document) { |
| 396 if (document == NULL) | 401 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 397 return 0; | 402 if (!pDoc) |
| 398 CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document; | |
| 399 CPDF_Document* pPDFDoc = pDoc->GetPDFDoc(); | |
| 400 if (!pPDFDoc) | |
| 401 return (FX_DWORD)-1; | |
| 402 CPDF_Parser* pParser = (CPDF_Parser*)pPDFDoc->GetParser(); | |
| 403 CPDF_Dictionary* pDict = pParser->GetEncryptDict(); | |
| 404 if (pDict == NULL) | |
| 405 return (FX_DWORD)-1; | 403 return (FX_DWORD)-1; |
| 406 | 404 |
| 407 return pDict->GetInteger("P"); | 405 CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser(); |
| 406 CPDF_Dictionary* pDict = pParser->GetEncryptDict(); | |
| 407 return pDict ? pDict->GetInteger("P") : (FX_DWORD)-1; | |
| 408 } | 408 } |
| 409 | 409 |
| 410 DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document) { | 410 DLLEXPORT int STDCALL FPDF_GetSecurityHandlerRevision(FPDF_DOCUMENT document) { |
| 411 if (document == NULL) | 411 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 412 if (!pDoc) | |
| 412 return -1; | 413 return -1; |
| 413 CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc(); | 414 |
| 414 CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser(); | 415 CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser(); |
| 415 CPDF_Dictionary* pDict = pParser->GetEncryptDict(); | 416 CPDF_Dictionary* pDict = pParser->GetEncryptDict(); |
| 416 if (pDict == NULL) | 417 return pDict ? pDict->GetInteger("R") : -1; |
| 417 return -1; | |
| 418 | |
| 419 return pDict->GetInteger("R"); | |
| 420 } | 418 } |
| 421 | 419 |
| 422 DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document) { | 420 DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document) { |
| 423 if (document == NULL) | 421 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 424 return 0; | 422 return pDoc ? pDoc->GetPageCount() : 0; |
| 425 CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document; | |
| 426 return pDoc->GetPageCount(); | |
| 427 //» return ((CPDF_Document*)document)->GetPageCount(); | |
| 428 } | 423 } |
| 429 | 424 |
| 430 DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, | 425 DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, |
| 431 int page_index) { | 426 int page_index) { |
| 432 if (document == NULL) | 427 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 433 return NULL; | 428 if (!pDoc) |
| 434 CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document; | 429 return nullptr; |
| 435 if (page_index < 0 || page_index >= pDoc->GetPageCount()) | 430 |
| 436 return NULL; | 431 if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) |
| 437 //» CPDF_Parser* pParser = (CPDF_Parser*)document; | 432 return nullptr; |
| 433 | |
| 438 return pDoc->GetPage(page_index); | 434 return pDoc->GetPage(page_index); |
| 439 } | 435 } |
| 440 | 436 |
| 441 DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page) { | 437 DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page) { |
| 442 if (!page) | 438 if (!page) |
| 443 return 0.0; | 439 return 0.0; |
| 444 return ((CPDFXFA_Page*)page)->GetPageWidth(); | 440 return ((CPDFXFA_Page*)page)->GetPageWidth(); |
| 445 // return ((CPDF_Page*)page)->GetPageWidth(); | 441 // return ((CPDF_Page*)page)->GetPageWidth(); |
| 446 } | 442 } |
| 447 | 443 |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 666 | 662 |
| 667 DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page) { | 663 DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page) { |
| 668 if (!page) | 664 if (!page) |
| 669 return; | 665 return; |
| 670 | 666 |
| 671 CPDFXFA_Page* pPage = (CPDFXFA_Page*)page; | 667 CPDFXFA_Page* pPage = (CPDFXFA_Page*)page; |
| 672 pPage->Release(); | 668 pPage->Release(); |
| 673 } | 669 } |
| 674 | 670 |
| 675 DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document) { | 671 DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document) { |
| 676 if (!document) | 672 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
|
Lei Zhang
2015/10/15 22:44:27
Do we even need the variable anymore?
Tom Sepez
2015/10/15 23:18:09
Done.
| |
| 677 return; | |
| 678 | |
| 679 CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document; | |
| 680 delete pDoc; | 673 delete pDoc; |
| 681 } | 674 } |
| 682 | 675 |
| 683 DLLEXPORT unsigned long STDCALL FPDF_GetLastError() { | 676 DLLEXPORT unsigned long STDCALL FPDF_GetLastError() { |
| 684 return GetLastError(); | 677 return GetLastError(); |
| 685 } | 678 } |
| 686 | 679 |
| 687 DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, | 680 DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, |
| 688 int start_x, | 681 int start_x, |
| 689 int start_y, | 682 int start_y, |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 892 return FALSE; | 885 return FALSE; |
| 893 | 886 |
| 894 *width = pPage->GetPageWidth(); | 887 *width = pPage->GetPageWidth(); |
| 895 *height = pPage->GetPageHeight(); | 888 *height = pPage->GetPageHeight(); |
| 896 | 889 |
| 897 return TRUE; | 890 return TRUE; |
| 898 } | 891 } |
| 899 | 892 |
| 900 DLLEXPORT FPDF_BOOL STDCALL | 893 DLLEXPORT FPDF_BOOL STDCALL |
| 901 FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document) { | 894 FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document) { |
| 902 CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document; | 895 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 903 if (!pDoc) | 896 if (!pDoc) |
| 904 return TRUE; | 897 return TRUE; |
| 905 CPDF_Document* pPDFDoc = pDoc->GetPDFDoc(); | 898 CPDF_ViewerPreferences viewRef(pDoc); |
| 906 if (!pPDFDoc) | |
| 907 return TRUE; | |
| 908 CPDF_ViewerPreferences viewRef(pPDFDoc); | |
| 909 return viewRef.PrintScaling(); | 899 return viewRef.PrintScaling(); |
| 910 } | 900 } |
| 911 | 901 |
| 912 DLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document) { | 902 DLLEXPORT int STDCALL FPDF_VIEWERREF_GetNumCopies(FPDF_DOCUMENT document) { |
| 913 CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc(); | 903 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 914 if (!pDoc) | 904 if (!pDoc) |
| 915 return 1; | 905 return 1; |
| 916 CPDF_ViewerPreferences viewRef(pDoc); | 906 CPDF_ViewerPreferences viewRef(pDoc); |
| 917 return viewRef.NumCopies(); | 907 return viewRef.NumCopies(); |
| 918 } | 908 } |
| 919 | 909 |
| 920 DLLEXPORT FPDF_PAGERANGE STDCALL | 910 DLLEXPORT FPDF_PAGERANGE STDCALL |
| 921 FPDF_VIEWERREF_GetPrintPageRange(FPDF_DOCUMENT document) { | 911 FPDF_VIEWERREF_GetPrintPageRange(FPDF_DOCUMENT document) { |
| 922 CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc(); | 912 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 923 if (!pDoc) | 913 if (!pDoc) |
| 924 return NULL; | 914 return NULL; |
| 925 CPDF_ViewerPreferences viewRef(pDoc); | 915 CPDF_ViewerPreferences viewRef(pDoc); |
| 926 return viewRef.PrintPageRange(); | 916 return viewRef.PrintPageRange(); |
| 927 } | 917 } |
| 928 | 918 |
| 929 DLLEXPORT FPDF_DUPLEXTYPE STDCALL | 919 DLLEXPORT FPDF_DUPLEXTYPE STDCALL |
| 930 FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT document) { | 920 FPDF_VIEWERREF_GetDuplex(FPDF_DOCUMENT document) { |
| 931 CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc(); | 921 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 932 if (!pDoc) | 922 if (!pDoc) |
| 933 return DuplexUndefined; | 923 return DuplexUndefined; |
| 934 CPDF_ViewerPreferences viewRef(pDoc); | 924 CPDF_ViewerPreferences viewRef(pDoc); |
| 935 CFX_ByteString duplex = viewRef.Duplex(); | 925 CFX_ByteString duplex = viewRef.Duplex(); |
| 936 if (FX_BSTRC("Simplex") == duplex) | 926 if (FX_BSTRC("Simplex") == duplex) |
| 937 return Simplex; | 927 return Simplex; |
| 938 if (FX_BSTRC("DuplexFlipShortEdge") == duplex) | 928 if (FX_BSTRC("DuplexFlipShortEdge") == duplex) |
| 939 return DuplexFlipShortEdge; | 929 return DuplexFlipShortEdge; |
| 940 if (FX_BSTRC("DuplexFlipLongEdge") == duplex) | 930 if (FX_BSTRC("DuplexFlipLongEdge") == duplex) |
| 941 return DuplexFlipLongEdge; | 931 return DuplexFlipLongEdge; |
| 942 return DuplexUndefined; | 932 return DuplexUndefined; |
| 943 } | 933 } |
| 944 | 934 |
| 945 DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { | 935 DLLEXPORT FPDF_DWORD STDCALL FPDF_CountNamedDests(FPDF_DOCUMENT document) { |
| 946 if (!document) | 936 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 937 if (!pDoc) | |
| 947 return 0; | 938 return 0; |
| 948 CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc(); | |
| 949 | 939 |
| 950 CPDF_Dictionary* pRoot = pDoc->GetRoot(); | 940 CPDF_Dictionary* pRoot = pDoc->GetRoot(); |
| 951 if (!pRoot) | 941 if (!pRoot) |
| 952 return 0; | 942 return 0; |
| 953 | 943 |
| 954 CPDF_NameTree nameTree(pDoc, FX_BSTRC("Dests")); | 944 CPDF_NameTree nameTree(pDoc, FX_BSTRC("Dests")); |
| 955 int count = nameTree.GetCount(); | 945 int count = nameTree.GetCount(); |
| 956 CPDF_Dictionary* pDest = pRoot->GetDict(FX_BSTRC("Dests")); | 946 CPDF_Dictionary* pDest = pRoot->GetDict(FX_BSTRC("Dests")); |
| 957 if (pDest) | 947 if (pDest) |
| 958 count += pDest->GetCount(); | 948 count += pDest->GetCount(); |
| 959 return count; | 949 return count; |
| 960 } | 950 } |
| 961 | 951 |
| 962 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, | 952 DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document, |
| 963 FPDF_BYTESTRING name) { | 953 FPDF_BYTESTRING name) { |
| 964 if (!document) | |
| 965 return NULL; | |
| 966 if (!name || name[0] == 0) | 954 if (!name || name[0] == 0) |
| 967 return NULL; | 955 return nullptr; |
| 968 | 956 |
| 969 CPDFXFA_Document* pDoc = (CPDFXFA_Document*)document; | 957 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document); |
| 970 CPDF_Document* pPDFDoc = pDoc->GetPDFDoc(); | 958 if (!pDoc) |
| 971 if (!pPDFDoc) | 959 return nullptr; |
| 972 return NULL; | 960 |
| 973 CPDF_NameTree name_tree(pPDFDoc, FX_BSTRC("Dests")); | 961 CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests")); |
| 974 return name_tree.LookupNamedDest(pPDFDoc, name); | 962 return name_tree.LookupNamedDest(pDoc, name); |
| 975 } | 963 } |
| 976 | 964 |
| 977 FPDF_RESULT FPDF_BStr_Init(FPDF_BSTR* str) { | 965 FPDF_RESULT FPDF_BStr_Init(FPDF_BSTR* str) { |
| 978 if (!str) | 966 if (!str) |
| 979 return -1; | 967 return -1; |
| 980 | 968 |
| 981 FXSYS_memset(str, 0, sizeof(FPDF_BSTR)); | 969 FXSYS_memset(str, 0, sizeof(FPDF_BSTR)); |
| 982 return 0; | 970 return 0; |
| 983 } | 971 } |
| 984 | 972 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1079 if (!buffer) { | 1067 if (!buffer) { |
| 1080 *buflen = len; | 1068 *buflen = len; |
| 1081 } else if (*buflen >= len) { | 1069 } else if (*buflen >= len) { |
| 1082 memcpy(buffer, utf16Name.c_str(), len); | 1070 memcpy(buffer, utf16Name.c_str(), len); |
| 1083 *buflen = len; | 1071 *buflen = len; |
| 1084 } else { | 1072 } else { |
| 1085 *buflen = -1; | 1073 *buflen = -1; |
| 1086 } | 1074 } |
| 1087 return (FPDF_DEST)pDestObj; | 1075 return (FPDF_DEST)pDestObj; |
| 1088 } | 1076 } |
| OLD | NEW |