view dynamin/c/curl.d @ 55:c138461bf845

Add focusing and other changes that are related like descendantAdded/Removed events, Window.activated event, and updating List. Window.state was also added, even though focusing does not depend on it.
author Jordan Miner <jminer7@gmail.com>
date Sat, 08 Aug 2009 15:42:27 -0500
parents aa4efef0f0b1
children
line wrap: on
line source

module dynamin.c.curl;

/*
 * A largely complete binding to the cURL library version 7.15.
 */

version(build) { pragma(link, curl); }

extern(C):

alias void CURL;

CURL* curl_easy_init();

CURLcode curl_easy_setopt(CURL* curl, CURLoption option, ...);

CURLcode curl_easy_perform(CURL* curl);

void curl_easy_cleanup(CURL* curl);

CURLcode curl_easy_getinfo(CURL* curl, CURLINFO info, ...);

CURL* curl_easy_duphandle(CURL* curl);

void curl_easy_reset(CURL* curl);

const int HTTPPOST_FILENAME    = 1 << 0;
const int HTTPPOST_READFILE    = 1 << 1;
const int HTTPPOST_PTRNAME     = 1 << 2;
const int HTTPPOST_PTRCONTENTS = 1 << 3;
const int HTTPPOST_BUFFER      = 1 << 4;
const int HTTPPOST_PTRBUFFER   = 1 << 5;

struct curl_httppost {
	curl_httppost* next;
	char* name;
	int namelength;
	char* contents;
	int contentslength;
	char* buffer;
	int bufferlength;
	char* contenttype;
	curl_slist* contentheader;
	curl_httppost* more;
	int flags;
	char* showfilename;
}

alias int function(
	void* clientp,
	double dltotal,
	double dlnow,
	double ultotal,
	double ulnow) curl_progress_callback;

const int CURL_MAX_WRITE_SIZE = 16384;

alias size_t function(
	char* buffer,
	size_t size,
	size_t nitems,
	void* outstream) curl_write_callback;

const int CURL_READFUNC_ABORT = 0x10000000;

alias size_t function(
	char* buffer,
	size_t size,
	size_t nitems,
	void* instream) curl_read_callback;

alias int curlioerr;
enum {
	CURLIOE_OK,
	CURLIOE_UNKNOWNCMD,
	CURLIOE_FAILRESTART,

	CURLIOE_LAST
}

alias int curliocmd;
enum {
	CURLIOCMD_NOP,
	CURLIOCMD_RESTARTREAD,

	CURLIOCMD_LAST
}

alias curlioerr function(
	CURL* handle,
	int cmd,
	void* clientp) curl_ioctl_callback;

alias void* function(size_t size) curl_malloc_callback;
alias void function(void* ptr) curl_free_callback;
alias void* function(void* ptr, size_t size) curl_realloc_callback;
alias char* function(char* str) curl_strdup_callback;
alias void* function(size_t nmemb, size_t size) curl_calloc_callback;

alias int curl_infotype;
enum {
	CURLINFO_TEXT = 0,
	CURLINFO_HEADER_IN,
	CURLINFO_HEADER_OUT,
	CURLINFO_DATA_IN,
	CURLINFO_DATA_OUT,
	CURLINFO_SSL_DATA_IN,
	CURLINFO_SSL_DATA_OUT,

	CURLINFO_END
}

alias int function(
	CURL* handle,
	curl_infotype type,
	char* data,
	size_t size,
	void* userptr) curl_debug_callback;

