// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef PUBLIC_FPDF_DATAAVAIL_H_
#define PUBLIC_FPDF_DATAAVAIL_H_

#include <stddef.h>  // For size_t.

#include "fpdfview.h"

#define PDF_LINEARIZATION_UNKNOWN -1
#define PDF_NOT_LINEARIZED 0
#define PDF_LINEARIZED 1

#define PDF_DATA_ERROR -1
#define PDF_DATA_NOTAVAIL 0
#define PDF_DATA_AVAIL 1

#define PDF_FORM_ERROR -1
#define PDF_FORM_NOTAVAIL 0
#define PDF_FORM_AVAIL 1
#define PDF_FORM_NOTEXIST 2

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Interface: FX_FILEAVAIL
 *          Interface for checking whether the section of the file is available.
 */
typedef struct _FX_FILEAVAIL {
  /**
   * Version number of the interface. Currently must be 1.
   */
  int version;

  /**
   * Method: IsDataAvail
   *      Report whether the specified data section is available. A section is
   * available only if all bytes in the section is available.
   * Interface Version:
   *      1
   * Implementation Required:
   *      Yes
   * Parameters:
   *      pThis       -   Pointer to the interface structure itself.
   *      offset      -   The offset of the data section in the file.
   *      size        -   The size of the data section
   * Return Value:
   *      true means the specified data section is available.
   * Comments:
   *      Called by Foxit SDK to check whether the data section is ready.
   */
  FPDF_BOOL (*IsDataAvail)(struct _FX_FILEAVAIL* pThis, size_t offset, size_t size);
} FX_FILEAVAIL;

typedef void* FPDF_AVAIL;

/**
* Function: FPDFAvail_Create
*           Create a document availability provider.
*
* Parameters:
*           file_avail  -   Pointer to file availability interface to check
* availability of file data.
*           file        -   Pointer to a file access interface for reading data
* from file.
* Return value:
*           A handle to the document availability provider. NULL for error.
* Comments:
*           Application must call FPDFAvail_Destroy when done with the
* availability provider.
*/
DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail,
                                              FPDF_FILEACCESS* file);

/**
* Function: FPDFAvail_Destroy
*           Destroy a document availibity provider.
*
* Parameters:
*           avail       -   Handle to document availability provider returned by
* FPDFAvail_Create
* Return Value:
*           None.
*/
DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail);

/**
 * Interface: FX_DOWNLOADHINTS
 *          Download hints interface. Used to receive hints for further
 * downloading.
 */
typedef struct _FX_DOWNLOADHINTS {
  /**
   * Version number of the interface. Currently must be 1.
   */
  int version;

  /**
   * Method: AddSegment
   *      Add a section to be downloaded.
   * Interface Version:
   *      1
   * Implementation Required:
   *      Yes
   * Parameters:
   *      pThis       -   Pointer to the interface structure itself.
   *      offset      -   The offset of the hint reported to be downloaded.
   *      size        -   The size of the hint reported to be downloaded.
   * Return Value:
   *      None.
   * Comments:
   *      Called by Foxit SDK to report some downloading hints for download
   * manager.
   *      The position and size of section may be not accurate, part of the
   * section might be already available.
   *      The download manager must deal with that to maximize download
   * efficiency.
   */
  void (*AddSegment)(struct _FX_DOWNLOADHINTS* pThis,
                     size_t offset,
                     size_t size);
} FX_DOWNLOADHINTS;

/**
* Function: FPDFAvail_IsDocAvail
*           Check whether the document is ready for loading, if not, get
* download hints.
*
* Parameters:
*           avail       -   Handle to document availability provider returned by
* FPDFAvail_Create
*           hints       -   Pointer to a download hints interface, receiving
* generated hints
* Return value:
*           PDF_DATA_ERROR: A common error is returned. It can't tell
*                           whehter data are availabe or not.
*           PDF_DATA_NOTAVAIL: Data are not yet available.
*           PDF_DATA_AVAIL: Data are available.
* Comments:
*           Applications should call this function whenever new data arrived,
*           and process all the generated download hints if any, until the
*           function returns PDF_DATA_ERROR or PDF_DATA_AVAIL. Then
*           applications can call FPDFAvail_GetDocument() to get a document
*           handle.
*/
DLLEXPORT int STDCALL
FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints);

