blob: b9cf69d647341ce90fbee7ded074e33c36be4840 [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
Tom Sepez1ed8a212015-05-11 15:25:39 -07007#include "../../public/fpdf_dataavail.h"
8#include "../../public/fpdf_formfill.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07009#include "../include/fsdk_define.h"
Bo Xufdc00a72014-10-28 23:03:33 -070010#include "../include/fpdfxfa/fpdfxfa_doc.h"
Bo Xufdc00a72014-10-28 23:03:33 -070011#include "../include/fpdfxfa/fpdfxfa_app.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070012
13extern void ProcessParseError(FX_DWORD err_code);
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
Nico Weber9d8ec5a2015-08-04 13:00:21 -070093DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail,
94 FX_DOWNLOADHINTS* hints) {
95 if (avail == NULL || hints == NULL)
96 return 0;
97 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 -0700101extern void CheckUnSupportError(CPDF_Document* pDoc, FX_DWORD err_code);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700102
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700103DLLEXPORT FPDF_DOCUMENT STDCALL
104FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password) {
105 if (avail == NULL)
106 return NULL;
Tom Sepezae51c812015-08-05 12:34:06 -0700107 CPDF_Parser* pParser = new CPDF_Parser;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700108 pParser->SetPassword(password);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700109
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700110 FX_DWORD err_code = pParser->StartAsynParse(
111 ((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());
112 if (err_code) {
113 delete pParser;
114 ProcessParseError(err_code);
115 return NULL;
116 }
117 ((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());
118 CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
119 CPDF_Document* pPDFDoc = pParser->GetDocument();
120 CPDFXFA_App* pApp = CPDFXFA_App::GetInstance();
Tom Sepezae51c812015-08-05 12:34:06 -0700121 CPDFXFA_Document* pDocument = new CPDFXFA_Document(pPDFDoc, pApp);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700122 return pDocument;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700123}
124
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700125DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) {
126 if (doc == NULL)
127 return 0;
128 CPDF_Document* pDoc = ((CPDFXFA_Document*)doc)->GetPDFDoc();
129 return ((CPDF_Parser*)pDoc->GetParser())->GetFirstPageNo();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700130}
131
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700132DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail,
133 int page_index,
134 FX_DOWNLOADHINTS* hints) {
135 if (avail == NULL || hints == NULL)
136 return 0;
137 CFPDF_DownloadHintsWrap hints_wrap(hints);
138 return ((CFPDF_DataAvail*)avail)
139 ->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700140}
141
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700142DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail,
143 FX_DOWNLOADHINTS* hints) {
144 if (avail == NULL || hints == NULL)
145 return -1;
146 CFPDF_DownloadHintsWrap hints_wrap(hints);
147 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700148}
149
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700150DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail) {
151 if (avail == NULL)
152 return -1;
153 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700154}