Home | History | Annotate | Download | only in src
      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 }
    166