blob: 2121f2678aab56d2a358fe977c4af448d9c3fc91 [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);
14class CFPDF_FileAvailWrap : public IFX_FileAvail
15{
16public:
17 CFPDF_FileAvailWrap()
18 {
19 m_pfileAvail = NULL;
20 }
21
22 void Set(FX_FILEAVAIL* pfileAvail)
23 {
24 m_pfileAvail = pfileAvail;
25 }
26
27 virtual FX_BOOL IsDataAvail( FX_FILESIZE offset, FX_DWORD size)
28 {
29 return m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);
30 }
31
32private:
33 FX_FILEAVAIL* m_pfileAvail;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070034};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070035
36class CFPDF_FileAccessWrap : public IFX_FileRead
37{
38public:
39 CFPDF_FileAccessWrap()
40 {
41 m_pFileAccess = NULL;
42 }
43
44 void Set(FPDF_FILEACCESS* pFile)
45 {
46 m_pFileAccess = pFile;
47 }
48
49 virtual FX_FILESIZE GetSize()
50 {
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070051 return m_pFileAccess->m_FileLen;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070052 }
53
54 virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
55 {
Tom Sepezd7e5cc72015-06-10 14:33:37 -070056 return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset, (uint8_t*)buffer, size);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070057 }
58
59 virtual void Release()
60 {
61 }
62
63private:
64 FPDF_FILEACCESS* m_pFileAccess;
65};
66
67class CFPDF_DownloadHintsWrap : public IFX_DownloadHints
68{
69public:
70 CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints)
71 {
72 m_pDownloadHints = pDownloadHints;
73 }
74public:
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070075 virtual void AddSegment(FX_FILESIZE offset, FX_DWORD size)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070076 {
77 m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070078 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070079private:
80 FX_DOWNLOADHINTS* m_pDownloadHints;
81};
82
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070083class CFPDF_DataAvail
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070084{
85public:
86 CFPDF_DataAvail()
87 {
88 m_pDataAvail = NULL;
89 }
90
91 ~CFPDF_DataAvail()
92 {
Lei Zhang6d8b1c22015-06-19 17:26:17 -070093 delete m_pDataAvail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070094 }
95
Tom Sepez19c61602015-01-22 17:00:12 -080096 IPDF_DataAvail* m_pDataAvail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070097 CFPDF_FileAvailWrap m_FileAvail;
98 CFPDF_FileAccessWrap m_FileRead;
99};
100
101DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file)
102{
103 CFPDF_DataAvail* pAvail = FX_NEW CFPDF_DataAvail;
104 pAvail->m_FileAvail.Set(file_avail);
105 pAvail->m_FileRead.Set(file);
Tom Sepez19c61602015-01-22 17:00:12 -0800106 pAvail->m_pDataAvail = IPDF_DataAvail::Create(&pAvail->m_FileAvail, &pAvail->m_FileRead);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700107 return pAvail;
108}
109
110DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail)
111{
Lei Zhang6d8b1c22015-06-19 17:26:17 -0700112 delete (CFPDF_DataAvail*)avail;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700113}
114
115DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)
116{
117 if (avail == NULL || hints == NULL) return 0;
118 CFPDF_DownloadHintsWrap hints_wrap(hints);
119 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);
120}
121
122extern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);
123
124DLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password)
125{
126 if (avail == NULL) return NULL;
127 CPDF_Parser* pParser = FX_NEW CPDF_Parser;
128 pParser->SetPassword(password);
129
130 FX_DWORD err_code = pParser->StartAsynParse(((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());
131 if (err_code) {
132 delete pParser;
133 ProcessParseError(err_code);
134 return NULL;
135 }
136 ((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());
137 CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
Bo Xufdc00a72014-10-28 23:03:33 -0700138 CPDF_Document* pPDFDoc = pParser->GetDocument();
Tom Sepezbdeeb8a2015-05-27 12:25:00 -0700139 CPDFXFA_App* pApp = CPDFXFA_App::GetInstance();
Bo Xufdc00a72014-10-28 23:03:33 -0700140 CPDFXFA_Document* pDocument = FX_NEW CPDFXFA_Document(pPDFDoc, pApp);
Bo Xufdc00a72014-10-28 23:03:33 -0700141 return pDocument;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700142}
143
144DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc)
145{
146 if (doc == NULL) return 0;
Bo Xufdc00a72014-10-28 23:03:33 -0700147 CPDF_Document* pDoc = ((CPDFXFA_Document*)doc)->GetPDFDoc();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700148 return ((CPDF_Parser*)pDoc->GetParser())->GetFirstPageNo();
149}
150
151DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS* hints)
152{
153 if (avail == NULL || hints == NULL) return 0;
154 CFPDF_DownloadHintsWrap hints_wrap(hints);
155 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);
156}
157
158DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)
159{
160 if (avail == NULL || hints == NULL) return -1;
161 CFPDF_DownloadHintsWrap hints_wrap(hints);
162 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
163}
164
165DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail)
166{
167 if (avail == NULL) return -1;
168 return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
169
170}