/* Copyright (c) 2011 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef PPAPI_C_PPB_URL_LOADER_H_
#define PPAPI_C_PPB_URL_LOADER_H_

#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"

struct PP_CompletionCallback;

#define PPB_URLLOADER_INTERFACE_0_1 "PPB_URLLoader;0.1"
#define PPB_URLLOADER_INTERFACE PPB_URLLOADER_INTERFACE_0_1

/**
 * @file
 * This file defines the PPB_URLLoader interface for loading URLs.
 */

/**
 * @addtogroup Interfaces
 * @{
 */

/**
 * The PPB_URLLoader interface contains pointers to functions for loading URLs.
 * The typical steps for loading a URL are:
 *
 * -# Call Create() to create a URLLoader object.</li>
 * -# Create a URLRequestInfo object and set properties on it. Refer to
 * PPB_URLRequestInfo for further information.</li>
 * -# Call Open() with the URLRequestInfo as an argument.</li>
 * -# When Open() completes, call GetResponseInfo() to examine the response
 * headers. Refer to PPB_URLResponseInfo for further information.</li>
 * -# Call ReadResponseBody() to stream the data for the response.</li>
 *
 * Alternatively, if PP_URLREQUESTPROPERTY_STREAMTOFILE was set on the
 * URLRequestInfo in step #2:
 * - Call FinishStreamingToFile(), after examining the response headers
 * (step #4),  to wait for the downloaded file to be complete.
 * - Then, access the downloaded file using the GetBodyAsFileRef() function of
 * the URLResponseInfo returned in step #4.
 */
struct PPB_URLLoader {
  /**
   * Create is a pointer to a function that creates a new URLLoader
   * object. The URLLoader is associated with a particular instance, so that
   * any UI dialogs that need to be shown to the user can be positioned
   * relative to the window containing the instance.
   *
   * @param[in] instance A PP_Instance indentifying one instance of a module.
   * @return A PP_Resource corresponding to a URLLoader if successful, 0 if
   * the instance is invalid.
   */
  PP_Resource (*Create)(PP_Instance instance);

  /**
   * IsURLLoader is a pointer to a function that determines if a resource is a
   * URLLoader.
   *
   * @param[in] resource A PP_Resource corresponding to a URLLoader.
   * @return PP_TRUE if the resource is a URLLoader, PP_FALSE if the resource is
   * invalid or some type other than URLLoader.
   */
  PP_Bool (*IsURLLoader)(PP_Resource resource);

  /**
   * Open is a pointer to a function that begins loading the URLRequestInfo.
   * The operation completes when response headers are received or when an
   * error occurs.  Use GetResponseInfo() to access the response
   * headers.
   *
   * @param[in] loader A PP_Resource corresponding to a URLLoader.
   * @param[in] resource A PP_Resource corresponding to a URLRequestInfo.
   * @param[in] callback A PP_CompletionCallback to run on asynchronous
   * completion of Open(). This callback will run when response
   * headers for the url are received or error occured. This callback
   * will only run if Open() returns PP_OK_COMPLETIONPENDING.
   */
  int32_t (*Open)(PP_Resource loader,
                  PP_Resource request_info,
                  struct PP_CompletionCallback callback);

  /**
   * FollowRedirect is a pointer to a function that can be invoked to follow a
   * redirect after Open() completed on receiving redirect headers.
   *
   * @param[in] loader A PP_Resource corresponding to a URLLoader.
   * @param[in] callback A PP_CompletionCallback to run on asynchronous
   * completion of FollowRedirect(). This callback will run when response
   * headers for the redirect url are received or error occured. This callback
   * will only run if FollowRedirect() returns PP_OK_COMPLETIONPENDING.
   * @return An int32_t containing an error code from pp_errors.h.
   */
  int32_t (*FollowRedirect)(PP_Resource loader,
                            struct PP_CompletionCallback callback);

