//========================================================================
//
// PDFDocFactory.h
//
// This file is licensed under the GPLv2 or later
//
// Copyright 2010 Hib Eris <hib@hiberis.nl>
// Copyright 2010, 2018 Albert Astals Cid <aacid@kde.org>
// Copyright 2019 Oliver Sander <oliver.sander@tu-dresden.de>
//
//========================================================================

#ifndef PDFDOCFACTORY_H
#define PDFDOCFACTORY_H

#include "PDFDoc.h"

class GooString;
class PDFDocBuilder;

//------------------------------------------------------------------------
// PDFDocFactory
//
// PDFDocFactory allows the construction of PDFDocs from different URIs.
//
// By default, it supports local files, 'file://' and 'fd:0' (stdin). When
// compiled with libcurl, it also supports 'http://' and 'https://'.
//
// You can extend the supported URIs by giving a list of PDFDocBuilders to
// the constructor, or by registering a new PDFDocBuilder afterwards.
//------------------------------------------------------------------------

class PDFDocFactory {

public:

  PDFDocFactory(std::vector<PDFDocBuilder*> *pdfDocBuilders = nullptr);
  ~PDFDocFactory();

  PDFDocFactory(const PDFDocFactory &) = delete;
  PDFDocFactory& operator=(const PDFDocFactory &) = delete;

  // Create a PDFDoc. Returns a PDFDoc. You should check this PDFDoc
  // with PDFDoc::isOk() for failures.
  // The caller is responsible for deleting ownerPassword, userPassWord and guiData.
  PDFDoc *createPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr,
      GooString *userPassword = nullptr, void *guiDataA = nullptr);

  // Extend supported URIs with the ones from the PDFDocBuilder.
  void registerPDFDocBuilder(PDFDocBuilder *pdfDocBuilder);

private:

  std::vector<PDFDocBuilder*> *builders;

};

#endif /* PDFDOCFACTORY_H */