alias int CURLcode;
enum {
	CURLE_OK = 0,
	CURLE_UNSUPPORTED_PROTOCOL,
	CURLE_FAILED_INIT,
	CURLE_URL_MALFORMAT,
	CURLE_URL_MALFORMAT_USER,
	CURLE_COULDNT_RESOLVE_PROXY,
	CURLE_COULDNT_RESOLVE_HOST,
	CURLE_COULDNT_CONNECT,
	CURLE_FTP_WEIRD_SERVER_REPLY,
	CURLE_FTP_ACCESS_DENIED,
	CURLE_FTP_USER_PASSWORD_INCORRECT,
	CURLE_FTP_WEIRD_PASS_REPLY,
	CURLE_FTP_WEIRD_USER_REPLY,
	CURLE_FTP_WEIRD_PASV_REPLY,
	CURLE_FTP_WEIRD_227_FORMAT,
	CURLE_FTP_CANT_GET_HOST,
	CURLE_FTP_CANT_RECONNECT,
	CURLE_FTP_COULDNT_SET_BINARY,
	CURLE_PARTIAL_FILE,
	CURLE_FTP_COULDNT_RETR_FILE,
	CURLE_FTP_WRITE_ERROR,
	CURLE_FTP_QUOTE_ERROR,
	CURLE_HTTP_RETURNED_ERROR,
	CURLE_WRITE_ERROR,
	CURLE_MALFORMAT_USER,
	CURLE_FTP_COULDNT_STOR_FILE,
	CURLE_READ_ERROR,
	CURLE_OUT_OF_MEMORY,
	CURLE_OPERATION_TIMEOUTED,
	CURLE_FTP_COULDNT_SET_ASCII,
	CURLE_FTP_PORT_FAILED,
	CURLE_FTP_COULDNT_USE_REST,
	CURLE_FTP_COULDNT_GET_SIZE,
	CURLE_HTTP_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_LIBRARY_NOT_FOUND,
	CURLE_FUNCTION_NOT_FOUND,
	CURLE_ABORTED_BY_CALLBACK,
	CURLE_BAD_FUNCTION_ARGUMENT,
	CURLE_BAD_CALLING_ORDER,
	CURLE_INTERFACE_FAILED,
	CURLE_BAD_PASSWORD_ENTERED,
	CURLE_TOO_MANY_REDIRECTS ,
	CURLE_UNKNOWN_TELNET_OPTION,
	CURLE_TELNET_OPTION_SYNTAX ,
	CURLE_OBSOLETE,
	CURLE_SSL_PEER_CERTIFICATE,
	CURLE_GOT_NOTHING,
	CURLE_SSL_ENGINE_NOTFOUND,
	CURLE_SSL_ENGINE_SETFAILED,
	CURLE_SEND_ERROR,
	CURLE_RECV_ERROR,
	CURLE_SHARE_IN_USE,
	CURLE_SSL_CERTPROBLEM,
	CURLE_SSL_CIPHER,
	CURLE_SSL_CACERT,
	CURLE_BAD_CONTENT_ENCODING,
	CURLE_LDAP_INVALID_URL,
	CURLE_FILESIZE_EXCEEDED,
	CURLE_FTP_SSL_FAILED,
	CURLE_SEND_FAIL_REWIND,
	CURLE_SSL_ENGINE_INITFAILED,
	CURLE_LOGIN_DENIED,
	CURLE_TFTP_NOTFOUND,
	CURLE_TFTP_PERM,
	CURLE_TFTP_DISKFULL,
	CURLE_TFTP_ILLEGAL,
	CURLE_TFTP_UNKNOWNID,
	CURLE_TFTP_EXISTS,
	CURLE_TFTP_NOSUCHUSER,
	CURLE_CONV_FAILED,
	CURLE_CONV_REQD,

	CURL_LAST
}

alias CURLcode function(char* buffer, size_t length) curl_conv_callback;
alias CURLcode function(
	CURL* curl,
	void* ssl_ctx,
	void* userptr) curl_ssl_ctx_callback;

alias int curl_proxytype;
enum {
	CURLPROXY_HTTP = 0,
	CURLPROXY_SOCKS4 = 4,
	CURLPROXY_SOCKS5 = 5
}

const int CURLAUTH_NONE         = 0;
const int CURLAUTH_BASIC        = 1 << 0;
const int CURLAUTH_DIGEST       = 1 << 1;
const int CURLAUTH_GSSNEGOTIATE = 1 << 2;
const int CURLAUTH_NTLM         = 1 << 3;
const int CURLAUTH_ANY          = ~0;
const int CURLAUTH_ANYSAFE      = ~CURLAUTH_BASIC;

alias int curl_ftpssl;
enum {
	CURLFTPSSL_NONE,
	CURLFTPSSL_TRY,
	CURLFTPSSL_CONTROL,
	CURLFTPSSL_ALL,

	CURLFTPSSL_LAST
}

