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