#if defined _curl_included
    #endinput
#endif
#define _curl_included

#pragma reqlib curl
#if !defined AMXMODX_NOAUTOLOAD
    #pragma loadlib curl
#endif

enum Handle
{
   INVALID = INVALID_HANDLE,
};

enum CURLcode
{
    INVALID = INVALID_HANDLE,
    CURLE_OK = 0,
    CURLE_UNSUPPORTED_PROTOCOL,
    CURLE_FAILED_INIT,
    CURLE_URL_MALFORMAT,
    CURLE_OBSOLETE4,
    CURLE_COULDNT_RESOLVE_PROXY,
    CURLE_COULDNT_RESOLVE_HOST,
    CURLE_COULDNT_CONNECT,
    CURLE_FTP_WEIRD_SERVER_REPLY,
    CURLE_REMOTE_ACCESS_DENIED,
    CURLE_OBSOLETE10,
    CURLE_FTP_WEIRD_PASS_REPLY,
    CURLE_OBSOLETE12,
    CURLE_FTP_WEIRD_PASV_REPLY,
    CURLE_FTP_WEIRD_227_FORMAT,
    CURLE_FTP_CANT_GET_HOST,
    CURLE_OBSOLETE16,
    CURLE_FTP_COULDNT_SET_TYPE,
    CURLE_PARTIAL_FILE,
    CURLE_FTP_COULDNT_RETR_FILE,
    CURLE_OBSOLETE20,
    CURLE_QUOTE_ERROR,
    CURLE_HTTP_RETURNED_ERROR,
    CURLE_WRITE_ERROR,
    CURLE_OBSOLETE24,
    CURLE_UPLOAD_FAILED,
    CURLE_READ_ERROR,
    CURLE_OUT_OF_MEMORY,
    CURLE_OPERATION_TIMEDOUT,
    CURLE_OBSOLETE29,
    CURLE_FTP_PORT_FAILED,
    CURLE_FTP_COULDNT_USE_REST,
    CURLE_OBSOLETE32,
    CURLE_RANGE_ERROR,
    CURLE_HTTP_POST_ERROR,
    CURLE_SSL_CONNECT_ERROR,
    CURLE_BAD_DOWNLOAD_RESUME,
    CURLE_FILE_COULDNT_READ_FILE,
    CURLE_LDAP_CANNOT_BIND,
    CURLE_LDAP_SEARCH_FAILED,
    CURLE_OBSOLETE40,
    CURLE_FUNCTION_NOT_FOUND,
    CURLE_ABORTED_BY_CALLBACK,
    CURLE_BAD_FUNCTION_ARGUMENT,
    CURLE_OBSOLETE44,
    CURLE_INTERFACE_FAILED,
    CURLE_OBSOLETE46,
    CURLE_TOO_MANY_REDIRECTS ,
    CURLE_UNKNOWN_TELNET_OPTION,
    CURLE_TELNET_OPTION_SYNTAX ,
    CURLE_OBSOLETE50,
    CURLE_PEER_FAILED_VERIFICATION,
    CURLE_GOT_NOTHING,
    CURLE_SSL_ENGINE_NOTFOUND,
    CURLE_SSL_ENGINE_SETFAILED,
    CURLE_SEND_ERROR,
    CURLE_RECV_ERROR,
    CURLE_OBSOLETE57,
    CURLE_SSL_CERTPROBLEM,
    CURLE_SSL_CIPHER,
    CURLE_SSL_CACERT,
    CURLE_BAD_CONTENT_ENCODING,
    CURLE_LDAP_INVALID_URL,
    CURLE_FILESIZE_EXCEEDED,
    CURLE_USE_SSL_FAILED,
    CURLE_SEND_FAIL_REWIND,
    CURLE_SSL_ENGINE_INITFAILED,
    CURLE_LOGIN_DENIED,
    CURLE_TFTP_NOTFOUND,
    CURLE_TFTP_PERM,
    CURLE_REMOTE_DISK_FULL,
    CURLE_TFTP_ILLEGAL,
    CURLE_TFTP_UNKNOWNID,
    CURLE_REMOTE_FILE_EXISTS,
    CURLE_TFTP_NOSUCHUSER,
    CURLE_CONV_FAILED,
    CURLE_CONV_REQD,
    CURLE_SSL_CACERT_BADFILE,
    CURLE_REMOTE_FILE_NOT_FOUND,
    CURLE_SSH,
    CURLE_SSL_SHUTDOWN_FAILED,
    CURLE_AGAIN,
    CURLE_SSL_CRL_BADFILE,
    CURLE_SSL_ISSUER_ERROR,
    CURL_LAST 
};

#define CURLOPTTYPE_LONG          0
#define CURLOPTTYPE_OBJECTPOINT   10000
#define CURLOPTTYPE_FUNCTIONPOINT 20000
#define CURLOPTTYPE_OFF_T         30000

#define LONG          CURLOPTTYPE_LONG
#define OBJECTPOINT   CURLOPTTYPE_OBJECTPOINT
#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT
#define OFF_T         CURLOPTTYPE_OFF_T

#define CINIT(%1,%2,%3) CURLOPT_%1 = %2 + %3

