/****************************************************************************
 * apps/include/netutils/curl4nx.h
 *
 * This file is part of the NuttX RTOS:
 *
 *   Copyright (C) 2019 Sebastien Lorquet. All rights reserved.
 *   Author: Sebastien Lorquet <sebastien@lorquet.fr>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Institute nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 ****************************************************************************/

#ifndef __APPS_INCLUDE_NETUTILS_CURL4NX_H
#define __APPS_INCLUDE_NETUTILS_CURL4NX_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>

/****************************************************************************
 * Public Defines
 ****************************************************************************/

enum curl4nxerrors_e
{
  CURL4NXE_OK,
  CURL4NXE_UNSUPPORTED_PROTOCOL,
  CURL4NXE_FAILED_INIT,
  CURL4NXE_URL_MALFORMAT,
  CURL4NXE_NOT_BUILT_IN,
  CURL4NXE_COULDNT_RESOLVE_HOST,
  CURL4NXE_COULDNT_CONNECT,
  CURL4NXE_HTTP2,
  CURL4NXE_PARTIAL_FILE,
  CURL4NXE_HTTP_RETURNED_ERROR,
  CURL4NXE_WRITE_ERROR,
  CURL4NXE_UPLOAD_FAILED,
  CURL4NXE_READ_ERROR,
  CURL4NXE_OUT_OF_MEMORY,
  CURL4NXE_OPERATION_TIMEDOUT,
  CURL4NXE_RANGE_ERROR,
  CURL4NXE_HTTP_POST_ERROR,
  CURL4NXE_SSL_CONNECT_ERROR,
  CURL4NXE_BAD_DOWNLOAD_RESUME,
  CURL4NXE_FUNCTION_NOT_FOUND,
  CURL4NXE_ABORTED_BY_CALLBACK,
  CURL4NXE_BAD_FUNCTION_ARGUMENT,
  CURL4NXE_TOO_MANY_REDIRECTS,
  CURL4NXE_UNKNOWN_OPTION,
  CURL4NXE_GOT_NOTHING,
  CURL4NXE_SEND_ERROR,
  CURL4NXE_RECV_ERROR,
  CURL4NXE_SSL_CERTPROBLEM,
  CURL4NXE_SSL_CIPHER,
  CURL4NXE_PEER_FAILED_VERIFICATION,
  CURL4NXE_BAD_CONTENT_ENCODING,
  CURL4NXE_LOGIN_DENIED,
  CURL4NXE_REMOTE_DISK_FULL,
  CURL4NXE_REMOTE_FILE_EXISTS,
  CURL4NXE_SSL_CACERT_BADFILE,
  CURL4NXE_REMOTE_FILE_NOT_FOUND,
  CURL4NXE_AGAIN,
  CURL4NXE_SSL_ISSUER_ERROR,
  CURL4NXE_CHUNK_FAILED,
  CURL4NXE_SSL_PINNEDPUBKEYNOTMATCH,
  CURL4NXE_SSL_INVALIDCERTSTATUS,
  CURL4NXE_HTTP2_STREAM,
  CURL4NXE_RECURSIVE_API_CALL,
};

enum curl4nxopt_e
{
  /* Options that are currently implemented */

  CURL4NXOPT_URL,
  CURL4NXOPT_PORT,
  CURL4NXOPT_BUFFERSIZE,
  CURL4NXOPT_HEADERFUNCTION,
  CURL4NXOPT_HEADERDATA,
  CURL4NXOPT_FAILONERROR,
  CURL4NXOPT_FOLLOWLOCATION,
  CURL4NXOPT_MAXREDIRS,
  CURL4NXOPT_VERBOSE,

  /* Options that will be implemented */

  CURL4NXOPT_HEADER,
  CURL4NXOPT_NOPROGRESS,
  CURL4NXOPT_WRITEFUNCTION,
  CURL4NXOPT_WRITEDATA,
  CURL4NXOPT_READFUNCTION,
  CURL4NXOPT_READDATA,
  CURL4NXOPT_XFERINFOFUNCTION,
  CURL4NXOPT_XFERINFODATA,
  CURL4NXOPT_KEEP_SENDING_ON_ERROR,
  CURL4NXOPT_PATH_AS_IS,
  CURL4NXOPT_TCP_KEEPALIVE,
  CURL4NXOPT_TCP_KEEPIDLE,
  CURL4NXOPT_TCP_KEEPINTVL,
  CURL4NXOPT_PUT,
  CURL4NXOPT_POST,
  CURL4NXOPT_POSTFIELDS,
  CURL4NXOPT_POSTFIELDSIZE,
  CURL4NXOPT_COPYPOSTFIELDS,
  CURL4NXOPT_HTTPPOST,
  CURL4NXOPT_REFERER,
  CURL4NXOPT_USERAGENT,
  CURL4NXOPT_HTTPHEADER,
  CURL4NXOPT_HEADEROPT,
  CURL4NXOPT_HTTPGET,
  CURL4NXOPT_HTTP_VERSION,

  /* Options that will be implemented later */