alias int curl_ftpauth;
enum {
	CURLFTPAUTH_DEFAULT,
	CURLFTPAUTH_SSL,
	CURLFTPAUTH_TLS,

	CURLFTPAUTH_LAST
}

alias int curl_ftpmethod;
enum {
	CURLFTPMETHOD_DEFAULT,
	CURLFTPMETHOD_MULTICWD,
	CURLFTPMETHOD_NOCWD,
	CURLFTPMETHOD_SINGLECWD,

	CURLFTPMETHOD_LAST
}

const int CURLOPTTYPE_LONG =          0;     // usually 32 bits
const int CURLOPTTYPE_OBJECTPOINT =   10000; // a pointer
const int CURLOPTTYPE_FUNCTIONPOINT = 20000; // a function pointer
const int CURLOPTTYPE_OFF_T =         30000; // usually 64 bits

alias int CURLoption;
enum {
	CURLOPT_FILE             = CURLOPTTYPE_OBJECTPOINT + 1,
	CURLOPT_URL              = CURLOPTTYPE_OBJECTPOINT + 2,
	CURLOPT_PORT             = CURLOPTTYPE_LONG + 3,
	CURLOPT_PROXY            = CURLOPTTYPE_OBJECTPOINT + 4,
	CURLOPT_USERPWD          = CURLOPTTYPE_OBJECTPOINT + 5,
	CURLOPT_PROXYUSERPWD     = CURLOPTTYPE_OBJECTPOINT + 6,
	CURLOPT_RANGE            = CURLOPTTYPE_OBJECTPOINT + 7,
	CURLOPT_INFILE           = CURLOPTTYPE_OBJECTPOINT + 9,
	CURLOPT_ERRORBUFFER      = CURLOPTTYPE_OBJECTPOINT + 10,
	CURLOPT_WRITEFUNCTION    = CURLOPTTYPE_FUNCTIONPOINT + 11,
	CURLOPT_READFUNCTION     = CURLOPTTYPE_FUNCTIONPOINT + 12,
	CURLOPT_TIMEOUT          = CURLOPTTYPE_LONG + 13,
	CURLOPT_INFILESIZE       = CURLOPTTYPE_LONG + 14,
	CURLOPT_POSTFIELDS       = CURLOPTTYPE_OBJECTPOINT + 15,
	CURLOPT_REFERER          = CURLOPTTYPE_OBJECTPOINT + 16,
	CURLOPT_FTPPORT          = CURLOPTTYPE_OBJECTPOINT + 17,
	CURLOPT_USERAGENT        = CURLOPTTYPE_OBJECTPOINT + 18,
	CURLOPT_LOW_SPEED_LIMIT  = CURLOPTTYPE_LONG + 19,
	CURLOPT_LOW_SPEED_TIME   = CURLOPTTYPE_LONG + 20,
	CURLOPT_RESUME_FROM      = CURLOPTTYPE_LONG + 21,
	CURLOPT_COOKIE           = CURLOPTTYPE_OBJECTPOINT + 22,
	CURLOPT_HTTPHEADER       = CURLOPTTYPE_OBJECTPOINT + 23,
	CURLOPT_HTTPPOST         = CURLOPTTYPE_OBJECTPOINT + 24,
	CURLOPT_SSLCERT          = CURLOPTTYPE_OBJECTPOINT + 25,
	CURLOPT_SSLCERTPASSWD    = CURLOPTTYPE_OBJECTPOINT + 26,
	CURLOPT_SSLKEYPASSWD     = CURLOPTTYPE_OBJECTPOINT + 26,
	CURLOPT_CRLF             = CURLOPTTYPE_LONG + 27,
	CURLOPT_QUOTE            = CURLOPTTYPE_OBJECTPOINT + 28,
	CURLOPT_WRITEHEADER      = CURLOPTTYPE_OBJECTPOINT + 29,
	CURLOPT_COOKIEFILE       = CURLOPTTYPE_OBJECTPOINT + 31,
	CURLOPT_SSLVERSION       = CURLOPTTYPE_LONG + 32,
	CURLOPT_TIMECONDITION    = CURLOPTTYPE_LONG + 33,
	CURLOPT_TIMEVALUE        = CURLOPTTYPE_LONG + 34,
	CURLOPT_CUSTOMREQUEST    = CURLOPTTYPE_OBJECTPOINT + 36,
	CURLOPT_STDERR           = CURLOPTTYPE_OBJECTPOINT + 37,
	CURLOPT_POSTQUOTE        = CURLOPTTYPE_OBJECTPOINT + 39,
	CURLOPT_WRITEINFO        = CURLOPTTYPE_OBJECTPOINT + 40,
	CURLOPT_VERBOSE          = CURLOPTTYPE_LONG + 41,
	CURLOPT_HEADER           = CURLOPTTYPE_LONG + 42,
	CURLOPT_NOPROGRESS       = CURLOPTTYPE_LONG + 43,
	CURLOPT_NOBODY           = CURLOPTTYPE_LONG + 44,
	CURLOPT_FAILONERROR      = CURLOPTTYPE_LONG + 45,
	CURLOPT_UPLOAD           = CURLOPTTYPE_LONG + 46,
	CURLOPT_POST             = CURLOPTTYPE_LONG + 47,
	CURLOPT_FTPLISTONLY      = CURLOPTTYPE_LONG + 48,
	CURLOPT_FTPAPPEND        = CURLOPTTYPE_LONG + 50,
	CURLOPT_NETRC            = CURLOPTTYPE_LONG + 51,
	CURLOPT_FOLLOWLOCATION   = CURLOPTTYPE_LONG + 52,
	CURLOPT_TRANSFERTEXT     = CURLOPTTYPE_LONG + 53,
	CURLOPT_PUT              = CURLOPTTYPE_LONG + 54,
	CURLOPT_PROGRESSFUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 56,
	CURLOPT_PROGRESSDATA     = CURLOPTTYPE_OBJECTPOINT + 57,
	CURLOPT_AUTOREFERER      = CURLOPTTYPE_LONG + 58,
	CURLOPT_PROXYPORT        = CURLOPTTYPE_LONG + 59,
	CURLOPT_POSTFIELDSIZE    = CURLOPTTYPE_LONG + 60,
	CURLOPT_HTTPPROXYTUNNEL  = CURLOPTTYPE_LONG + 61,
	CURLOPT_INTERFACE        = CURLOPTTYPE_OBJECTPOINT + 62,
	CURLOPT_KRB4LEVEL        = CURLOPTTYPE_OBJECTPOINT + 63,
	CURLOPT_SSL_VERIFYPEER   = CURLOPTTYPE_LONG + 64,
	CURLOPT_CAINFO           = CURLOPTTYPE_OBJECTPOINT + 65,
	CURLOPT_MAXREDIRS        = CURLOPTTYPE_LONG + 68,
	CURLOPT_FILETIME         = CURLOPTTYPE_LONG + 69,
	CURLOPT_TELNETOPTIONS    = CURLOPTTYPE_OBJECTPOINT + 70,
	CURLOPT_MAXCONNECTS      = CURLOPTTYPE_LONG + 71,
	CURLOPT_CLOSEPOLICY      = CURLOPTTYPE_LONG + 72,
	CURLOPT_FRESH_CONNECT    = CURLOPTTYPE_LONG + 74,
	CURLOPT_FORBID_REUSE     = CURLOPTTYPE_LONG + 75,
	CURLOPT_RANDOM_FILE      = CURLOPTTYPE_OBJECTPOINT + 76,
	CURLOPT_EGDSOCKET        = CURLOPTTYPE_OBJECTPOINT + 77,
	CURLOPT_CONNECTTIMEOUT   = CURLOPTTYPE_LONG + 78,
	CURLOPT_HEADERFUNCTION   = CURLOPTTYPE_FUNCTIONPOINT + 79,
	CURLOPT_HTTPGET          = CURLOPTTYPE_LONG + 80,
	CURLOPT_SSL_VERIFYHOST   = CURLOPTTYPE_LONG + 81,
	CURLOPT_COOKIEJAR        = CURLOPTTYPE_OBJECTPOINT + 82,
	CURLOPT_SSL_CIPHER_LIST  = CURLOPTTYPE_OBJECTPOINT + 83,
	CURLOPT_HTTP_VERSION     = CURLOPTTYPE_LONG + 84,
	CURLOPT_FTP_USE_EPSV     = CURLOPTTYPE_LONG + 85,
	CURLOPT_SSLCERTTYPE      = CURLOPTTYPE_OBJECTPOINT + 86,
	CURLOPT_SSLKEY           = CURLOPTTYPE_OBJECTPOINT + 87,
	CURLOPT_SSLKEYTYPE       = CURLOPTTYPE_OBJECTPOINT + 88,
	CURLOPT_SSLENGINE        = CURLOPTTYPE_OBJECTPOINT + 89,
	CURLOPT_SSLENGINE_DEFAULT = CURLOPTTYPE_LONG + 90,
	CURLOPT_DNS_USE_GLOBAL_CACHE = CURLOPTTYPE_LONG + 91,
	CURLOPT_DNS_CACHE_TIMEOUT = CURLOPTTYPE_LONG + 92,
	CURLOPT_PREQUOTE         = CURLOPTTYPE_OBJECTPOINT + 93,
	CURLOPT_DEBUGFUNCTION    = CURLOPTTYPE_FUNCTIONPOINT + 94,
	CURLOPT_DEBUGDATA        = CURLOPTTYPE_OBJECTPOINT + 95,
	CURLOPT_COOKIESESSION    = CURLOPTTYPE_LONG + 96,
	CURLOPT_CAPATH           = CURLOPTTYPE_OBJECTPOINT + 97,
	CURLOPT_BUFFERSIZE       = CURLOPTTYPE_LONG + 98,
	CURLOPT_NOSIGNAL         = CURLOPTTYPE_LONG + 99,
	CURLOPT_SHARE            = CURLOPTTYPE_OBJECTPOINT + 100,
	CURLOPT_PROXYTYPE        = CURLOPTTYPE_LONG + 101,
	CURLOPT_ENCODING         = CURLOPTTYPE_OBJECTPOINT + 102,
	CURLOPT_PRIVATE          = CURLOPTTYPE_OBJECTPOINT + 103,
	CURLOPT_HTTP200ALIASES   = CURLOPTTYPE_OBJECTPOINT + 104,
	CURLOPT_UNRESTRICTED_AUTH = CURLOPTTYPE_LONG + 105,
	CURLOPT_FTP_USE_EPRT     = CURLOPTTYPE_LONG + 106,
	CURLOPT_HTTPAUTH         = CURLOPTTYPE_LONG + 107,
	CURLOPT_SSL_CTX_FUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 108,
	CURLOPT_SSL_CTX_DATA     = CURLOPTTYPE_OBJECTPOINT + 109,
	CURLOPT_FTP_CREATE_MISSING_DIRS = CURLOPTTYPE_LONG + 110,
	CURLOPT_PROXYAUTH        = CURLOPTTYPE_LONG + 111,
	CURLOPT_FTP_RESPONSE_TIMEOUT = CURLOPTTYPE_LONG + 112,
	CURLOPT_IPRESOLVE        = CURLOPTTYPE_LONG + 113,
	CURLOPT_MAXFILESIZE      = CURLOPTTYPE_LONG + 114,
	CURLOPT_INFILESIZE_LARGE = CURLOPTTYPE_OFF_T + 115,
	CURLOPT_RESUME_FROM_LARGE = CURLOPTTYPE_OFF_T + 116,
	CURLOPT_MAXFILESIZE_LARGE = CURLOPTTYPE_OFF_T + 117,
	CURLOPT_NETRC_FILE       = CURLOPTTYPE_OBJECTPOINT + 118,
	CURLOPT_FTP_SSL          = CURLOPTTYPE_LONG + 119,
	CURLOPT_POSTFIELDSIZE_LARGE = CURLOPTTYPE_OFF_T + 120,
	CURLOPT_TCP_NODELAY      = CURLOPTTYPE_LONG + 121,
	CURLOPT_SOURCE_USERPWD   = CURLOPTTYPE_OBJECTPOINT + 123,
	CURLOPT_SOURCE_PREQUOTE  = CURLOPTTYPE_OBJECTPOINT + 127,
	CURLOPT_SOURCE_POSTQUOTE = CURLOPTTYPE_OBJECTPOINT + 128,
	CURLOPT_FTPSSLAUTH       = CURLOPTTYPE_LONG + 129,
	CURLOPT_IOCTLFUNCTION    = CURLOPTTYPE_FUNCTIONPOINT + 130,
	CURLOPT_IOCTLDATA        = CURLOPTTYPE_OBJECTPOINT + 131,
	CURLOPT_SOURCE_URL       = CURLOPTTYPE_OBJECTPOINT + 132,
	CURLOPT_SOURCE_QUOTE     = CURLOPTTYPE_OBJECTPOINT + 133,
	CURLOPT_FTP_ACCOUNT      = CURLOPTTYPE_OBJECTPOINT + 134,
	CURLOPT_COOKIELIST       = CURLOPTTYPE_OBJECTPOINT + 135,
	CURLOPT_IGNORE_CONTENT_LENGTH = CURLOPTTYPE_LONG + 136,
	CURLOPT_FTP_SKIP_PASV_IP = CURLOPTTYPE_LONG + 137,
	CURLOPT_FTP_FILEMETHOD   = CURLOPTTYPE_LONG + 138,
	CURLOPT_LOCALPORT        = CURLOPTTYPE_LONG + 139,
	CURLOPT_LOCALPORTRANGE   = CURLOPTTYPE_LONG + 140,
	CURLOPT_CONNECT_ONLY     = CURLOPTTYPE_LONG + 141,
	CURLOPT_CONV_FROM_NETWORK_FUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 142,
	CURLOPT_CONV_TO_NETWORK_FUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 143,
	CURLOPT_CONV_FROM_UTF8_FUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 144,
	CURLOPT_MAX_SEND_SPEED_LARGE = CURLOPTTYPE_OFF_T + 145,
	CURLOPT_MAX_RECV_SPEED_LARGE = CURLOPTTYPE_OFF_T + 146,
	CURLOPT_FTP_ALTERNATIVE_TO_USER = CURLOPTTYPE_OBJECTPOINT + 147,

