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