Add type cast definitions for CPDF_Array.
[pdfium.git] / fpdfsdk / src / fpdf_dataavail.cpp
1 // 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.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../public/fpdf_dataavail.h"
8 #include "../../public/fpdf_formfill.h"
9 #include "../include/fsdk_define.h"
10
11 class CFPDF_FileAvailWrap : public IFX_FileAvail {
12  public:
13   CFPDF_FileAvailWrap() { m_pfileAvail = NULL; }
14   ~CFPDF_FileAvailWrap() override {}
15
16   void Set(FX_FILEAVAIL* pfileAvail) { m_pfileAvail = pfileAvail; }
17
18   // IFX_FileAvail
19   FX_BOOL IsDataAvail(FX_FILESIZE offset, FX_DWORD size) override {
20     return m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);
21   }
22
23  private:
24   FX_FILEAVAIL* m_pfileAvail;
25 };
26
27 class CFPDF_FileAccessWrap : public IFX_FileRead {
28  public:
29   CFPDF_FileAccessWrap() { m_pFileAccess = NULL; }
30   ~CFPDF_FileAccessWrap() override {}
31
32   void Set(FPDF_FILEACCESS* pFile) { m_pFileAccess = pFile; }
33
34   // IFX_FileRead
35   FX_FILESIZE GetSize() override { return m_pFileAccess->m_FileLen; }
36
37   FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override {
38     return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset,
39                                      (uint8_t*)buffer, size);
40   }
41
42   void Release() override {}
43
44  private:
45   FPDF_FILEACCESS* m_pFileAccess;
46 };
47
48 class CFPDF_DownloadHintsWrap : public IFX_DownloadHints {
49  public:
50   explicit CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints) {
51     m_pDownloadHints = pDownloadHints;
52   }
53   ~CFPDF_DownloadHintsWrap() override {}
54
55  public:
56   // IFX_DownloadHints
57   void AddSegment(FX_FILESIZE offset, FX_DWORD size) override {
58     m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
59   }
60
61  private:
62   FX_DOWNLOADHINTS* m_pDownloadHints;
63 };
64
65 class CFPDF_DataAvail {
66  public:
67   CFPDF_DataAvail() { m_pDataAvail = NULL; }
68
69   ~CFPDF_DataAvail() { delete m_pDataAvail; }
70
71   IPDF_DataAvail* m_pDataAvail;
72   CFPDF_FileAvailWrap m_FileAvail;
73   CFPDF_FileAccessWrap m_FileRead;
74 };
75
76 DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail,
77                                               FPDF_FILEACCESS* file) {
78   CFPDF_DataAvail* pAvail = new CFPDF_DataAvail;
79   pAvail->m_FileAvail.Set(file_avail);
80   pAvail->m_FileRead.Set(file);
81   pAvail->m_pDataAvail =
82       IPDF_DataAvail::Create(&pAvail->m_FileAvail, &pAvail->m_FileRead);
83   return pAvail;
84 }
85
86 DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail) {
87   delete (CFPDF_DataAvail*)avail;
88 }
89
90 DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail,
91                                            FX_DOWNLOADHINTS* hints) {
92   if (avail == NULL || hints == NULL)
93     return 0;
94   CFPDF_DownloadHintsWrap hints_wrap(hints);
95   return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);
96 }
97
98 DLLEXPORT FPDF_DOCUMENT STDCALL
99 FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password) {
100   if (avail == NULL)
101     return NULL;
102   CPDF_Parser* pParser = new CPDF_Parser;
103   pParser->SetPassword(password);
104
105   FX_DWORD err_code = pParser->StartAsynParse(
106       ((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());
107   if (err_code) {
108     delete pParser;
109     ProcessParseError(err_code);
110     return NULL;
111   }
112   ((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());
113   CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
114   return FPDFDocumentFromCPDFDocument(pParser->GetDocument());
115 }
116
117 DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) {
118   CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc);
119   if (!doc)
120     return 0;
121   return ((CPDF_Parser*)pDoc->GetParser())->GetFirstPageNo();
122 }
123
124 DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail,
125                                             int page_index,
126                                             FX_DOWNLOADHINTS* hints) {
127   if (avail == NULL || hints == NULL)
128     return 0;
129   CFPDF_DownloadHintsWrap hints_wrap(hints);
130   return ((CFPDF_DataAvail*)avail)
131       ->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);
132 }
133
134 DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail,
135                                             FX_DOWNLOADHINTS* hints) {
136   if (avail == NULL || hints == NULL)
137     return -1;
138   CFPDF_DownloadHintsWrap hints_wrap(hints);
139   return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
140 }
141
142 DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail) {
143   if (avail == NULL)
144     return -1;
145   return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
146 }