/****************************************************************************
 * apps/include/netutils/curl4nx.h
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.  The
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the
 * License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 ****************************************************************************/

#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 */