------------------------------------------------------------------------------
--                                adacurl                                   --
--                             Specification                                --
--                    Copyright (C) 2003 Andreas Almroth                    --
--                                                                          --
-- AdacURL is free  software; you  can  redistribute it  and/or modify it   --
-- under terms of the  GNU General Public License as published by the Free  --
-- Software Foundation; either version 2,  or (at your option) any later    --
-- version.  AdacURL is distributed in the  hope that it will be useful,    --
-- but  WITH  OUT  ANY  WARRANTY;  without  even the  implied  warranty  of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General --
-- Public License for more details.  You should have received a copy of the --
-- GNU General Public License distributed with AdacURL;  see file COPYING. --
-- If not,  write  to  the Free  Software  Foundation, 59 Temple Place -    --
-- Suite 330, Boston, MA 02111-1307, USA.                                   --
--                                                                          --
-- As a special exception,  if other files  instantiate  generics from this --
-- unit, or you link  this unit with other files  to produce an executable, --
-- this  unit  does not  by itself cause  the resulting  executable  to  be --
-- covered  by the  GNU  General  Public  License.  This exception does not --
-- however invalidate  any other reasons why  the executable file  might be --
-- covered by the  GNU Public License.                                      --
--                                                                          --
------------------------------------------------------------------------------
-- $Author: Andreas Almroth $
-- $Date: 03-07-29 17:15 $
-- $Workfile: adacurl.ads $
-- $Revision: 1 $
-- $State: Unstable $
--
-- HISTORY:
--
-- Revision 1: Initial release
--

with System;
with Interfaces.C;         use Interfaces.C;
with Interfaces.C.Strings; use Interfaces.C.Strings;
with Ada.Calendar; use Ada.Calendar;

