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