Hide internal implementation of PDFiumDocument.

Change-Id: I7e46d0b3e03708c425c35dcd3939e7b67cbacbd1
Reviewed-on: https://chromium-review.googlesource.com/1136536
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Art Snake <art-snake@yandex-team.ru>
Cr-Commit-Position: refs/heads/master@{#575233}
diff --git a/pdf/pdfium/pdfium_document.cc b/pdf/pdfium/pdfium_document.cc
index da34ffb..ff6dc27b 100644
--- a/pdf/pdfium/pdfium_document.cc
+++ b/pdf/pdfium/pdfium_document.cc
@@ -4,30 +4,90 @@
 
 #include "pdf/pdfium/pdfium_document.h"
 
-#include "pdf/pdfium/pdfium_engine.h"
+#include <utility>
+
+#include "base/logging.h"
+#include "pdf/document_loader.h"
 
 namespace chrome_pdf {
 
+namespace {
+
+class FileAvail : public FX_FILEAVAIL {
+ public:
+  explicit FileAvail(DocumentLoader* doc_loader) : doc_loader_(doc_loader) {
+    DCHECK(doc_loader);
+    version = 1;
+    IsDataAvail = &FileAvail::IsDataAvailImpl;
+  }
+
+ private:
+  // PDFium interface to check is block of data is available.
+  static FPDF_BOOL IsDataAvailImpl(FX_FILEAVAIL* param,
+                                   size_t offset,
+                                   size_t size) {
+    auto* file_avail = static_cast<FileAvail*>(param);
+    return file_avail->doc_loader_->IsDataAvailable(offset, size);
+  }
+
+  DocumentLoader* doc_loader_;
+};
+
+class DownloadHints : public FX_DOWNLOADHINTS {
+ public:
+  explicit DownloadHints(DocumentLoader* doc_loader) : doc_loader_(doc_loader) {
+    DCHECK(doc_loader);
+    version = 1;
+    AddSegment = &DownloadHints::AddSegmentImpl;
+  }
+
+ private:
+  // PDFium interface to request download of the block of data.
+  static void AddSegmentImpl(FX_DOWNLOADHINTS* param,
+                             size_t offset,
+                             size_t size) {
+    auto* download_hints = static_cast<DownloadHints*>(param);
+    return download_hints->doc_loader_->RequestData(offset, size);
+  }
+
+  DocumentLoader* doc_loader_;
+};
+
+class FileAccess : public FPDF_FILEACCESS {
+ public:
+  explicit FileAccess(DocumentLoader* doc_loader) : doc_loader_(doc_loader) {
+    DCHECK(doc_loader);
+    m_FileLen = 0;
+    m_GetBlock = &FileAccess::GetBlockImpl;
+    m_Param = this;
+  }
+
+ private:
+  // PDFium interface to get block of data.
+  static int GetBlockImpl(void* param,
+                          unsigned long position,
+                          unsigned char* buffer,
+                          unsigned long size) {
+    auto* file_access = static_cast<FileAccess*>(param);
+    return file_access->doc_loader_->GetBlock(position, size, buffer);
+  }
+
+  DocumentLoader* doc_loader_;
+};
+
+}  // namespace
+
 PDFiumDocument::PDFiumDocument(DocumentLoader* doc_loader)
-    : doc_loader_(doc_loader) {
-  file_access_.m_FileLen = 0;
-  file_access_.m_GetBlock = &GetBlock;
-  file_access_.m_Param = doc_loader_;
-
-  file_availability_.version = 1;
-  file_availability_.IsDataAvail = &IsDataAvail;
-  file_availability_.doc_loader = doc_loader_;
-
-  download_hints_.version = 1;
-  download_hints_.AddSegment = &AddSegment;
-  download_hints_.doc_loader = doc_loader_;
-}
+    : doc_loader_(doc_loader),
+      file_access_(std::make_unique<FileAccess>(doc_loader)),
+      file_availability_(std::make_unique<FileAvail>(doc_loader)),
+      download_hints_(std::make_unique<DownloadHints>(doc_loader)) {}
 
 PDFiumDocument::~PDFiumDocument() = default;
 
 void PDFiumDocument::CreateFPDFAvailability() {
   fpdf_availability_.reset(
-      FPDFAvail_Create(&file_availability_, &file_access_));
+      FPDFAvail_Create(file_availability_.get(), file_access_.get()));
 }
 
 void PDFiumDocument::ResetFPDFAvailability() {
@@ -36,44 +96,21 @@
 
 void PDFiumDocument::LoadDocument(const char* password) {
   if (doc_loader_->IsDocumentComplete() &&
-      !FPDFAvail_IsLinearized(fpdf_availability())) {
-    doc_.reset(FPDF_LoadCustomDocument(&file_access_, password));
+      !FPDFAvail_IsLinearized(fpdf_availability_.get())) {
+    doc_handle_.reset(FPDF_LoadCustomDocument(file_access_.get(), password));
   } else {
-    doc_.reset(FPDFAvail_GetDocument(fpdf_availability(), password));
+    doc_handle_.reset(
+        FPDFAvail_GetDocument(fpdf_availability_.get(), password));
   }
 }
 
 void PDFiumDocument::SetFormStatus() {
-  form_status_ = FPDFAvail_IsFormAvail(fpdf_availability(), &download_hints_);
+  form_status_ =
+      FPDFAvail_IsFormAvail(fpdf_availability_.get(), download_hints_.get());
 }
 
 void PDFiumDocument::InitializeForm(FPDF_FORMFILLINFO* form_info) {
-  form_.reset(FPDFDOC_InitFormFillEnvironment(doc(), form_info));
-}
-
-// static
-int PDFiumDocument::GetBlock(void* param,
-                             unsigned long position,
-                             unsigned char* buffer,
-                             unsigned long size) {
-  auto* doc_loader = static_cast<DocumentLoader*>(param);
-  return doc_loader->GetBlock(position, size, buffer);
-}
-
-// static
-FPDF_BOOL PDFiumDocument::IsDataAvail(FX_FILEAVAIL* param,
-                                      size_t offset,
-                                      size_t size) {
-  auto* file_avail = static_cast<FileAvail*>(param);
-  return file_avail->doc_loader->IsDataAvailable(offset, size);
-}
-
-// static
-void PDFiumDocument::AddSegment(FX_DOWNLOADHINTS* param,
-                                size_t offset,
-                                size_t size) {
-  auto* download_hints = static_cast<DownloadHints*>(param);
-  return download_hints->doc_loader->RequestData(offset, size);
+  form_handle_.reset(FPDFDOC_InitFormFillEnvironment(doc(), form_info));
 }
 
 }  // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_document.h b/pdf/pdfium/pdfium_document.h
index dfb70f8..a5cebac 100644
--- a/pdf/pdfium/pdfium_document.h
+++ b/pdf/pdfium/pdfium_document.h
@@ -19,13 +19,13 @@
   explicit PDFiumDocument(DocumentLoader* doc_loader);
   ~PDFiumDocument();
 
-  FPDF_FILEACCESS& file_access() { return file_access_; }
-  FX_FILEAVAIL& file_availability() { return file_availability_; }
-  FX_DOWNLOADHINTS& download_hints() { return download_hints_; }
+  FPDF_FILEACCESS& file_access() { return *file_access_; }
+  FX_FILEAVAIL& file_availability() { return *file_availability_; }
+  FX_DOWNLOADHINTS& download_hints() { return *download_hints_; }
 
   FPDF_AVAIL fpdf_availability() const { return fpdf_availability_.get(); }
-  FPDF_DOCUMENT doc() const { return doc_.get(); }
-  FPDF_FORMHANDLE form() const { return form_.get(); }
+  FPDF_DOCUMENT doc() const { return doc_handle_.get(); }
+  FPDF_FORMHANDLE form() const { return form_handle_.get(); }
 
   int form_status() const { return form_status_; }
 
@@ -38,47 +38,27 @@
   void InitializeForm(FPDF_FORMFILLINFO* form_info);
 
  private:
-  struct FileAvail : public FX_FILEAVAIL {
-    DocumentLoader* doc_loader;
-  };
-
-  struct DownloadHints : public FX_DOWNLOADHINTS {
-    DocumentLoader* doc_loader;
-  };
-
-  // PDFium interface to get block of data.
-  static int GetBlock(void* param,
-                      unsigned long position,
-                      unsigned char* buffer,
-                      unsigned long size);
-
-  // PDFium interface to check is block of data is available.
-  static FPDF_BOOL IsDataAvail(FX_FILEAVAIL* param, size_t offset, size_t size);
-
-  // PDFium interface to request download of the block of data.
-  static void AddSegment(FX_DOWNLOADHINTS* param, size_t offset, size_t size);
-
   DocumentLoader* const doc_loader_;
 
   // Interface structure to provide access to document stream.
-  FPDF_FILEACCESS file_access_;
+  std::unique_ptr<FPDF_FILEACCESS> file_access_;
 
   // Interface structure to check data availability in the document stream.
-  FileAvail file_availability_;
+  std::unique_ptr<FX_FILEAVAIL> file_availability_;
 
   // Interface structure to request data chunks from the document stream.
-  DownloadHints download_hints_;
+  std::unique_ptr<FX_DOWNLOADHINTS> download_hints_;
 
   // Pointer to the document availability interface.
   ScopedFPDFAvail fpdf_availability_;
 
   // The PDFium wrapper object for the document. Must come after
   // |fpdf_availability_| to prevent outliving it.
-  ScopedFPDFDocument doc_;
+  ScopedFPDFDocument doc_handle_;
 
   // The PDFium wrapper for form data.  Used even if there are no form controls
-  // on the page. Must come after |doc_| to prevent outliving it.
-  ScopedFPDFFormHandle form_;
+  // on the page. Must come after |doc_handle_| to prevent outliving it.
+  ScopedFPDFFormHandle form_handle_;
 
   // Current form availability status.
   int form_status_ = PDF_FORM_NOTAVAIL;