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