// 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 _FPDF_DATAAVAIL_H_
#define _FPDF_DATAAVAIL_H_

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

#include "fpdfview.h"

/** The result of the process which check linearized PDF. */
#define FSDK_IS_LINEARIZED			1
#define FSDK_NOT_LINEARIZED			0
#define FSDK_UNKNOW_LINEARIZED		-1


#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.
	 */
	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.
* Notes:
*			The method can not support to load a document which consists of dynamic XFA fields now.
*/
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:
*			Non-zero for page is fully available, 0 for page not yet available.
* Comments:
*			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 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:
*			Non-zero for page is fully available, 0 for page not yet available.
* Comments:
*			This function call be called only after FPDFAvail_GetDocument if 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.
*/
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:
*			Non-zero for Form data is fully available, 0 for Form data not yet available.
*			Details: -1 - error, the input parameter not correct, such as hints is null.
*					 0  - data not available
*					 1  - data available
*					 2  - no form data.				
* Comments:
*			This function call be called only after FPDFAvail_GetDocument if 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:
*			return TRUE means the document is linearized PDF else not.
*			FSDK_IS_LINEARIZED is a linearize file.
*			FSDK_NOT_LINEARIZED is not a linearize file.
*			FSDK_UNKNOW_LINEARIZED don't know whether the file is a linearize file.
* Comments:
*			It return TRUE/FALSE as soon as we have first 1K data. 	If the file's size less than
*			1K,we don't known whether the PDF is a linearized file.
*
*/
DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail);

#ifdef __cplusplus
};
#endif

#endif