	CURLOPT_LASTENTRY
}

const int CURL_IPRESOLVE_WHATEVER = 0;
const int CURL_IPRESOLVE_V4 = 1;
const int CURL_IPRESOLVE_V6 = 2;
const int CURLOPT_WRITEDATA = CURLOPT_FILE;
const int CURLOPT_READDATA = CURLOPT_INFILE;
const int CURLOPT_HEADERDATA = CURLOPT_WRITEHEADER;

enum {
	CURL_HTTP_VERSION_NONE,
	CURL_HTTP_VERSION_1_0,
	CURL_HTTP_VERSION_1_1,

	CURL_HTTP_VERSION_LAST
}

enum {
	CURL_NETRC_IGNORED,
	CURL_NETRC_OPTIONAL,
	CURL_NETRC_REQUIRED,

	CURL_NETRC_LAST
}

enum {
	CURL_SSLVERSION_DEFAULT,
	CURL_SSLVERSION_TLSv1,
	CURL_SSLVERSION_SSLv2,
	CURL_SSLVERSION_SSLv3,

	CURL_SSLVERSION_LAST
}

enum {
	CURL_TIMECOND_NONE,
	CURL_TIMECOND_IFMODSINCE,
	CURL_TIMECOND_IFUNMODSINCE,
	CURL_TIMECOND_LASTMOD,

