blob: baf8f9c924947a5c08c6a0dac9d5b7000b59e4e1 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Lei Zhangb4e7f302015-11-06 15:52:32 -08007#include "public/fpdf_dataavail.h"
8
Lei Zhangbde53d22015-11-12 22:21:30 -08009#include "fpdfsdk/include/fsdk_define.h"
Lei Zhangb4e7f302015-11-06 15:52:32 -080010#include "public/fpdf_formfill.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070011
Tom Sepezc7e4c4f2015-11-20 09:45:24 -080012// These checks are here because core/ and public/ cannot depend on each other.
13static_assert(IPDF_DataAvail::DataError == PDF_DATA_ERROR,
14 "IPDF_DataAvail::DataError value mismatch");
15static_assert(IPDF_DataAvail::DataNotAvailable == PDF_DATA_NOTAVAIL,
16 "IPDF_DataAvail::DataNotAvailable value mismatch");
17static_assert(IPDF_DataAvail::DataAvailable == PDF_DATA_AVAIL,
18 "IPDF_DataAvail::DataAvailable value mismatch");
19
20static_assert(IPDF_DataAvail::LinearizationUnknown == PDF_LINEARIZATION_UNKNOWN,
21 "IPDF_DataAvail::LinearizationUnknown value mismatch");
22static_assert(IPDF_DataAvail::NotLinearized == PDF_NOT_LINEARIZED,
23 "IPDF_DataAvail::NotLinearized value mismatch");
24static_assert(IPDF_DataAvail::Linearized == PDF_LINEARIZED,
25 "IPDF_DataAvail::Linearized value mismatch");
26
27static_assert(IPDF_DataAvail::FormError == PDF_FORM_ERROR,
28 "IPDF_DataAvail::FormError value mismatch");
29static_assert(IPDF_DataAvail::FormNotAvailable == PDF_FORM_NOTAVAIL,
30 "IPDF_DataAvail::FormNotAvailable value mismatch");
31static_assert(IPDF_DataAvail::FormAvailable == PDF_FORM_AVAIL,
32 "IPDF_DataAvail::FormAvailable value mismatch");
33static_assert(IPDF_DataAvail::FormNotExist == PDF_FORM_NOTEXIST,
34 "IPDF_DataAvail::FormNotExist value mismatch");
35
Nico Weber9d8ec5a2015-08-04 13:00:21 -070036class CFPDF_FileAvailWrap : public IFX_FileAvail {
37 public:
38 CFPDF_FileAvailWrap() { m_pfileAvail = NULL; }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070039 ~CFPDF_FileAvailWrap() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070040
Nico Weber9d8ec5a2015-08-04 13:00:21 -070041 void Set(FX_FILEAVAIL* pfileAvail) { m_pfileAvail = pfileAvail; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070042
Lei Zhang2b1a2d52015-08-14 22:16:22 -070043 // IFX_FileAvail
44 FX_BOOL IsDataAvail(FX_FILESIZE offset, FX_DWORD size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070045 return m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);
46 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070047
Nico Weber9d8ec5a2015-08-04 13:00:21 -070048 private:
49 FX_FILEAVAIL* m_pfileAvail;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070050};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070051
Nico Weber9d8ec5a2015-08-04 13:00:21 -070052class CFPDF_FileAccessWrap : public IFX_FileRead {
53 public:
54 CFPDF_FileAccessWrap() { m_pFileAccess = NULL; }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070055 ~CFPDF_FileAccessWrap() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070056
Nico Weber9d8ec5a2015-08-04 13:00:21 -070057 void Set(FPDF_FILEACCESS* pFile) { m_pFileAccess = pFile; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070058
Lei Zhang2b1a2d52015-08-14 22:16:22 -070059 // IFX_FileRead
60 FX_FILESIZE GetSize() override { return m_pFileAccess->m_FileLen; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070061
Lei Zhang2b1a2d52015-08-14 22:16:22 -070062 FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070063 return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset,
64 (uint8_t*)buffer, size);
65 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070066
Lei Zhang2b1a2d52015-08-14 22:16:22 -070067 void Release() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070068
Nico Weber9d8ec5a2015-08-04 13:00:21 -070069 private:
70 FPDF_FILEACCESS* m_pFileAccess;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070071};
72
Nico Weber9d8ec5a2015-08-04 13:00:21 -070073class CFPDF_DownloadHintsWrap : public IFX_DownloadHints {
74 public:
Lei Zhang2b1a2d52015-08-14 22:16:22 -070075 explicit CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070076 m_pDownloadHints = pDownloadHints;
77 }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070078 ~CFPDF_DownloadHintsWrap() override {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -070079
80 public:
Lei Zhang2b1a2d52015-08-14 22:16:22 -070081 // IFX_DownloadHints
82 void AddSegment(FX_FILESIZE offset, FX_DWORD size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070083 m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
84 }
85
86 private:
87 FX_DOWNLOADHINTS* m_pDownloadHints;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070088};
89
Nico Weber9d8ec5a2015-08-04 13:00:21 -070090class CFPDF_DataAvail {
91 public:
92 CFPDF_DataAvail() { m_pDataAvail = NULL; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070093
Nico Weber9d8ec5a2015-08-04 13:00:21 -070094 ~CFPDF_DataAvail() { delete m_pDataAvail; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070095
Nico Weber9d8ec5a2015-08-04 13:00:21 -070096 IPDF_DataAvail* m_pDataAvail;
97 CFPDF_FileAvailWrap m_FileAvail;
98 CFPDF_FileAccessWrap m_FileRead;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070099};
100
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700101DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail,
102 FPDF_FILEACCESS* file) {
Tom Sepezae51c812015-08-05 12:34:06 -0700103 CFPDF_DataAvail* pAvail = new CFPDF_DataAvail;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700104 pAvail->m_FileAvail.Set(file_avail);
105 pAvail->m_FileRead.Set(file);
106 pAvail->m_pDataAvail =
107 IPDF_DataAvail::Create(&pAvail->m_FileAvail, &pAvail->m_FileRead);
108 return pAvail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700109}
110
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700111DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail) {
112 delete (CFPDF_DataAvail*)avail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700113}
114
Jun Fangdf7f3662015-11-10 18:29:18 +0800115DLLEXPORT int STDCALL
116FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints) {
117 if (!avail || !hints)
118 return PDF_DATA_ERROR;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700119 CFPDF_DownloadHintsWrap hints_wrap(hints);
120 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700121}
122
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700123DLLEXPORT FPDF_DOCUMENT STDCALL
124FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password) {
Tom Sepezf10ae632016-01-26 14:19:52 -0800125 CFPDF_DataAvail* pDataAvail = static_cast<CFPDF_DataAvail*>(avail);
126 if (!pDataAvail)
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700127 return NULL;
Tom Sepezf10ae632016-01-26 14:19:52 -0800128
Tom Sepezae51c812015-08-05 12:34:06 -0700129 CPDF_Parser* pParser = new CPDF_Parser;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700130 pParser->SetPassword(password);
Tom Sepezf10ae632016-01-26 14:19:52 -0800131 CPDF_Parser::Error error =
132 pParser->StartAsynParse(pDataAvail->m_pDataAvail->GetFileRead());
133 if (error != CPDF_Parser::SUCCESS) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700134 delete pParser;
Tom Sepezf10ae632016-01-26 14:19:52 -0800135 ProcessParseError(error);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700136 return NULL;
137 }
Tom Sepezf10ae632016-01-26 14:19:52 -0800138 pDataAvail->m_pDataAvail->SetDocument(pParser->GetDocument());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700139 CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
Tom Sepezbf59a072015-10-21 14:07:23 -0700140 return FPDFDocumentFromCPDFDocument(pParser->GetDocument());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700141}
142
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700143DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) {
Tom Sepez471a1032015-10-15 16:17:18 -0700144 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc);
145 return pDoc ? pDoc->GetParser()->GetFirstPageNo() : 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700146}
147
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700148DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail,
149 int page_index,
150 FX_DOWNLOADHINTS* hints) {
Jun Fangdf7f3662015-11-10 18:29:18 +0800151 if (!avail || !hints)
152 return PDF_DATA_ERROR;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700153 CFPDF_DownloadHintsWrap hints_wrap(hints);
154 return ((CFPDF_DataAvail*)avail)
155 ->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700156}
157
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700158DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail,
159 FX_DOWNLOADHINTS* hints) {
Jun Fangdf7f3662015-11-10 18:29:18 +0800160 if (!avail || !hints)
161 return PDF_FORM_ERROR;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700162 CFPDF_DownloadHintsWrap hints_wrap(hints);
163 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700164}
165
Jun Fangdf7f3662015-11-10 18:29:18 +0800166DLLEXPORT int STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail) {
167 if (!avail)
168 return PDF_LINEARIZATION_UNKNOWN;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700169 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700170}