  CURL4NXOPT_SSL_CTX_FUNCTION,
  CURL4NXOPT_SSL_CTX_DATA,
  CURL4NXOPT_USERNAME,
  CURL4NXOPT_PASSWORD,
  CURL4NXOPT_HTTPAUTH,
  CURL4NXOPT_POSTREDIR,
  CURL4NXOPT_COOKIE,
  CURL4NXOPT_COOKIEFILE,
  CURL4NXOPT_COOKIEJAR,
  CURL4NXOPT_COOKIESESSION,
  CURL4NXOPT_COOKIELIST,
  CURL4NXOPT_IGNORE_CONTENT_LENGTH,
  CURL4NXOPT_RANGE,
  CURL4NXOPT_RESUME_FROM,
  CURL4NXOPT_CUSTOMREQUEST,
  CURL4NXOPT_UPLOAD,
  CURL4NXOPT_UPLOAD_BUFFERSIZE,
  CURL4NXOPT_TIMEOUT,
  CURL4NXOPT_TIMEOUT_MS,
  CURL4NXOPT_FRESH_CONNECT,
  CURL4NXOPT_CONNECTTIMEOUT,
  CURL4NXOPT_CONNECTTIMEOUT_MS,
  CURL4NXOPT_USE_SSL,
  CURL4NXOPT_SSLCERT,
  CURL4NXOPT_SSLKEY,
  CURL4NXOPT_KEYPASSWD,
  CURL4NXOPT_SSLVERSION,
  CURL4NXOPT_SSL_VERIFYHOST,
  CURL4NXOPT_SSL_VERIFYPEER,
  CURL4NXOPT_SSL_VERIFYSTATUS,
  CURL4NXOPT_CAPATH,
  CURL4NXOPT_PINNEDPUBLICKEY,
  CURL4NXOPT_RANDOM_FILE,
  CURL4NXOPT_SSL_CIPHER_LIST,
  CURL4NXOPT_TLS13_CIPHERS,
  CURL4NXOPT_SSL_OPTIONS,
};

/* For CURL4NXOPT_HTTP_VERSION */

#define CURL4NX_HTTP_VERSION_1_0 0x10
#define CURL4NX_HTTP_VERSION_1_1 0x11
#define CURL4NX_HTTP_VERSION_2_0 0x20 /* Unsupported! */

/****************************************************************************
 * Public Types
 ****************************************************************************/

/****************************************************************************
 * Name: curl4nx_iofunction_f
 *
 * Description: Type of the callback function used with
 *   CURL4NXOPT_WRITEFUNCTION and CURL4NXOPT_READFUNCTION.
 *
 ****************************************************************************/

typedef size_t (*curl4nx_iofunc_f)(FAR char *ptr, size_t size,
                                   size_t nmemb, FAR void *userdata);

/****************************************************************************
 * Name: curl4nx_easy_strerror()
 *
 * Description: Return a textual description for an error code.
 *
 ****************************************************************************/

typedef int (*curl4nx_xferinfofunc_f)(FAR void *clientp,
                                      uint64_t dltotal, uint64_t dlnow,
                                      uint64_t ultotal, uint64_t ulnow);

#ifdef __cplusplus
extern "C"
{
#endif

/****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

/****************************************************************************
 * Name: curl4nx_easy_strerror()
 *
 * Description: Return a textual description for an error code.
 *
 ****************************************************************************/

FAR const char *curl4nx_easy_strerror(int errornum);

/****************************************************************************
 * Name: curl4nx_easy_init()
 *
 * Description: Initialize a context for curl4nx operations.
 *
 ****************************************************************************/

FAR struct curl4nx_s *curl4nx_easy_init(void);

/****************************************************************************
 * Name: curl4nx_easy_escape()
 *
 * Description: Escape an URL to remove any forbidden character. Returned
 *   string MUST be released using free().
 *
 ****************************************************************************/

FAR char *curl4nx_easy_escape(FAR struct curl4nx_s *handle,
                              FAR const char *string, int length);

/****************************************************************************
 * Name: curl4nx_easy_unescape()
 *
 * Description: Unescape an escaped URL to replace all escaped characters.
 *   Returned string MUST be released using free().
 *
 ****************************************************************************/

FAR char *curl4nx_easy_unescape(FAR struct curl4nx_s *handle,
                                FAR const char *url, int inlength,
                                FAR int *outlength);

/****************************************************************************
 * Name: curl4nx_easy_setopt()
 *
 * Description: Define an option in the given curl4nx context.
 *
 ****************************************************************************/

int curl4nx_easy_setopt(FAR struct curl4nx_s *handle, int option,
                        FAR void *optionptr);

/****************************************************************************
 * Name: curl4nx_easy_reset()
 *
 * Description: Reset all operations that were set using curl4nx_easy_setopt()
 *   to their default values.
 *
 ****************************************************************************/

void curl4nx_easy_reset(FAR struct curl4nx_s *handle);

/****************************************************************************
 * Name: curl4nx_easy_duphandle()
 *
 * Description: Clone the current state of a handle.
 *
 ****************************************************************************/

FAR struct curl4nx_s *curl4nx_easy_duphandle(FAR struct curl4nx_s *handle);

/****************************************************************************
 * Name: curl4nx_easy_perform()
 *
 * Description: Perform the http operation that was set up in this curl4nx
 *   context.
 *
 ****************************************************************************/

int curl4nx_easy_perform(FAR struct curl4nx_s *handle);

/****************************************************************************
 * Name: curl4nx_easy_getinfo()
 *
 * Description: Get information about the current transfer.
 *
 ****************************************************************************/

int curl4nx_easy_getinfo(FAR struct curl4nx_s *handle, int info,
                         FAR void *infoptr);

/****************************************************************************
 * Name: curl4nx_easy_cleanup()
 *
 * Description: Cleanup any resource allocated within a curl4nx context.
 *
 ****************************************************************************/

void curl4nx_easy_cleanup(FAR struct curl4nx_s *handle);

#ifdef __cplusplus
}
#endif

#endif /* __APPS_INCLUDE_NETUTILS_BASE64_H */