package Adacurl is
   pragma Link_With("-lcurl");

   LIBCURL_VERSION : constant String := "7.10.6";
   LIBCURL_VERSION_NUM : constant := 16#070a06#;

   subtype time_t is long;
   type time_t_Pointer is access all time_t;

   subtype File_P is System.Address;

   HTTPPOST_FILENAME    : constant Long := 1;
   HTTPPOST_READFILE    : constant Long := 2;
   HTTPPOST_PTRNAME     : constant Long := 4;
   HTTPPOST_PTRCONTENTS : constant Long := 8;
   HTTPPOST_BUFFER      : constant Long := 16;
   HTTPPOST_PTRBUFFER   : constant Long := 32;

   type Curl_Slist;
   type Curl_Slist_P is access all Curl_Slist;

   type Curl_Slist is record
      Data : Chars_Ptr;
      Next : Curl_Slist_P;
   end record;
   pragma Convention(C,Curl_Slist);

   type Curl_Httppost;
   type Curl_Httppost_P is access all Curl_Httppost;

   type Curl_Httppost is record
      Next           : Curl_Httppost_P;
      Name           : Chars_Ptr;
      Namelength     : Long;
      Contents       : Chars_Ptr;
      Contentslength : Long;
      Buffer         : Chars_Ptr;
      Bufferlength   : Long;
      Contenttype    : Chars_Ptr;
      Contentheader  : Curl_Slist_P;
      More           : Curl_Httppost_P;
      Flags          : Long;
      Showfilename   : Chars_Ptr;
   end record;
   pragma Convention(C,Curl_Httppost);

   CURL_MAX_WRITE_SIZE : constant := 16384;

   type Curl_Progress_Callback
   is access function (Clientp : System.Address;
                       Dltotal : Double;
                       Dlnow   : Double;
                       Ultotal : Double;
                       Ulnow   : Double)
                      return Int;

   type Curl_Readwrite_Callback
   is access function (Buffer   : Chars_Ptr;
                       Size     : Size_T;
                       Nitems   : Size_T;
                       Instream : FILE_P)
                      return Size_T;

   type Curl_Passwd_Callback
   is access function (Clientp : System.Address;
                       Prompt  : Chars_Ptr;
                       Buffer  : Chars_Ptr;
                       Buflen  : Int) return Int;

   type Curl_Infotype is (CURLINFO_TEXT,
                          CURLINFO_HEADER_IN,
                          CURLINFO_HEADER_OUT,
                          CURLINFO_DATA_IN,
                          CURLINFO_DATA_OUT,
                          CURLINFO_END);
   pragma Convention(C,Curl_Infotype);

   type CURL is new System.Address; -- void
   type CURL_P is access all CURL;

   type Curl_Debug_Callback
   is access function (Handle : CURL_P;
                       Ctype  : Curl_Infotype;
                       Data   : Chars_Ptr;
                       Size   : Size_T;
                       Userp  : System.Address)
                      return Int;

   type CURLcode is (CURLE_OK,
                     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_NOT_FOUND,
                     -- CURLE_HTTP_NOT_FOUND = CURLE_HTTP_RETURNED_ERROR;
                     -- apparently a typo in earlier releases, but not of
                     -- our concern as this binding is for >=7.10.6.
                     CURLE_WRITE_ERROR,
                     CURLE_MALFORMAT_USER,
                     CURLE_FTP_COULDNT_STOR_FILE,
                     CURLE_READ_ERROR,
                     CURLE_OUT_OF_MEMORY,
                     CURLE_OPERATION_TIMEDOUT,
                     -- CURLE_OPERATION_TIMEDOUT = CURLE_OPERATION_TIMEOUTED
                     -- apparently a typo in earlier releases, but not of
                     -- our concern as this binding is for >=7.10.6.
                     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_HTTP_PORT_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,
                     CURL_LAST
                     -- CURLE_ALREADY_COMPLETE : constant := 99999;
                     -- Not used anymore
                     );
   pragma Convention(C,Curlcode);

   type Curl_Ssl_Ctx_Callback
   is access function (C       : CURL_P;
                       Ssl_Ctx : System.Address;
                       Userptr : System.Address) return CURLcode;

   type Curl_Proxytype is (CURLPROXY_HTTP,
                           CURLPROXY_SOCKS4,
                           CURLPROXY_SOCKS5);
   for Curl_Proxytype use (CURLPROXY_HTTP => 0,
                           CURLPROXY_SOCKS4 => 4,
                           CURLPROXY_SOCKS5 => 5);
   pragma Convention(C,Curl_Proxytype);


   CURLAUTH_NONE         : constant       := 0;
   CURLAUTH_BASIC        : constant   := 1;
   CURLAUTH_DIGEST       : constant  := 2;
   CURLAUTH_GSSNEGOTIATE : constant  := 4;
   CURLAUTH_NTLM         : constant  := 8;
   CURLAUTH_ANY          : constant := 16#ffffffff#; -- invert 0, assume 32 bit
   CURLAUTH_ANYSAFE      : constant := 16#fffffffe#; -- assume 32 bit (~CURLAUTH_BASIC)

   -- Not used
   -- CURLE_FTP_PARTIAL_FILE : constant := CURLE_PARTIAL_FILE;
   -- CURLE_FTP_BAD_DOWNLOAD_RESUME : constanr := CURLE_BAD_DOWNLOAD_RESUME;

   CURL_ERROR_SIZE : constant := 256;

   CURLOPTTYPE_LONG          : constant := 0;
   CURLOPTTYPE_OBJECTPOINT    : constant := 10000;
   CURLOPTTYPE_FUNCTIONPOINT : constant := 20000;

   type CURLoption is (CURLOPT_NOTHING,
                       CURLOPT_PORT,
                       CURLOPT_TIMEOUT,
                       CURLOPT_INFILESIZE,
                       CURLOPT_LOW_SPEED_LIMIT,
                       CURLOPT_LOW_SPEED_TIME,
                       CURLOPT_RESUME_FROM,
                       CURLOPT_CRLF,
                       CURLOPT_SSLVERSION,
                       CURLOPT_TIMECONDITION,
                       CURLOPT_TIMEVALUE,
                       CURLOPT_VERBOSE,
                       CURLOPT_HEADER,
                       CURLOPT_NOPROGRESS,
                       CURLOPT_NOBODY,
                       CURLOPT_FAILONERROR,
                       CURLOPT_UPLOAD,
                       CURLOPT_POST,
                       CURLOPT_FTPLISTONLY,
                       CURLOPT_FTPAPPEND,
                       CURLOPT_NETRC,
                       CURLOPT_FOLLOWLOCATION,
                       --CURLOPT_FTPASCII,
                       CURLOPT_TRANSFERTEXT,
                       CURLOPT_PUT,
                       CURLOPT_MUTE,
                       CURLOPT_AUTOREFERER,
                       CURLOPT_PROXYPORT,
                       CURLOPT_POSTFIELDSIZE,
                       CURLOPT_HTTPPROXYTUNNEL,
                       CURLOPT_SSL_VERIFYPEER,
                       CURLOPT_MAXREDIRS,
                       CURLOPT_MAXCONNECTS,
                       CURLOPT_CLOSEPOLICY,
                       CURLOPT_FRESH_CONNECT,
                       CURLOPT_FORBID_REUSE,
                       CURLOPT_CONNECTTIMEOUT,
                       CURLOPT_HTTPGET,
                       CURLOPT_SSL_VERIFYHOST,
                       CURLOPT_HTTP_VERSION,
                       CURLOPT_FTP_USE_EPSV,
                       CURLOPT_SSLENGINE_DEFAULT,
                       CURLOPT_DNS_USE_GLOBAL_CACHE,
                       CURLOPT_DNS_CACHE_TIMEOUT,
                       CURLOPT_COOKIESESSION,
                       CURLOPT_BUFFERSIZE,
                       CURLOPT_NOSIGNAL,
                       CURLOPT_PROXYTYPE,
                       CURLOPT_UNRESTRICTED_AUTH,
                       CURLOPT_FTP_USE_EPRT,
                       CURLOPT_FILE,
                       CURLOPT_URL,
                       CURLOPT_PROXY,
                       CURLOPT_USERPWD,
                       CURLOPT_PROXYUSERPWD,
                       CURLOPT_RANGE,
                       CURLOPT_INFILE,
                       CURLOPT_ERRORBUFFER,
                       CURLOPT_POSTFIELDS,
                       CURLOPT_REFERER,
                       CURLOPT_FTPPORT,
                       CURLOPT_USERAGENT,
                       CURLOPT_COOKIE,
                       CURLOPT_HTTPHEADER,
                       CURLOPT_HTTPPOST,
                       CURLOPT_SSLCERT,
                       -- CURLOPT_SSLCERTPASSWD,
                       CURLOPT_SSLKEYPASSWD,
                       CURLOPT_QUOTE,
                       CURLOPT_WRITEHEADER,
                       CURLOPT_COOKIEFILE,
                       CURLOPT_HTTPREQUEST,
                       CURLOPT_CUSTOMREQUEST,
                       CURLOPT_STDERR,
                       CURLOPT_POSTQUOTE,
                       CURLOPT_WRITEINFO,
                       CURLOPT_PROGRESSDATA,
                       CURLOPT_INTERFACE,
                       CURLOPT_KRB4LEVEL,
                       CURLOPT_CAINFO,
                       CURLOPT_PASSWDDATA,
                       CURLOPT_FILETIME,
                       CURLOPT_TELNETOPTIONS,
                       CURLOPT_RANDOM_FILE,
                       CURLOPT_EGDSOCKET,
                       CURLOPT_COOKIEJAR,
                       CURLOPT_SSL_CIPHER_LIST,
                       CURLOPT_SSLCERTTYPE,
                       CURLOPT_SSLKEY,
                       CURLOPT_SSLKEYTYPE,
                       CURLOPT_SSLENGINE,
                       CURLOPT_PREQUOTE,
                       CURLOPT_DEBUGDATA,
                       CURLOPT_CAPATH,
                       CURLOPT_SHARE,
                       CURLOPT_ENCODING,
                       CURLOPT_PRIVATE,
                       CURLOPT_HTTP200ALIASES,
                       CURLOPT_WRITEFUNCTION,
                       CURLOPT_READFUNCTION,
                       CURLOPT_PROGRESSFUNCTION,
                       CURLOPT_PASSWDFUNCTION,
                       CURLOPT_CLOSEFUNCTION,
                       CURLOPT_HEADERFUNCTION,
                       CURLOPT_DEBUGFUNCTION,
                       CURLOPT_LASTENTRY); -- what value?
   for Curloption use (CURLOPT_NOTHING => (CURLOPTTYPE_LONG + 0),
                       CURLOPT_PORT => (CURLOPTTYPE_LONG + 3),
                       CURLOPT_TIMEOUT => (CURLOPTTYPE_LONG + 13),
                       CURLOPT_INFILESIZE => (CURLOPTTYPE_LONG + 14),
                       CURLOPT_LOW_SPEED_LIMIT => (CURLOPTTYPE_LONG  + 19),
                       CURLOPT_LOW_SPEED_TIME => (CURLOPTTYPE_LONG + 20),
                       CURLOPT_RESUME_FROM => (CURLOPTTYPE_LONG + 21),
                       CURLOPT_CRLF => (CURLOPTTYPE_LONG + 27),
                       CURLOPT_SSLVERSION => (CURLOPTTYPE_LONG + 32),
                       CURLOPT_TIMECONDITION => (CURLOPTTYPE_LONG + 33),
                       CURLOPT_TIMEVALUE => (CURLOPTTYPE_LONG + 34),
                       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_FTPASCII => (CURLOPTTYPE_LONG + 53),
                       -- deprecated
                       CURLOPT_TRANSFERTEXT => (CURLOPTTYPE_LONG + 53),
                       CURLOPT_PUT => (CURLOPTTYPE_LONG + 54),
                       CURLOPT_MUTE => (CURLOPTTYPE_LONG + 55),
                       CURLOPT_AUTOREFERER => (CURLOPTTYPE_LONG + 58),
                       CURLOPT_PROXYPORT => (CURLOPTTYPE_LONG + 59),
                       CURLOPT_POSTFIELDSIZE => (CURLOPTTYPE_LONG + 60),
                       CURLOPT_HTTPPROXYTUNNEL => (CURLOPTTYPE_LONG + 61),
                       CURLOPT_SSL_VERIFYPEER => (CURLOPTTYPE_LONG + 64),
                       CURLOPT_MAXREDIRS => (CURLOPTTYPE_LONG + 68),
                       CURLOPT_MAXCONNECTS => (CURLOPTTYPE_LONG + 71),
                       CURLOPT_CLOSEPOLICY => (CURLOPTTYPE_LONG + 72),
                       CURLOPT_FRESH_CONNECT => (CURLOPTTYPE_LONG + 74),
                       CURLOPT_FORBID_REUSE => (CURLOPTTYPE_LONG + 75),
                       CURLOPT_CONNECTTIMEOUT => (CURLOPTTYPE_LONG + 78),
                       CURLOPT_HTTPGET => (CURLOPTTYPE_LONG + 80),
                       CURLOPT_SSL_VERIFYHOST => (CURLOPTTYPE_LONG + 81),
                       CURLOPT_HTTP_VERSION => (CURLOPTTYPE_LONG + 84),
                       CURLOPT_FTP_USE_EPSV => (CURLOPTTYPE_LONG + 85),
                       CURLOPT_SSLENGINE_DEFAULT => (CURLOPTTYPE_LONG + 90),
                       CURLOPT_DNS_USE_GLOBAL_CACHE =>(CURLOPTTYPE_LONG + 91),
                       CURLOPT_DNS_CACHE_TIMEOUT => (CURLOPTTYPE_LONG + 92),
                       CURLOPT_COOKIESESSION => (CURLOPTTYPE_LONG + 96),
                       CURLOPT_BUFFERSIZE => (CURLOPTTYPE_LONG + 98),
                       CURLOPT_NOSIGNAL => (CURLOPTTYPE_LONG + 99),
                       CURLOPT_PROXYTYPE => (CURLOPTTYPE_LONG + 101),
                       CURLOPT_UNRESTRICTED_AUTH => (CURLOPTTYPE_LONG + 105),
                       CURLOPT_FTP_USE_EPRT => (CURLOPTTYPE_LONG + 106),
                       CURLOPT_FILE => (CURLOPTTYPE_OBJECTPOINT + 1),
                       CURLOPT_URL => (CURLOPTTYPE_OBJECTPOINT + 2),
                       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_POSTFIELDS => (CURLOPTTYPE_OBJECTPOINT + 15),
                       CURLOPT_REFERER => (CURLOPTTYPE_OBJECTPOINT + 16),
                       CURLOPT_FTPPORT => (CURLOPTTYPE_OBJECTPOINT + 17),
                       CURLOPT_USERAGENT => (CURLOPTTYPE_OBJECTPOINT + 18),
                       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),
                       -- use SSLKEYPASSWD
                       CURLOPT_SSLKEYPASSWD => (CURLOPTTYPE_OBJECTPOINT + 26),
                       CURLOPT_QUOTE => (CURLOPTTYPE_OBJECTPOINT + 28),
                       CURLOPT_WRITEHEADER => (CURLOPTTYPE_OBJECTPOINT + 29),
                       CURLOPT_COOKIEFILE => (CURLOPTTYPE_OBJECTPOINT + 31),
                       CURLOPT_HTTPREQUEST => (CURLOPTTYPE_OBJECTPOINT + 35),
                       CURLOPT_CUSTOMREQUEST =>(CURLOPTTYPE_OBJECTPOINT + 36),
                       CURLOPT_STDERR => (CURLOPTTYPE_OBJECTPOINT + 37),
                       CURLOPT_POSTQUOTE => (CURLOPTTYPE_OBJECTPOINT + 39),
                       CURLOPT_WRITEINFO => (CURLOPTTYPE_OBJECTPOINT + 40),
                       CURLOPT_PROGRESSDATA => (CURLOPTTYPE_OBJECTPOINT + 57),
                       CURLOPT_INTERFACE => (CURLOPTTYPE_OBJECTPOINT + 62),
                       CURLOPT_KRB4LEVEL => (CURLOPTTYPE_OBJECTPOINT + 63),
                       CURLOPT_CAINFO => (CURLOPTTYPE_OBJECTPOINT + 65),
                       CURLOPT_PASSWDDATA => (CURLOPTTYPE_OBJECTPOINT + 67),
                       CURLOPT_FILETIME => (CURLOPTTYPE_OBJECTPOINT + 69),
                       CURLOPT_TELNETOPTIONS =>(CURLOPTTYPE_OBJECTPOINT + 70),
                       CURLOPT_RANDOM_FILE => (CURLOPTTYPE_OBJECTPOINT + 76),
                       CURLOPT_EGDSOCKET => (CURLOPTTYPE_OBJECTPOINT + 77),
                       CURLOPT_COOKIEJAR => (CURLOPTTYPE_OBJECTPOINT + 82),
                       CURLOPT_SSL_CIPHER_LIST=>(CURLOPTTYPE_OBJECTPOINT +83),
                       CURLOPT_SSLCERTTYPE => (CURLOPTTYPE_OBJECTPOINT + 86),
                       CURLOPT_SSLKEY => (CURLOPTTYPE_OBJECTPOINT + 87),
                       CURLOPT_SSLKEYTYPE => (CURLOPTTYPE_OBJECTPOINT + 88),
                       CURLOPT_SSLENGINE => (CURLOPTTYPE_OBJECTPOINT + 89),
                       CURLOPT_PREQUOTE => (CURLOPTTYPE_OBJECTPOINT + 93),
                       CURLOPT_DEBUGDATA => (CURLOPTTYPE_OBJECTPOINT + 95),
                       CURLOPT_CAPATH => (CURLOPTTYPE_OBJECTPOINT + 97),
                       CURLOPT_SHARE => (CURLOPTTYPE_OBJECTPOINT + 100),
                       CURLOPT_ENCODING => (CURLOPTTYPE_OBJECTPOINT + 102),
                       CURLOPT_PRIVATE => (CURLOPTTYPE_OBJECTPOINT + 103),
                       CURLOPT_HTTP200ALIASES=>(CURLOPTTYPE_OBJECTPOINT +104),
                       CURLOPT_WRITEFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT +11),
                       CURLOPT_READFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT + 12),
                       CURLOPT_PROGRESSFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT+56),
                       CURLOPT_PASSWDFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT + 66),
                       CURLOPT_CLOSEFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT + 73),
                       CURLOPT_HEADERFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT + 79),
                       CURLOPT_DEBUGFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT + 94),
                       CURLOPT_LASTENTRY => (CURLOPTTYPE_FUNCTIONPOINT + 95)
                       --(CURLOPT_LASTENTRY); -- what value?
                       -- presumably FUNCTIONPOINT + 95
                       );
   pragma Convention(C,Curloption);

   CURLOPT_WRITEDATA  : constant Curloption := CURLOPT_FILE;
   CURLOPT_READDATA   : constant Curloption := CURLOPT_INFILE;
   CURLOPT_HEADERDATA : constant Curloption := CURLOPT_WRITEHEADER;

   type Curl_Http_Version is (CURL_HTTP_VERSION_NONE,
                              CURL_HTTP_VERSION_1_0,
                              CURL_HTTP_VERSION_1_1,
                              CURL_HTTP_VERSION_LAST);
   pragma Convention(C,Curl_Http_Version);

   type Curl_Netrc_Option is (CURL_NETRC_IGNORED,
                              CURL_NETRC_OPTIONAL,
                              CURL_NETRC_REQUIRED,
                              CURL_NETRC_LAST);
   pragma Convention(C,Curl_Netrc_Option);

   type Curl_Ssl_Version is (CURL_SSLVERSION_DEFAULT,
                             CURL_SSLVERSION_TLSv1,
                             CURL_SSLVERSION_SSLv2,
                             CURL_SSLVERSION_SSLv3,
                             CURL_SSLVERSION_LAST);
   pragma Convention(C,Curl_Ssl_Version);

   type Curl_Timecond is (CURL_TIMECOND_NONE,
                          CURL_TIMECOND_IFMODSINCE,
                          CURL_TIMECOND_IFUNMODSINCE,
                          CURL_TIMECOND_LASTMOD,
                          CURL_TIMECOND_LAST);
   pragma Convention(C,Curl_Timecond);

   type CURLformoption is (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);
   pragma Convention(C,Curlformoption);

   type Curl_Forms is record
      Option : CURLformoption;
      Value  : Chars_Ptr;
   end record;

   type CURLFORMcode is (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_LAST);
   pragma Convention(C,Curlformcode);


   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : Chars_Ptr)
                         return CURLFORMcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : Long;
                          E1 : Curlformoption)
                         return CURLFORMcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : Chars_Ptr;
                          C2 : Curlformoption;
                          D2 : Chars_Ptr;
                          E1 : Curlformoption)
                         return CURLFORMcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : Chars_Ptr;
                          C2 : Curlformoption;
                          D2 : Long;
                          E1 : Curlformoption)
                         return CURLFORMcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : Long;
                          C2 : Curlformoption;
                          D2 : Long;
                          E1 : Curlformoption)
                         return CURLFORMcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : Long;
                          C2 : Curlformoption;
                          D2 : Chars_Ptr;
                          E1 : Curlformoption)
                         return CURLFORMcode;

   procedure Curl_Formfree(Form : Curl_Httppost_P);

   function Curl_Getenv(Variable : Chars_Ptr) return Chars_Ptr;

   function Curl_Version return Chars_Ptr;

   function Curl_Escape(String : Chars_Ptr;
                        Length : Int) return Chars_Ptr;

   function Curl_Unescape(String : Chars_Ptr;
                          Length : Int) return Chars_Ptr;

   procedure Curl_Free(P : System.Address);

   function Curl_Global_Init(Flags : Long) return CURLcode;

   procedure Curl_Global_Cleanup;


   function Curl_Slist_Append (A1 : Curl_Slist_P;
                               A2 : Chars_Ptr)
                              return Curl_Slist_P;

   procedure Curl_Slist_Free_All(A1 : Curl_Slist_P);

   function Curl_Getdate(P   : Chars_Ptr;
                         Now : Time_T_Pointer)
                        return Time_T;

   CURLINFO_STRING   : constant := 16#100000#;
   CURLINFO_LONG     : constant := 16#200000#;
   CURLINFO_DOUBLE   : constant := 16#300000#;
   CURLINFO_MASK     : constant := 16#0fffff#;
   CURLINFO_TYPEMASK : constant := 16#f00000#;

   type CURLINFO is (CURLINFO_NONE             ,
                     CURLINFO_EFFECTIVE_URL    ,
                     CURLINFO_CONTENT_TYPE ,
                     CURLINFO_PRIVATE ,
                     CURLINFO_HTTP_CODE        ,
                     CURLINFO_HEADER_SIZE      ,
                     CURLINFO_REQUEST_SIZE     ,
                     CURLINFO_SSL_VERIFYRESULT ,
                     CURLINFO_FILETIME         ,
                     CURLINFO_REDIRECT_COUNT  ,
                     CURLINFO_TOTAL_TIME       ,
                     CURLINFO_NAMELOOKUP_TIME  ,
                     CURLINFO_CONNECT_TIME     ,
                     CURLINFO_PRETRANSFER_TIME ,
                     CURLINFO_SIZE_UPLOAD      ,
                     CURLINFO_SIZE_DOWNLOAD    ,
                     CURLINFO_SPEED_DOWNLOAD   ,
                     CURLINFO_SPEED_UPLOAD     ,
                     CURLINFO_CONTENT_LENGTH_DOWNLOAD   ,
                     CURLINFO_CONTENT_LENGTH_UPLOAD     ,
                     CURLINFO_STARTTRANSFER_TIME ,
                     CURLINFO_REDIRECT_TIME   ,
                     CURLINFO_LASTONE);
   for CURLINFO use (CURLINFO_NONE             => 0,
                     CURLINFO_EFFECTIVE_URL    => CURLINFO_STRING + 1,
                     CURLINFO_CONTENT_TYPE => CURLINFO_STRING + 18,
                     CURLINFO_PRIVATE => CURLINFO_STRING + 21,
                     CURLINFO_HTTP_CODE        => CURLINFO_LONG   + 2,
                     CURLINFO_HEADER_SIZE      => CURLINFO_LONG   + 11,
                     CURLINFO_REQUEST_SIZE     => CURLINFO_LONG   + 12,
                     CURLINFO_SSL_VERIFYRESULT => CURLINFO_LONG   + 13,
                     CURLINFO_FILETIME         => CURLINFO_LONG   + 14,
                     CURLINFO_REDIRECT_COUNT  => CURLINFO_LONG + 20,
                     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_CONTENT_LENGTH_DOWNLOAD   => CURLINFO_DOUBLE + 15,
                     CURLINFO_CONTENT_LENGTH_UPLOAD     => CURLINFO_DOUBLE + 16,
                     CURLINFO_STARTTRANSFER_TIME => CURLINFO_DOUBLE + 17,
                     CURLINFO_REDIRECT_TIME   => CURLINFO_DOUBLE + 19,
                     CURLINFO_LASTONE          => CURLINFO_DOUBLE + 22);
   pragma Convention(C,Curlinfo);

   type Curl_Closepolicy is (CURLCLOSEPOLICY_NONE,
                             CURLCLOSEPOLICY_OLDEST,
                             CURLCLOSEPOLICY_LEAST_RECENTLY_USED,
                             CURLCLOSEPOLICY_LEAST_TRAFFIC,
                             CURLCLOSEPOLICY_SLOWEST,
                             CURLCLOSEPOLICY_CALLBACK,
                             CURLCLOSEPOLICY_LAST);
   pragma Convention(C,Curl_Closepolicy);

   CURL_GLOBAL_SSL     : constant := 1;
   CURL_GLOBAL_WIN32   : constant := 2;
   CURL_GLOBAL_ALL     : constant := CURL_GLOBAL_SSL + CURL_GLOBAL_WIN32;
   CURL_GLOBAL_NOTHING : constant := 0;
   CURL_GLOBAL_DEFAULT : constant := CURL_GLOBAL_ALL;

   type Curl_Lock_Data is (CURL_LOCK_DATA_NONE,
                           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);
   pragma Convention(C,Curl_Lock_Data);

   type curl_lock_access is (CURL_LOCK_ACCESS_NONE,
                             CURL_LOCK_ACCESS_SHARED,
                             CURL_LOCK_ACCESS_SINGLE,
                             CURL_LOCK_ACCESS_LAST);
   pragma Convention(C,Curl_Lock_Access);

   type CURLversion is (CURLVERSION_FIRST,
                        CURLVERSION_LAST);
   pragma Convention(C,Curlversion);

   CURLVERSION_NOW : constant CURLversion := CURLVERSION_FIRST;

   type Curl_Version_Info_Data is record
      Age : CURLversion;
      Version : Chars_Ptr;
      Version_Num : Unsigned;
      Host : Chars_Ptr;
      Features : Int;
      Ssl_Version : Chars_Ptr;
      Ssl_Version_Num : Long;
      Libz_Version : Chars_Ptr;
      Protocols : Chars_ptr;
   end record;
   pragma Convention(C,Curl_Version_Info_Data);

   type Curl_Version_Info_Data_P is access all Curl_Version_Info_Data;

   CURL_VERSION_IPV6         : constant := 1;
   CURL_VERSION_KERBEROS4    : constant := 2;
   CURL_VERSION_SSL          : constant := 4;
   CURL_VERSION_LIBZ         : constant := 8;
   CURL_VERSION_NTLM         : constant := 16;
   CURL_VERSION_GSSNEGOTIATE : constant := 32;
   CURL_VERSION_DEBUG        : constant := 64;

   function Curl_Version_Info(A1 : CURLversion) return Curl_Version_Info_Data_P;

private
   pragma Import(C,Curl_Formadd,"curl_formadd");
   pragma Import(C,Curl_Formfree,"curl_formfree");
   pragma Import(C,Curl_Getenv,"curl_getenv");
   pragma Import(C,Curl_Version,"curl_version");
   pragma Import(C,Curl_Escape,"curl_escape");
   pragma Import(C,Curl_Unescape,"curl_unescape");
   pragma Import(C,Curl_Free,"curl_free");
   pragma Import(C,Curl_Global_Init,"curl_global_init");
   pragma Import(C,Curl_Global_Cleanup,"curl_global_cleanup");
   pragma Import(C,Curl_Slist_Append,"curl_slist_append");
   pragma Import(C,Curl_Slist_Free_All,"curl_slist_free_all");
   pragma Import(C,Curl_Getdate,"curl_getdate");
   pragma Import(C,Curl_Version_Info,"curl_version_info");
end Adacurl;