Pdfium 27d718ebb2989631d6b4d3425e1fceb4b3bc795b

Same as used by Chrome for Android 65.0.3325.109

- use system's zlib, freetype, libjpeg
- don't use xfa, v8, skia

Test: atest CtsPdfTestCases
Fixes: 72134075
Change-Id: Ic144d41e667a0c9310b69625b53850dec5fb3006
diff --git a/fpdfsdk/fpdf_dataavail.cpp b/fpdfsdk/fpdf_dataavail.cpp
index b1bc1e3..b1a134d 100644
--- a/fpdfsdk/fpdf_dataavail.cpp
+++ b/fpdfsdk/fpdf_dataavail.cpp
@@ -11,7 +11,8 @@
 
 #include "core/fpdfapi/parser/cpdf_data_avail.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
-#include "core/fxcrt/cfx_retain_ptr.h"
+#include "core/fxcrt/fx_stream.h"
+#include "core/fxcrt/retain_ptr.h"
 #include "fpdfsdk/fsdk_define.h"
 #include "public/fpdf_formfill.h"
 #include "third_party/base/ptr_util.h"
@@ -42,15 +43,15 @@
 
 namespace {
 
-class CFPDF_FileAvailWrap : public CPDF_DataAvail::FileAvail {
+class FPDF_FileAvailContext : public CPDF_DataAvail::FileAvail {
  public:
-  CFPDF_FileAvailWrap() : m_pfileAvail(nullptr) {}
-  ~CFPDF_FileAvailWrap() override {}
+  FPDF_FileAvailContext() : m_pfileAvail(nullptr) {}
+  ~FPDF_FileAvailContext() override {}
 
   void Set(FX_FILEAVAIL* pfileAvail) { m_pfileAvail = pfileAvail; }
 
   // CPDF_DataAvail::FileAvail:
-  bool IsDataAvail(FX_FILESIZE offset, uint32_t size) override {
+  bool IsDataAvail(FX_FILESIZE offset, size_t size) override {
     return !!m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);
   }
 
@@ -58,12 +59,12 @@
   FX_FILEAVAIL* m_pfileAvail;
 };
 
-class CFPDF_FileAccessWrap : public IFX_SeekableReadStream {
+class FPDF_FileAccessContext : public IFX_SeekableReadStream {
  public:
-  static CFX_RetainPtr<CFPDF_FileAccessWrap> Create() {
-    return CFX_RetainPtr<CFPDF_FileAccessWrap>(new CFPDF_FileAccessWrap());
-  }
-  ~CFPDF_FileAccessWrap() override {}
+  template <typename T, typename... Args>
+  friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);
+
+  ~FPDF_FileAccessContext() override {}
 
   void Set(FPDF_FILEACCESS* pFile) { m_pFileAccess = pFile; }
 
@@ -76,119 +77,115 @@
   }
 
  private:
-  CFPDF_FileAccessWrap() : m_pFileAccess(nullptr) {}
+  FPDF_FileAccessContext() : m_pFileAccess(nullptr) {}
 
   FPDF_FILEACCESS* m_pFileAccess;
 };
 
-class CFPDF_DownloadHintsWrap : public CPDF_DataAvail::DownloadHints {
+class FPDF_DownloadHintsContext : public CPDF_DataAvail::DownloadHints {
  public:
-  explicit CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints) {
+  explicit FPDF_DownloadHintsContext(FX_DOWNLOADHINTS* pDownloadHints) {
     m_pDownloadHints = pDownloadHints;
   }
-  ~CFPDF_DownloadHintsWrap() override {}
+  ~FPDF_DownloadHintsContext() override {}
 
  public:
   // IFX_DownloadHints
-  void AddSegment(FX_FILESIZE offset, uint32_t size) override {
-    m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
+  void AddSegment(FX_FILESIZE offset, size_t size) override {
+    if (m_pDownloadHints)
+      m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
   }
 
  private:
   FX_DOWNLOADHINTS* m_pDownloadHints;
 };
 
-class CFPDF_DataAvail {
+class FPDF_AvailContext {
  public:
-  CFPDF_DataAvail()
-      : m_FileAvail(new CFPDF_FileAvailWrap),
-        m_FileRead(CFPDF_FileAccessWrap::Create()) {}
-  ~CFPDF_DataAvail() {}
+  FPDF_AvailContext()
+      : m_FileAvail(pdfium::MakeUnique<FPDF_FileAvailContext>()),
+        m_FileRead(pdfium::MakeRetain<FPDF_FileAccessContext>()) {}
+  ~FPDF_AvailContext() {}
 
+  std::unique_ptr<FPDF_FileAvailContext> m_FileAvail;
+  RetainPtr<FPDF_FileAccessContext> m_FileRead;
   std::unique_ptr<CPDF_DataAvail> m_pDataAvail;
-  std::unique_ptr<CFPDF_FileAvailWrap> m_FileAvail;
-  CFX_RetainPtr<CFPDF_FileAccessWrap> m_FileRead;
 };
 
-CFPDF_DataAvail* CFPDFDataAvailFromFPDFAvail(FPDF_AVAIL avail) {
-  return static_cast<CFPDF_DataAvail*>(avail);
+FPDF_AvailContext* FPDFAvailContextFromFPDFAvail(FPDF_AVAIL avail) {
+  return static_cast<FPDF_AvailContext*>(avail);
 }
 
 }  // namespace
 
-DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail,
-                                              FPDF_FILEACCESS* file) {
-  CFPDF_DataAvail* pAvail = new CFPDF_DataAvail;
+FPDF_EXPORT FPDF_AVAIL FPDF_CALLCONV FPDFAvail_Create(FX_FILEAVAIL* file_avail,
+                                                      FPDF_FILEACCESS* file) {
+  auto pAvail = pdfium::MakeUnique<FPDF_AvailContext>();
   pAvail->m_FileAvail->Set(file_avail);
   pAvail->m_FileRead->Set(file);
   pAvail->m_pDataAvail = pdfium::MakeUnique<CPDF_DataAvail>(
       pAvail->m_FileAvail.get(), pAvail->m_FileRead, true);
-  return pAvail;
+  return pAvail.release();  // Caller takes ownership.
 }
 
-DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail) {
-  delete (CFPDF_DataAvail*)avail;
+FPDF_EXPORT void FPDF_CALLCONV FPDFAvail_Destroy(FPDF_AVAIL avail) {
+  // Take ownership back from caller and destroy.
+  std::unique_ptr<FPDF_AvailContext>(FPDFAvailContextFromFPDFAvail(avail));
 }
 
-DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail,
-                                           FX_DOWNLOADHINTS* hints) {
-  if (!avail || !hints)
+FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_IsDocAvail(FPDF_AVAIL avail,
+                                                   FX_DOWNLOADHINTS* hints) {
+  if (!avail)
     return PDF_DATA_ERROR;
-  CFPDF_DownloadHintsWrap hints_wrap(hints);
-  return CFPDFDataAvailFromFPDFAvail(avail)->m_pDataAvail->IsDocAvail(
-      &hints_wrap);
+  FPDF_DownloadHintsContext hints_context(hints);
+  return FPDFAvailContextFromFPDFAvail(avail)->m_pDataAvail->IsDocAvail(
+      &hints_context);
 }
 
-DLLEXPORT FPDF_DOCUMENT STDCALL
+FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV
 FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password) {
-  CFPDF_DataAvail* pDataAvail = static_cast<CFPDF_DataAvail*>(avail);
+  auto* pDataAvail = FPDFAvailContextFromFPDFAvail(avail);
   if (!pDataAvail)
     return nullptr;
-
-  std::unique_ptr<CPDF_Parser> pParser(new CPDF_Parser);
-  pParser->SetPassword(password);
-
-  std::unique_ptr<CPDF_Document> pDocument(
-      new CPDF_Document(std::move(pParser)));
-  CPDF_Parser::Error error = pDocument->GetParser()->StartLinearizedParse(
-      pDataAvail->m_pDataAvail->GetFileRead(), pDocument.get());
+  CPDF_Parser::Error error;
+  std::unique_ptr<CPDF_Document> document;
+  std::tie(error, document) = pDataAvail->m_pDataAvail->ParseDocument(password);
   if (error != CPDF_Parser::SUCCESS) {
     ProcessParseError(error);
     return nullptr;
   }
-  pDataAvail->m_pDataAvail->SetDocument(pDocument.get());
-  CheckUnSupportError(pDocument.get(), FPDF_ERR_SUCCESS);
-  return FPDFDocumentFromCPDFDocument(pDocument.release());
+  CheckUnSupportError(document.get(), FPDF_ERR_SUCCESS);
+  return FPDFDocumentFromCPDFDocument(document.release());
 }
 
-DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) {
+FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc) {
   CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(doc);
   return pDoc ? pDoc->GetParser()->GetFirstPageNo() : 0;
 }
 
-DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail,
-                                            int page_index,
-                                            FX_DOWNLOADHINTS* hints) {
-  if (!avail || !hints)
+FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_IsPageAvail(FPDF_AVAIL avail,
+                                                    int page_index,
+                                                    FX_DOWNLOADHINTS* hints) {
+  if (!avail)
     return PDF_DATA_ERROR;
   if (page_index < 0)
     return PDF_DATA_NOTAVAIL;
-  CFPDF_DownloadHintsWrap hints_wrap(hints);
-  return CFPDFDataAvailFromFPDFAvail(avail)->m_pDataAvail->IsPageAvail(
-      page_index, &hints_wrap);
+  FPDF_DownloadHintsContext hints_context(hints);
+  return FPDFAvailContextFromFPDFAvail(avail)->m_pDataAvail->IsPageAvail(
+      page_index, &hints_context);
 }
 
-DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail,
-                                            FX_DOWNLOADHINTS* hints) {
-  if (!avail || !hints)
+FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_IsFormAvail(FPDF_AVAIL avail,
+                                                    FX_DOWNLOADHINTS* hints) {
+  if (!avail)
     return PDF_FORM_ERROR;
-  CFPDF_DownloadHintsWrap hints_wrap(hints);
-  return CFPDFDataAvailFromFPDFAvail(avail)->m_pDataAvail->IsFormAvail(
-      &hints_wrap);
+  FPDF_DownloadHintsContext hints_context(hints);
+  return FPDFAvailContextFromFPDFAvail(avail)->m_pDataAvail->IsFormAvail(
+      &hints_context);
 }
 
-DLLEXPORT int STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail) {
+FPDF_EXPORT int FPDF_CALLCONV FPDFAvail_IsLinearized(FPDF_AVAIL avail) {
   if (!avail)
     return PDF_LINEARIZATION_UNKNOWN;
-  return CFPDFDataAvailFromFPDFAvail(avail)->m_pDataAvail->IsLinearizedPDF();
+  return FPDFAvailContextFromFPDFAvail(avail)->m_pDataAvail->IsLinearizedPDF();
 }