	CURL_TIMECOND_LAST
}

alias int CURLformoption;
enum {
	CURLFORM_NOTHING,
	CURLFORM_COPYNAME,
	CURLFORM_PTRNAME,
	CURLFORM_NAMELENGTH,
	CURLFORM_COPYCONTENTS,
	CURLFORM_PTRCONTENTS,
	CURLFORM_CONTENTSLENGTH,
	CURLFORM_FILECONTENT,
	CURLFORM_ARRAY,
	CURLFORM_OBSOLETE,
	CURLFORM_FILE,
	CURLFORM_BUFFER,
	CURLFORM_BUFFERPTR,
	CURLFORM_BUFFERLENGTH,
	CURLFORM_CONTENTTYPE,
	CURLFORM_CONTENTHEADER,
	CURLFORM_FILENAME,
	CURLFORM_END,
	CURLFORM_OBSOLETE2,
	CURLFORM_LASTENTRY
}

struct curl_forms {
	CURLformoption option;
	char* value;
}

alias int CURLFORMcode;
enum {
	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
}

CURLFORMcode curl_formadd(
	curl_httppost** httppost,
	curl_httppost** last_post,
	...);

alias size_t function(void* arg, char* buf, size_t len) curl_formget_callback;

int curl_formget(curl_httppost* form, void* arg, curl_formget_callback append);