  /**
   * GetUploadProgress is a pointer to a function that returns the current
   * upload progress (which is meaningful after Open() has been called).
   * Progress only refers to the request body and does not include the
   * headers.
   *
   * This data is only available if the URLRequestInfo passed to Open() had the
   * PP_URLREQUESTPROPERTY_REPORTUPLOADPROGRESS property set to PP_TRUE.
   *
   * @param[in] loader A PP_Resource corresponding to a URLLoader.
   * @param[in] bytes_sent The number of bytes sent thus far.
   * @parm[in] total_bytes_to_be_sent The total number of bytes to be sent.
   * @return PP_TRUE if the upload progress is available, PP_FALSE if it is not
   * available.
   */
  PP_Bool (*GetUploadProgress)(PP_Resource loader,
                               int64_t* bytes_sent,
                               int64_t* total_bytes_to_be_sent);

  /**
   * GetDownloadProgress is a pointer to a function that returns the current
   * download progress, which is meaningful after Open() has been called.
   * Progress only refers to the response body and does not include the
   * headers.
   *
   * This data is only available if the URLRequestInfo passed to Open() had the
   * PP_URLREQUESTPROPERTY_REPORTDOWNLOADPROGRESS property set to PP_TRUE.
   *
   * @param[in] loader A PP_Resource corresponding to a URLLoader.
   * @param[in] bytes_received The number of bytes received thus far.
   * @parm[in] total_bytes_to_be_received The total number of bytes to be
   * received. The total bytes to be received may be unknown, in which case
   * total_bytes_to_be_received will be set to -1.
   * @return PP_TRUE if the download progress is available, PP_FALSE if it is
   * not available.
   */
  PP_Bool (*GetDownloadProgress)(PP_Resource loader,
                                 int64_t* bytes_received,
                                 int64_t* total_bytes_to_be_received);

  /**
   * GetResponseInfo is a pointer to a function that returns the current
   * URLResponseInfo object.
   *
   * @param[in] instance A PP_Resource corresponding to a URLLoader.
   * @return A PP_Resource corresponding to the URLResponseInfo if successful,
   * 0 if the loader is not a valid resource or if Open() has not been called.
   */
  PP_Resource (*GetResponseInfo)(PP_Resource loader);

  /**
   * ReadResponseBody is a pointer to a function used to read the response
   * body. The size of the buffer must be large enough to hold the specified
   * number of bytes to read.  This function might perform a partial read.
   *
   * @param[in] loader A PP_Resource corresponding to a URLLoader.
   * @param[in/out] buffer A pointer to the buffer for the response body.
   * @param[in] bytes_to_read The number of bytes to read.
   * @param[in] callback A PP_CompletionCallback to run on asynchronous
   * completion. The callback will run if the bytes (full or partial) are
   * read or an error occurs asynchronously. This callback will run only if this
   * function returns PP_OK_COMPLETIONPENDING.
   * @return An int32_t containing the number of bytes read or an error code
   * from pp_errors.h.
   */
  int32_t (*ReadResponseBody)(PP_Resource loader,
                              void* buffer,
                              int32_t bytes_to_read,
                              struct PP_CompletionCallback callback);
  /**
   * FinishStreamingToFile is a pointer to a function used to wait for the
   * response body to be completely downloaded to the file provided by the
   * GetBodyAsFileRef() in the current URLResponseInfo. This function is only
   * used if PP_URLREQUESTPROPERTY_STREAMTOFILE was set on the URLRequestInfo
   * passed to Open().
   *
   * @param[in] loader A PP_Resource corresponding to a URLLoader.
   * @param[in] callback A PP_CompletionCallback to run on asynchronous
   * completion. This callback will run when body is downloaded or an error
   * occurs after FinishStreamingToFile() returns PP_OK_COMPLETIONPENDING.
   * @return An int32_t containing the number of bytes read or an error code
   * from pp_errors.h.
   */
  int32_t (*FinishStreamingToFile)(PP_Resource loader,
                                   struct PP_CompletionCallback callback);

  /**
   * Close is a pointer to a function used to cancel any pending IO and close
   * the URLLoader object. Any pending callbacks will still run, reporting
   * PP_ERROR_ABORTED if pending IO was interrupted.  It is NOT valid to call
   * Open() again after a call to this function.
   *
   * Note: If the URLLoader object is destroyed while it is still open, then it
   * will be implicitly closed so you are not required to call Close().
   *
   * @param[in] loader A PP_Resource corresponding to a URLLoader.
   */
  void (*Close)(PP_Resource loader);
};
/**
 * @}
 */

#endif  /* PPAPI_C_PPB_URL_LOADER_H_ */