// 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_
