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