void curl_formfree(curl_httppost* form);

char* curl_getenv(char* variable);

char* curl_version();

char* curl_easy_escape(CURL* handle, char* string, int length);

char* curl_easy_unescape(
	CURL* handle,
	char* string,
	int length,
	int* outlength);

void curl_free(void* p);

CURLcode curl_global_init(int flags);

CURLcode curl_global_init_mem(
	int flags,
	curl_malloc_callback m,
	curl_free_callback f,
	curl_realloc_callback r,
	curl_strdup_callback s,
	curl_calloc_callback c);

void curl_global_cleanup();

struct curl_slist {
	char* data;
	curl_slist* next;
}

curl_slist* curl_slist_append(curl_slist*, char*);

void curl_slist_free_all(curl_slist*);

size_t curl_getdate(char* p, size_t* unused);

const int CURLINFO_STRING   = 0x100000;
const int CURLINFO_LONG     = 0x200000;
const int CURLINFO_DOUBLE   = 0x300000;
const int CURLINFO_SLIST    = 0x400000;
const int CURLINFO_MASK     = 0x0fffff;
const int CURLINFO_TYPEMASK = 0xf00000;

alias int CURLINFO;
enum {
	CURLINFO_NONE,

	CURLINFO_EFFECTIVE_URL    = CURLINFO_STRING + 1,
	CURLINFO_RESPONSE_CODE    = CURLINFO_LONG   + 2,
	CURLINFO_TOTAL_TIME       = CURLINFO_DOUBLE + 3,
	CURLINFO_NAMELOOKUP_TIME  = CURLINFO_DOUBLE + 4,
	CURLINFO_CONNECT_TIME     = CURLINFO_DOUBLE + 5,
	CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6,
	CURLINFO_SIZE_UPLOAD      = CURLINFO_DOUBLE + 7,
	CURLINFO_SIZE_DOWNLOAD    = CURLINFO_DOUBLE + 8,
	CURLINFO_SPEED_DOWNLOAD   = CURLINFO_DOUBLE + 9,
	CURLINFO_SPEED_UPLOAD     = CURLINFO_DOUBLE + 10,
	CURLINFO_HEADER_SIZE      = CURLINFO_LONG   + 11,
	CURLINFO_REQUEST_SIZE     = CURLINFO_LONG   + 12,
	CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG   + 13,
	CURLINFO_FILETIME         = CURLINFO_LONG   + 14,
	CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15,
	CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16,
	CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17,
	CURLINFO_CONTENT_TYPE     = CURLINFO_STRING + 18,
	CURLINFO_REDIRECT_TIME    = CURLINFO_DOUBLE + 19,
	CURLINFO_REDIRECT_COUNT   = CURLINFO_LONG   + 20,
	CURLINFO_PRIVATE          = CURLINFO_STRING + 21,
	CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG   + 22,
	CURLINFO_HTTPAUTH_AVAIL   = CURLINFO_LONG   + 23,
	CURLINFO_PROXYAUTH_AVAIL  = CURLINFO_LONG   + 24,
	CURLINFO_OS_ERRNO         = CURLINFO_LONG   + 25,
	CURLINFO_NUM_CONNECTS     = CURLINFO_LONG   + 26,
	CURLINFO_SSL_ENGINES      = CURLINFO_SLIST  + 27,
	CURLINFO_COOKIELIST       = CURLINFO_SLIST  + 28,
	CURLINFO_LASTSOCKET       = CURLINFO_LONG   + 29,
	CURLINFO_FTP_ENTRY_PATH   = CURLINFO_STRING + 30,