/**
* Function: FPDFAvail_GetDocument
*           Get document from the availability provider.
*
* Parameters:
*           avail       -   Handle to document availability provider returned by
* FPDFAvail_Create
*     password  -   Optional password for decrypting the PDF file.
* Return value:
*           Handle to the document.
* Comments:
*           After FPDFAvail_IsDocAvail() returns TRUE, the application should
* call this function to
*           get the document handle. To close the document, use
* FPDF_CloseDocument function.
*/
DLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail,
                                                      FPDF_BYTESTRING password);

/**
* Function: FPDFAvail_GetFirstPageNum
*           Get page number for the first available page in a linearized PDF
*
* Parameters:
*           doc         -   A document handle returned by FPDFAvail_GetDocument
* Return Value:
*           Zero-based index for the first available page.
* Comments:
*           For most linearized PDFs, the first available page would be just the
* first page, however,
*           some PDFs might make other page to be the first available page.
*           For non-linearized PDF, this function will always return zero.
*/
DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc);

/**
* Function: FPDFAvail_IsPageAvail
*           Check whether a page is ready for loading, if not, get download
* hints.
*
* Parameters:
*           avail       -   Handle to document availability provider returned by
* FPDFAvail_Create
*           page_index  -   Index number of the page. 0 for the first page.
*           hints       -   Pointer to a download hints interface, receiving
* generated hints
* Return value:
*           PDF_DATA_ERROR: A common error is returned. It can't tell
*                           whehter data are availabe or not.
*           PDF_DATA_NOTAVAIL: Data are not yet available.
*           PDF_DATA_AVAIL: Data are available.
* Comments:
*           This function can be called only after FPDFAvail_GetDocument is
*           called. Applications should call this function whenever new data
*           arrived and process all the generated download hints if any, until
*           this function returns PDF_DATA_ERROR or PDF_DATA_AVAIL. Then
*           applications can perform page loading.
*/
DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail,
                                            int page_index,
                                            FX_DOWNLOADHINTS* hints);

/**
* Function: FPDFAvail_ISFormAvail
*           Check whether Form data is ready for init, if not, get download
* hints.
*
* Parameters:
*           avail       -   Handle to document availability provider returned by
* FPDFAvail_Create
*           hints       -   Pointer to a download hints interface, receiving
* generated hints
* Return value:
*           PDF_FORM_ERROR    - A common eror, in general incorrect parameters,
*                               like 'hints' is nullptr.
*           PDF_FORM_NOTAVAIL - data not available
*           PDF_FORM_AVAIL    - data available
*           PDF_FORM_NOTEXIST - no form data
* Comments:
*           This function can be called only after FPDFAvail_GetDocument is
*           called.
*           The application should call this function whenever new data arrived,
* and process all the
*           generated download hints if any, until the function returns non-zero
* value. Then the
*           application can perform page loading. Recommend to call
* FPDFDOC_InitFormFillEnvironment
*           after the function returns non-zero value.
*/
DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail,
                                            FX_DOWNLOADHINTS* hints);

/**
* Function: FPDFAvail_IsLinearized
*           To check whether a document is Linearized PDF file.
*
* Parameters:
*           avail       -   Handle to document availability provider returned by
* FPDFAvail_Create
* Return value:
*           PDF_LINEARIZED is a linearize file.
*           PDF_NOT_LINEARIZED is not a linearize file.
*           PDF_LINEARIZATION_UNKNOWN doesn't know whether the file is a
*linearize file.
*
* Comments:
*           It return PDF_LINEARIZED or PDF_NOT_LINEARIZED as soon as
*           we have first 1K data.  If the file's size less than 1K, it returns
*           PDF_LINEARIZATION_UNKNOWN because there is not enough information to
*           tell whether a PDF file is a linearized file or not.
*
*/
DLLEXPORT int STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail);

#ifdef __cplusplus
}
#endif

#endif  // PUBLIC_FPDF_DATAAVAIL_H_