blob: 0bd5add9a7cd61d697d4d4d9dc52498f3be3fee3 [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
Bo Xufdc00a72014-10-28 23:03:33 -07009#include "../include/fpdfxfa/fpdfxfa_app.h"
Lei Zhangbde53d22015-11-12 22:21:30 -080010#include "../include/fpdfxfa/fpdfxfa_doc.h"
11#include "fpdfsdk/include/fsdk_define.h"
Lei Zhangb4e7f302015-11-06 15:52:32 -080012#include "public/fpdf_formfill.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070013
Nico Weber9d8ec5a2015-08-04 13:00:21 -070014class CFPDF_FileAvailWrap : public IFX_FileAvail {
15 public:
16 CFPDF_FileAvailWrap() { m_pfileAvail = NULL; }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070017 ~CFPDF_FileAvailWrap() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070018
Nico Weber9d8ec5a2015-08-04 13:00:21 -070019 void Set(FX_FILEAVAIL* pfileAvail) { m_pfileAvail = pfileAvail; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020
Lei Zhang2b1a2d52015-08-14 22:16:22 -070021 // IFX_FileAvail
22 FX_BOOL IsDataAvail(FX_FILESIZE offset, FX_DWORD size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070023 return m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);
24 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070025
Nico Weber9d8ec5a2015-08-04 13:00:21 -070026 private:
27 FX_FILEAVAIL* m_pfileAvail;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070028};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070029
Nico Weber9d8ec5a2015-08-04 13:00:21 -070030class CFPDF_FileAccessWrap : public IFX_FileRead {
31 public:
32 CFPDF_FileAccessWrap() { m_pFileAccess = NULL; }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070033 ~CFPDF_FileAccessWrap() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070034
Nico Weber9d8ec5a2015-08-04 13:00:21 -070035 void Set(FPDF_FILEACCESS* pFile) { m_pFileAccess = pFile; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070036
Lei Zhang2b1a2d52015-08-14 22:16:22 -070037 // IFX_FileRead
38 FX_FILESIZE GetSize() override { return m_pFileAccess->m_FileLen; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070039
Lei Zhang2b1a2d52015-08-14 22:16:22 -070040 FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070041 return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset,
42 (uint8_t*)buffer, size);
43 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070044
Lei Zhang2b1a2d52015-08-14 22:16:22 -070045 void Release() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070046
Nico Weber9d8ec5a2015-08-04 13:00:21 -070047 private:
48 FPDF_FILEACCESS* m_pFileAccess;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070049};
50
Nico Weber9d8ec5a2015-08-04 13:00:21 -070051class CFPDF_DownloadHintsWrap : public IFX_DownloadHints {
52 public:
Lei Zhang2b1a2d52015-08-14 22:16:22 -070053 explicit CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070054 m_pDownloadHints = pDownloadHints;
55 }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070056 ~CFPDF_DownloadHintsWrap() override {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -070057
58 public:
Lei Zhang2b1a2d52015-08-14 22:16:22 -070059 // IFX_DownloadHints
60 void AddSegment(FX_FILESIZE offset, FX_DWORD size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070061 m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
62 }
63
64 private:
65 FX_DOWNLOADHINTS* m_pDownloadHints;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070066};
67
Nico Weber9d8ec5a2015-08-04 13:00:21 -070068class CFPDF_DataAvail {
69 public:
70 CFPDF_DataAvail() { m_pDataAvail = NULL; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070071
Nico Weber9d8ec5a2015-08-04 13:00:21 -070072 ~CFPDF_DataAvail() { delete m_pDataAvail; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070073
Nico Weber9d8ec5a2015-08-04 13:00:21 -070074 IPDF_DataAvail* m_pDataAvail;
75 CFPDF_FileAvailWrap m_FileAvail;
76 CFPDF_FileAccessWrap m_FileRead;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070077};
78
Nico Weber9d8ec5a2015-08-04 13:00:21 -070079DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail,
80 FPDF_FILEACCESS* file) {
Tom Sepezae51c812015-08-05 12:34:06 -070081 CFPDF_DataAvail* pAvail = new CFPDF_DataAvail;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070082 pAvail->m_FileAvail.Set(file_avail);
83 pAvail->m_FileRead.Set(file);
84 pAvail->m_pDataAvail =
85 IPDF_DataAvail::Create(&pAvail->m_FileAvail, &pAvail->m_FileRead);
86 return pAvail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070087}
88
Nico Weber9d8ec5a2015-08-04 13:00:21 -070089DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail) {
90 delete (CFPDF_DataAvail*)avail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070091}
92
Jun Fangdf7f3662015-11-10 18:29:18 +080093DLLEXPORT int STDCALL
94FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints) {
95 if (!avail || !hints)
96 return PDF_DATA_ERROR;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070097 CFPDF_DownloadHintsWrap hints_wrap(hints);
98 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070099}
100
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700101DLLEXPORT FPDF_DOCUMENT STDCALL
102FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password) {
103 if (avail == NULL)
104 return NULL;
Tom Sepezae51c812015-08-05 12:34:06 -0700105 CPDF_Parser* pParser = new CPDF_Parser;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700106 pParser->SetPassword(password);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700107
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700108 FX_DWORD err_code = pParser->StartAsynParse(
109 ((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());
110 if (err_code) {
111 delete pParser;
112 ProcessParseError(err_code);
113 return NULL;
114 }
115 ((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());
116 CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
Tom Sepezbf59a072015-10-21 14:07:23 -0700117 return FPDFDocumentFromCPDFDocument(pParser->GetDocument());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700118}
119
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700120DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) {
Tom Sepez471a1032015-10-15 16:17:18 -0700121 CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc);
122 return pDoc ? pDoc->GetParser()->GetFirstPageNo() : 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700123}
124
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700125DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail,
126 int page_index,
127 FX_DOWNLOADHINTS* hints) {
Jun Fangdf7f3662015-11-10 18:29:18 +0800128 if (!avail || !hints)
129 return PDF_DATA_ERROR;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700130 CFPDF_DownloadHintsWrap hints_wrap(hints);
131 return ((CFPDF_DataAvail*)avail)
132 ->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700133}
134
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700135DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail,
136 FX_DOWNLOADHINTS* hints) {
Jun Fangdf7f3662015-11-10 18:29:18 +0800137 if (!avail || !hints)
138 return PDF_FORM_ERROR;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700139 CFPDF_DownloadHintsWrap hints_wrap(hints);
140 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700141}
142
Jun Fangdf7f3662015-11-10 18:29:18 +0800143DLLEXPORT int STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail) {
144 if (!avail)
145 return PDF_LINEARIZATION_UNKNOWN;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700147}