	CURLINFO_LASTONE          = 30
}

alias int curl_closepolicy;
enum {
	CURLCLOSEPOLICY_NONE,

	CURLCLOSEPOLICY_OLDEST,
	CURLCLOSEPOLICY_LEAST_RECENTLY_USED,
	CURLCLOSEPOLICY_LEAST_TRAFFIC,
	CURLCLOSEPOLICY_SLOWEST,
	CURLCLOSEPOLICY_CALLBACK,

	CURLCLOSEPOLICY_LAST
}

const int CURL_GLOBAL_SSL     = 1 << 0;
const int CURL_GLOBAL_WIN32   = 1 << 1;
const int CURL_GLOBAL_ALL     = CURL_GLOBAL_SSL | CURL_GLOBAL_WIN32;
const int CURL_GLOBAL_NOTHING = 0;
const int CURL_GLOBAL_DEFAULT = CURL_GLOBAL_ALL;

//{{{ share
alias int curl_lock_data;
enum {
	CURL_LOCK_DATA_NONE = 0,
	CURL_LOCK_DATA_SHARE,
	CURL_LOCK_DATA_COOKIE,
	CURL_LOCK_DATA_DNS,
	CURL_LOCK_DATA_SSL_SESSION,
	CURL_LOCK_DATA_CONNECT,