enum CURLoption {
    CINIT(URL, OBJECTPOINT, 2),
    CINIT(PORT, LONG, 3),
    CINIT(PROXY, OBJECTPOINT, 4),
    CINIT(USERPWD, OBJECTPOINT, 5),
    CINIT(PROXYUSERPWD, OBJECTPOINT, 6),
    CINIT(TIMEOUT, LONG, 13),
    CINIT(POSTFIELDS, OBJECTPOINT, 15),
    CINIT(REFERER, OBJECTPOINT, 16),
    CINIT(USERAGENT, OBJECTPOINT, 18),
    CINIT(LOW_SPEED_LIMIT, LONG, 19),
    CINIT(LOW_SPEED_TIME, LONG, 20),
    CINIT(RESUME_FROM, LONG, 21),
    CINIT(COOKIE, OBJECTPOINT, 22),
    CINIT(HTTPHEADER, OBJECTPOINT, 23),
    CINIT(HTTPPOST, OBJECTPOINT, 24),
    CINIT(CRLF, LONG, 27),
    CINIT(WRITEHEADER, OBJECTPOINT, 29),
    CINIT(COOKIEFILE, OBJECTPOINT, 31),
    CINIT(CUSTOMREQUEST, OBJECTPOINT, 36),
    CINIT(HEADER, LONG, 42),
    CINIT(NOBODY, LONG, 44),
    CINIT(FAILONERROR, LONG, 45),
    CINIT(UPLOAD, LONG, 46),
    CINIT(POST, LONG, 47),
    CINIT(FOLLOWLOCATION, LONG, 52),
    CINIT(PUT, LONG, 54),
    CINIT(AUTOREFERER, LONG, 58),
    CINIT(PROXYPORT, LONG, 59),
    CINIT(POSTFIELDSIZE, LONG, 60),
    CINIT(HTTPPROXYTUNNEL, LONG, 61),
    CINIT(INTERFACE, OBJECTPOINT, 62),
    CINIT(MAXCONNECTS, LONG, 71),
    CINIT(FRESH_CONNECT, LONG, 74),
    CINIT(FORBID_REUSE, LONG, 75),
    CINIT(CONNECTTIMEOUT, LONG, 78),
    CINIT(HTTPGET, LONG, 80),
    CINIT(COOKIEJAR, OBJECTPOINT, 82),
    CINIT(HTTP_VERSION, LONG, 84),
    CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91),
    CINIT(DNS_CACHE_TIMEOUT, LONG, 92),
    CINIT(COOKIESESSION, LONG, 96),
    CINIT(NOSIGNAL, LONG, 99),
    CINIT(SHARE, OBJECTPOINT, 100),
    CINIT(PROXYTYPE, LONG, 101),
    CINIT(ENCODING, OBJECTPOINT, 102),
    CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
    CINIT(UNRESTRICTED_AUTH, LONG, 105),
    CINIT(HTTPAUTH, LONG, 107),
    CINIT(PROXYAUTH, LONG, 111),
    CINIT(TIMEOUT_MS, LONG, 155),
    CINIT(CONNECTTIMEOUT_MS, LONG, 156),
    CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165),
    CINIT(USERNAME, OBJECTPOINT, 173),
    CINIT(PASSWORD, OBJECTPOINT, 174),
    CINIT(PROXYUSERNAME, OBJECTPOINT, 175),
    CINIT(PROXYPASSWORD, OBJECTPOINT, 176),
    CURLOPT_LASTENTRY 
};

enum CURLFORMcode {
  CURL_FORMADD_OK,
  CURL_FORMADD_MEMORY,
  CURL_FORMADD_OPTION_TWICE,
  CURL_FORMADD_NULL,
  CURL_FORMADD_UNKNOWN_OPTION,
  CURL_FORMADD_INCOMPLETE,
  CURL_FORMADD_ILLEGAL_ARRAY,
  CURL_FORMADD_DISABLED,
  CURL_FORMADD_LAST 
};

#define CFINIT(%1) CURLFORM_%1

enum CURLformoption {
  CFINIT(NOTHING),
  CFINIT(COPYNAME),
  CFINIT(PTRNAME),
  CFINIT(NAMELENGTH),
  CFINIT(COPYCONTENTS),
  CFINIT(PTRCONTENTS),
  CFINIT(CONTENTSLENGTH),
  CFINIT(FILECONTENT),
  CFINIT(ARRAY),
  CFINIT(OBSOLETE),
  CFINIT(FILE),

  CFINIT(BUFFER),
  CFINIT(BUFFERPTR),
  CFINIT(BUFFERLENGTH),

  CFINIT(CONTENTTYPE),
  CFINIT(CONTENTHEADER),
  CFINIT(FILENAME),
  CFINIT(END),
  CFINIT(OBSOLETE2),

  CFINIT(STREAM),

  CURLFORM_LASTENTRY 
};

native Handle:curl_init();
native curl_close(Handle:ch);
native curl_reset(Handle:ch);
native CURLcode:curl_errno(Handle:ch);
native CURLcode:curl_setopt_cell(Handle:ch, CURLoption:option, value);
native CURLcode:curl_setopt_string(Handle:ch, CURLoption:option, const value[]);
native CURLcode:curl_setopt_handle(Handle:ch, CURLoption:option, Handle:handle);
native CURLcode:curl_exec(Handle:ch, const callback[] = "", any:value = 0);
native CURLcode:curl_thread_exec(Handle:ch, const callback[] = "", any:value = 0);
native Handle:curl_duphandle(Handle:curl);
native curl_escape(Handle:curl, const val[], to[], length);
native curl_unescape(Handle:curl, const val[], to[], length);
native Handle:curl_create_slist();
native curl_destroy_slist(Handle:slist);
native curl_slist_append(Handle:slist, const str[]);
native Handle:curl_create_form();
native Handle:curl_destroy_form(Handle:form);
native CURLFORMcode:curl_form_add(Handle:form, any:...);