blob: d3b44160a8104898b88eb1545a0107371ffd9925 [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
Nico Weber9d8ec5a2015-08-04 13:00:21 -070013class CFPDF_FileAvailWrap : public IFX_FileAvail {
14 public:
15 CFPDF_FileAvailWrap() { m_pfileAvail = NULL; }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070016 ~CFPDF_FileAvailWrap() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070017
Nico Weber9d8ec5a2015-08-04 13:00:21 -070018 void Set(FX_FILEAVAIL* pfileAvail) { m_pfileAvail = pfileAvail; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070019
Lei Zhang2b1a2d52015-08-14 22:16:22 -070020 // IFX_FileAvail
21 FX_BOOL IsDataAvail(FX_FILESIZE offset, FX_DWORD size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070022 return m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);
23 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070024
Nico Weber9d8ec5a2015-08-04 13:00:21 -070025 private:
26 FX_FILEAVAIL* m_pfileAvail;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070027};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070028
Nico Weber9d8ec5a2015-08-04 13:00:21 -070029class CFPDF_FileAccessWrap : public IFX_FileRead {
30 public:
31 CFPDF_FileAccessWrap() { m_pFileAccess = NULL; }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070032 ~CFPDF_FileAccessWrap() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070033
Nico Weber9d8ec5a2015-08-04 13:00:21 -070034 void Set(FPDF_FILEACCESS* pFile) { m_pFileAccess = pFile; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070035
Lei Zhang2b1a2d52015-08-14 22:16:22 -070036 // IFX_FileRead
37 FX_FILESIZE GetSize() override { return m_pFileAccess->m_FileLen; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070038
Lei Zhang2b1a2d52015-08-14 22:16:22 -070039 FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070040 return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset,
41 (uint8_t*)buffer, size);
42 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070043
Lei Zhang2b1a2d52015-08-14 22:16:22 -070044 void Release() override {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070045
Nico Weber9d8ec5a2015-08-04 13:00:21 -070046 private:
47 FPDF_FILEACCESS* m_pFileAccess;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070048};
49
Nico Weber9d8ec5a2015-08-04 13:00:21 -070050class CFPDF_DownloadHintsWrap : public IFX_DownloadHints {
51 public:
Lei Zhang2b1a2d52015-08-14 22:16:22 -070052 explicit CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070053 m_pDownloadHints = pDownloadHints;
54 }
Lei Zhang2b1a2d52015-08-14 22:16:22 -070055 ~CFPDF_DownloadHintsWrap() override {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -070056
57 public:
Lei Zhang2b1a2d52015-08-14 22:16:22 -070058 // IFX_DownloadHints
59 void AddSegment(FX_FILESIZE offset, FX_DWORD size) override {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070060 m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
61 }
62
63 private:
64 FX_DOWNLOADHINTS* m_pDownloadHints;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070065};
66
Nico Weber9d8ec5a2015-08-04 13:00:21 -070067class CFPDF_DataAvail {
68 public:
69 CFPDF_DataAvail() { m_pDataAvail = NULL; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070070
Nico Weber9d8ec5a2015-08-04 13:00:21 -070071 ~CFPDF_DataAvail() { delete m_pDataAvail; }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070072
Nico Weber9d8ec5a2015-08-04 13:00:21 -070073 IPDF_DataAvail* m_pDataAvail;
74 CFPDF_FileAvailWrap m_FileAvail;
75 CFPDF_FileAccessWrap m_FileRead;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070076};
77
Nico Weber9d8ec5a2015-08-04 13:00:21 -070078DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail,
79 FPDF_FILEACCESS* file) {
Tom Sepezae51c812015-08-05 12:34:06 -070080 CFPDF_DataAvail* pAvail = new CFPDF_DataAvail;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070081 pAvail->m_FileAvail.Set(file_avail);
82 pAvail->m_FileRead.Set(file);
83 pAvail->m_pDataAvail =
84 IPDF_DataAvail::Create(&pAvail->m_FileAvail, &pAvail->m_FileRead);
85 return pAvail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070086}
87
Nico Weber9d8ec5a2015-08-04 13:00:21 -070088DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail) {
89 delete (CFPDF_DataAvail*)avail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070090}
91
Nico Weber9d8ec5a2015-08-04 13:00:21 -070092DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail,
93 FX_DOWNLOADHINTS* hints) {
94 if (avail == NULL || hints == NULL)
95 return 0;
96 CFPDF_DownloadHintsWrap hints_wrap(hints);
97 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070098}
99
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700100DLLEXPORT FPDF_DOCUMENT STDCALL
101FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password) {
102 if (avail == NULL)
103 return NULL;
Tom Sepezae51c812015-08-05 12:34:06 -0700104 CPDF_Parser* pParser = new CPDF_Parser;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700105 pParser->SetPassword(password);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700106
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700107 FX_DWORD err_code = pParser->StartAsynParse(
108 ((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());
109 if (err_code) {
110 delete pParser;
111 ProcessParseError(err_code);
112 return NULL;
113 }
114 ((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());
115 CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
116 CPDF_Document* pPDFDoc = pParser->GetDocument();
117 CPDFXFA_App* pApp = CPDFXFA_App::GetInstance();
Lei Zhangcb78ef52015-10-02 10:10:49 -0700118 return new CPDFXFA_Document(pPDFDoc, pApp);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700119}
120
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700121DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) {
122 if (doc == NULL)
123 return 0;
124 CPDF_Document* pDoc = ((CPDFXFA_Document*)doc)->GetPDFDoc();
125 return ((CPDF_Parser*)pDoc->GetParser())->GetFirstPageNo();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700126}
127
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700128DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail,
129 int page_index,
130 FX_DOWNLOADHINTS* hints) {
131 if (avail == NULL || hints == NULL)
132 return 0;
133 CFPDF_DownloadHintsWrap hints_wrap(hints);
134 return ((CFPDF_DataAvail*)avail)
135 ->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700136}
137
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700138DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail,
139 FX_DOWNLOADHINTS* hints) {
140 if (avail == NULL || hints == NULL)
141 return -1;
142 CFPDF_DownloadHintsWrap hints_wrap(hints);
143 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700144}
145
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail) {
147 if (avail == NULL)
148 return -1;
149 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700150}