	CURL_LOCK_DATA_LAST
}

alias int curl_lock_access;
enum {
	CURL_LOCK_ACCESS_NONE = 0,
	CURL_LOCK_ACCESS_SHARED = 1,
	CURL_LOCK_ACCESS_SINGLE = 2,

	CURL_LOCK_ACCESS_LAST
}

alias void function(
	CURL* handle,
	curl_lock_data data,
	curl_lock_access locktype,
	void* userptr) curl_lock_function;
alias void function(
	CURL* handle,
	curl_lock_data data,
	void* userptr) curl_unlock_function;

alias void CURLSH;

alias int CURLSHcode;
enum {
	CURLSHE_OK,
	CURLSHE_BAD_OPTION,
	CURLSHE_IN_USE,
	CURLSHE_INVALID,
	CURLSHE_NOMEM,

	CURLSHE_LAST
}

alias int CURLSHoption;
enum {
	CURLSHOPT_NONE,
	CURLSHOPT_SHARE,
	CURLSHOPT_UNSHARE,
	CURLSHOPT_LOCKFUNC,
	CURLSHOPT_UNLOCKFUNC,
	CURLSHOPT_USERDATA,

	CURLSHOPT_LAST
}

CURLSH* curl_share_init();

CURLSHcode curl_share_setopt(CURLSH*, CURLSHoption option, ...);

CURLSHcode curl_share_cleanup(CURLSH*);

char* curl_share_strerror(CURLSHcode);
//}}}

//{{{ version
alias int CURLversion;
enum {
	CURLVERSION_FIRST,
	CURLVERSION_SECOND,
	CURLVERSION_THIRD,

	CURLVERSION_LAST
}

const int CURLVERSION_NOW = CURLVERSION_THIRD;

struct curl_version_info_data {
	CURLversion age;
	char* version_str;
	uint version_num;
	char* host;
	int features;
	char* ssl_version;
	int ssl_version_num;
	char* libz_version;
	char** protocols;
	char* ares;
	int ares_num;
	char* libidn;
	int iconv_ver_num;
}

const int CURL_VERSION_IPV6         = 1 << 0;
const int CURL_VERSION_KERBEROS4    = 1 << 1;
const int CURL_VERSION_SSL          = 1 << 2;
const int CURL_VERSION_LIBZ         = 1 << 3;
const int CURL_VERSION_NTLM         = 1 << 4;
const int CURL_VERSION_GSSNEGOTIATE = 1 << 5;
const int CURL_VERSION_DEBUG        = 1 << 6;
const int CURL_VERSION_ASYNCHDNS    = 1 << 7;
const int CURL_VERSION_SPNEGO       = 1 << 8;
const int CURL_VERSION_LARGEFILE    = 1 << 9;
const int CURL_VERSION_IDN          = 1 << 10;
const int CURL_VERSION_SSPI         = 1 << 11;
const int CURL_VERSION_CONV         = 1 << 12;

curl_version_info_data* curl_version_info(CURLversion);

char* curl_easy_strerror(CURLcode);
//}}}