#ifndef PDF_PDFIUM_PDFIUM_DOCUMENT_H_
#define PDF_PDFIUM_PDFIUM_DOCUMENT_H_
#include <memory>
#include <string>
#include "base/memory/raw_ptr.h"
#include "third_party/pdfium/public/cpp/fpdf_scopers.h"
#include "third_party/pdfium/public/fpdf_dataavail.h"
#include "third_party/pdfium/public/fpdfview.h"
namespace chrome_pdf {
class DocumentLoader;
class PDFiumDocument {
public:
class DownloadHints;
class FileAccess;
class FileAvail;
explicit PDFiumDocument(DocumentLoader* doc_loader);
PDFiumDocument(const PDFiumDocument&) = delete;
PDFiumDocument& operator=(const PDFiumDocument&) = delete;
~PDFiumDocument();
FPDF_FILEACCESS& file_access();
FX_FILEAVAIL& file_availability();
FX_DOWNLOADHINTS& download_hints();
FPDF_AVAIL fpdf_availability() const { return fpdf_availability_.get(); }
FPDF_DOCUMENT doc() const { return doc_handle_.get(); }
FPDF_FORMHANDLE form() const { return form_handle_.get(); }
int form_status() const { return form_status_; }
void CreateFPDFAvailability();
void ResetFPDFAvailability();
void LoadDocument(const std::string& password);
void SetFormStatus();
void InitializeForm(FPDF_FORMFILLINFO* form_info);
private:
const raw_ptr<DocumentLoader> doc_loader_;
std::unique_ptr<FileAccess> file_access_;
std::unique_ptr<FileAvail> file_availability_;
std::unique_ptr<DownloadHints> download_hints_;
ScopedFPDFAvail fpdf_availability_;
ScopedFPDFDocument doc_handle_;
ScopedFPDFFormHandle form_handle_;
int form_status_ = PDF_FORM_NOTAVAIL;
};
}
#endif