1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fsdk_define.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../include/fpdf_dataavail.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern void ProcessParseError(FX_DWORD err_code);
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFPDF_FileAvailWrap : public IFX_FileAvail
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_FileAvailWrap()
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pfileAvail = NULL;
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	void Set(FX_FILEAVAIL* pfileAvail)
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pfileAvail = pfileAvail;
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual FX_BOOL			IsDataAvail( FX_FILESIZE offset, FX_DWORD size)
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_FILEAVAIL* m_pfileAvail;
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFPDF_FileAccessWrap : public IFX_FileRead
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_FileAccessWrap()
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pFileAccess = NULL;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	void Set(FPDF_FILEACCESS* pFile)
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pFileAccess = pFile;
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual FX_FILESIZE		GetSize()
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pFileAccess->m_FileLen;
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual FX_BOOL			ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset, (FX_LPBYTE)buffer, size);
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual void			Release()
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FPDF_FILEACCESS*		m_pFileAccess;
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFPDF_DownloadHintsWrap : public IFX_DownloadHints
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints)
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pDownloadHints = pDownloadHints;
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	virtual void			AddSegment(FX_FILESIZE offset, FX_DWORD size)
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_DOWNLOADHINTS* m_pDownloadHints;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFPDF_DataAvail : public CFX_Object
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_DataAvail()
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pDataAvail = NULL;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	~CFPDF_DataAvail()
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (m_pDataAvail) delete m_pDataAvail;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_DataAvail*			m_pDataAvail;
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_FileAvailWrap		m_FileAvail;
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_FileAccessWrap	m_FileRead;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file)
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_DataAvail* pAvail = FX_NEW CFPDF_DataAvail;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pAvail->m_FileAvail.Set(file_avail);
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pAvail->m_FileRead.Set(file);
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pAvail->m_pDataAvail = FX_NEW CPDF_DataAvail(&pAvail->m_FileAvail, &pAvail->m_FileRead);
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pAvail;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail)
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (avail == NULL) return;
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	delete (CFPDF_DataAvail*)avail;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (avail == NULL || hints == NULL) return 0;
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_DownloadHintsWrap hints_wrap(hints);
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail,	FPDF_BYTESTRING password)
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (avail == NULL) return NULL;
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Parser* pParser = FX_NEW CPDF_Parser;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	pParser->SetPassword(password);
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_DWORD err_code = pParser->StartAsynParse(((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (err_code) {
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete pParser;
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		ProcessParseError(err_code);
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return NULL;
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return pParser->GetDocument();
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc)
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (doc == NULL) return 0;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPDF_Document* pDoc = (CPDF_Document*)doc;
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CPDF_Parser*)pDoc->GetParser())->GetFirstPageNo();
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS* hints)
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (avail == NULL || hints == NULL) return 0;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_DownloadHintsWrap hints_wrap(hints);
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (avail == NULL || hints == NULL) return -1;
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFPDF_DownloadHintsWrap hints_wrap(hints);
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovDLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail)
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (avail == NULL) return -1;
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
166