{-# LINE 1 "Network/CURL000/Types.hsc" #-}
-------------------------------------------------------------------------------
{-# LINE 2 "Network/CURL000/Types.hsc" #-}
-- |
-- Module      :  Network.CURL000.Types
-- Copyright   :  Copyright (c) 2012-2015 Krzysztof Kardzis
-- License     :  ISC License (MIT/BSD-style, see LICENSE file for details)
--
-- Maintainer  :  Krzysztof Kardzis <kkardzis@gmail.com>
-- Stability   :  experimental
-- Portability :  non-portable
--
-------------------------------------------------------------------------------
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE EmptyDataDecls     #-}
{-# LANGUAGE GADTs              #-}

module Network.CURL000.Types where

import qualified Network.CURL000.LibCC as C

import Control.Exception  (Exception)
import Control.Concurrent (MVar)

import Data.Time.Clock (UTCTime)
import Data.ByteString (ByteString)
import Data.Typeable   (Typeable, typeOf)
import Data.Maybe      (mapMaybe)
import Data.List       (foldl')
import Data.Bits       ((.|.), (.&.))
import Data.Int        (Int64)
import Data.Unique     (Unique, hashUnique)
import Data.IORef      (IORef)

import Foreign.C.Types
import Foreign.Ptr


{-# LINE 38 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
class ENUM a where
  toENUM :: a -> CULong
  enumlist :: [a]

instance ENUM a => ENUM [a] where
  toENUM = foldl' (.|.) 0 . map toENUM
  enumlist = []

toCInt :: ENUM a => a -> CInt
toCInt = fromIntegral . toENUM

toCLong :: ENUM a => a -> CLong
toCLong = fromIntegral . toENUM

fromCIntMask :: ENUM a => CInt -> [a]
fromCIntMask mask =
  let checkBit x = if ((mask .&. (toCInt x)) == 0) then Nothing else Just x
  in  mapMaybe checkBit enumlist

fromCLongMask :: ENUM a => CLong -> [a]
fromCLongMask mask =
  let checkBit x = if ((mask .&. (toCLong x)) == 0) then Nothing else Just x
  in  mapMaybe checkBit enumlist

fromCInt :: (ENUM a, Typeable a) => CInt -> a
fromCInt cval =
  let enums = map (\enum -> (toCInt enum, enum)) enumlist
      enumE = error $ concat ["<curlhs> unknown constant (", v, ") -> ", t]
      (v,t) = (show cval, show $ typeOf $ snd $ head enums)
  in  maybe enumE id $ lookup cval enums



{-
-------------------------------------------------------------------------------
deriving instance Typeable CURLMcode
deriving instance Show CURLMcode
instance Exception CURLMcode

#{ENUM CURLMcode           \
, CURLM_CALL_MULTI_PERFORM \
, CURLM_BAD_HANDLE         \
, CURLM_BAD_EASY_HANDLE    \
, CURLM_OUT_OF_MEMORY      \
, CURLM_INTERNAL_ERROR     \
, CURLM_BAD_SOCKET         \
, CURLM_UNKNOWN_OPTION     }
-}


-------------------------------------------------------------------------------
deriving instance Show CURLfeature

data CURLfeature
  = CURL_VERSION_IPV6 
  | CURL_VERSION_KERBEROS4 
  | CURL_VERSION_SSL 
  | CURL_VERSION_LIBZ 
  | CURL_VERSION_NTLM 
  | CURL_VERSION_GSSNEGOTIATE 
  | CURL_VERSION_DEBUG 
  | CURL_VERSION_CURLDEBUG 
  | CURL_VERSION_ASYNCHDNS 
  | CURL_VERSION_SPNEGO 
  | CURL_VERSION_LARGEFILE 
  | CURL_VERSION_IDN 
  | CURL_VERSION_SSPI 
  | CURL_VERSION_CONV 
  | CURL_VERSION_TLSAUTH_SRP 
  | CURL_VERSION_NTLM_WB

instance ENUM CURLfeature where
  enumlist = [ CURL_VERSION_IPV6 , CURL_VERSION_KERBEROS4 , CURL_VERSION_SSL , CURL_VERSION_LIBZ , CURL_VERSION_NTLM , CURL_VERSION_GSSNEGOTIATE , CURL_VERSION_DEBUG , CURL_VERSION_CURLDEBUG , CURL_VERSION_ASYNCHDNS , CURL_VERSION_SPNEGO , CURL_VERSION_LARGEFILE , CURL_VERSION_IDN , CURL_VERSION_SSPI , CURL_VERSION_CONV , CURL_VERSION_TLSAUTH_SRP , CURL_VERSION_NTLM_WB ]
  toENUM x = case x of
    CURL_VERSION_IPV6  -> 1
    CURL_VERSION_KERBEROS4  -> 2
    CURL_VERSION_SSL  -> 4
    CURL_VERSION_LIBZ  -> 8
    CURL_VERSION_NTLM  -> 16
    CURL_VERSION_GSSNEGOTIATE  -> 32
    CURL_VERSION_DEBUG  -> 64
    CURL_VERSION_CURLDEBUG  -> 8192
    CURL_VERSION_ASYNCHDNS  -> 128
    CURL_VERSION_SPNEGO  -> 256
    CURL_VERSION_LARGEFILE  -> 512
    CURL_VERSION_IDN  -> 1024
    CURL_VERSION_SSPI  -> 2048
    CURL_VERSION_CONV  -> 4096
    CURL_VERSION_TLSAUTH_SRP  -> 16384
    CURL_VERSION_NTLM_WB -> 32768

{-# LINE 111 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLproto
  = CURLPROTO_ALL 
  | CURLPROTO_HTTP 
  | CURLPROTO_HTTPS 
  | CURLPROTO_FTP 
  | CURLPROTO_FTPS 
  | CURLPROTO_SCP 
  | CURLPROTO_SFTP 
  | CURLPROTO_TELNET 
  | CURLPROTO_LDAP 
  | CURLPROTO_LDAPS 
  | CURLPROTO_DICT 
  | CURLPROTO_FILE 
  | CURLPROTO_TFTP 
  | CURLPROTO_IMAP 
  | CURLPROTO_IMAPS 
  | CURLPROTO_POP3 
  | CURLPROTO_POP3S 
  | CURLPROTO_SMTP 
  | CURLPROTO_SMTPS 
  | CURLPROTO_RTSP 
  | CURLPROTO_RTMP 
  | CURLPROTO_RTMPT 
  | CURLPROTO_RTMPE 
  | CURLPROTO_RTMPTE 
  | CURLPROTO_RTMPS 
  | CURLPROTO_RTMPTS 
  | CURLPROTO_GOPHER

instance ENUM CURLproto where
  enumlist = [ CURLPROTO_ALL , CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAPS , CURLPROTO_DICT , CURLPROTO_FILE , CURLPROTO_TFTP , CURLPROTO_IMAP , CURLPROTO_IMAPS , CURLPROTO_POP3 , CURLPROTO_POP3S , CURLPROTO_SMTP , CURLPROTO_SMTPS , CURLPROTO_RTSP , CURLPROTO_RTMP , CURLPROTO_RTMPT , CURLPROTO_RTMPE , CURLPROTO_RTMPTE , CURLPROTO_RTMPS , CURLPROTO_RTMPTS , CURLPROTO_GOPHER ]
  toENUM x = case x of
    CURLPROTO_ALL  -> 18446744073709551615
    CURLPROTO_HTTP  -> 1
    CURLPROTO_HTTPS  -> 2
    CURLPROTO_FTP  -> 4
    CURLPROTO_FTPS  -> 8
    CURLPROTO_SCP  -> 16
    CURLPROTO_SFTP  -> 32
    CURLPROTO_TELNET  -> 64
    CURLPROTO_LDAP  -> 128
    CURLPROTO_LDAPS  -> 256
    CURLPROTO_DICT  -> 512
    CURLPROTO_FILE  -> 1024
    CURLPROTO_TFTP  -> 2048
    CURLPROTO_IMAP  -> 4096
    CURLPROTO_IMAPS  -> 8192
    CURLPROTO_POP3  -> 16384
    CURLPROTO_POP3S  -> 32768
    CURLPROTO_SMTP  -> 65536
    CURLPROTO_SMTPS  -> 131072
    CURLPROTO_RTSP  -> 262144
    CURLPROTO_RTMP  -> 524288
    CURLPROTO_RTMPT  -> 1048576
    CURLPROTO_RTMPE  -> 2097152
    CURLPROTO_RTMPTE  -> 4194304
    CURLPROTO_RTMPS  -> 8388608
    CURLPROTO_RTMPTS  -> 16777216
    CURLPROTO_GOPHER -> 33554432

{-# LINE 142 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLproxy
  = CURLPROXY_HTTP 
  | CURLPROXY_HTTP_1_0 
  | CURLPROXY_SOCKS4 
  | CURLPROXY_SOCKS5 
  | CURLPROXY_SOCKS4A 
  | CURLPROXY_SOCKS5_HOSTNAME

instance ENUM CURLproxy where
  enumlist = [ CURLPROXY_HTTP , CURLPROXY_HTTP_1_0 , CURLPROXY_SOCKS4 , CURLPROXY_SOCKS5 , CURLPROXY_SOCKS4A , CURLPROXY_SOCKS5_HOSTNAME ]
  toENUM x = case x of
    CURLPROXY_HTTP  -> 0
    CURLPROXY_HTTP_1_0  -> 1
    CURLPROXY_SOCKS4  -> 4
    CURLPROXY_SOCKS5  -> 5
    CURLPROXY_SOCKS4A  -> 6
    CURLPROXY_SOCKS5_HOSTNAME -> 7

{-# LINE 152 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLnetrc
  = CURL_NETRC_IGNORED 
  | CURL_NETRC_OPTIONAL 
  | CURL_NETRC_REQUIRED

instance ENUM CURLnetrc where
  enumlist = [ CURL_NETRC_IGNORED , CURL_NETRC_OPTIONAL , CURL_NETRC_REQUIRED ]
  toENUM x = case x of
    CURL_NETRC_IGNORED  -> 0
    CURL_NETRC_OPTIONAL  -> 1
    CURL_NETRC_REQUIRED -> 2

{-# LINE 159 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLauth
  = CURLAUTH_BASIC 
  | CURLAUTH_DIGEST 
  | CURLAUTH_DIGEST_IE 
  | CURLAUTH_GSSNEGOTIATE 
  | CURLAUTH_NTLM 
  | CURLAUTH_NTLM_WB 
  | CURLAUTH_ONLY 
  | CURLAUTH_ANY 
  | CURLAUTH_ANYSAFE

instance ENUM CURLauth where
  enumlist = [ CURLAUTH_BASIC , CURLAUTH_DIGEST , CURLAUTH_DIGEST_IE , CURLAUTH_GSSNEGOTIATE , CURLAUTH_NTLM , CURLAUTH_NTLM_WB , CURLAUTH_ONLY , CURLAUTH_ANY , CURLAUTH_ANYSAFE ]
  toENUM x = case x of
    CURLAUTH_BASIC  -> 1
    CURLAUTH_DIGEST  -> 2
    CURLAUTH_DIGEST_IE  -> 16
    CURLAUTH_GSSNEGOTIATE  -> 4
    CURLAUTH_NTLM  -> 8
    CURLAUTH_NTLM_WB  -> 32
    CURLAUTH_ONLY  -> 2147483648
    CURLAUTH_ANY  -> 18446744073709551599
    CURLAUTH_ANYSAFE -> 18446744073709551598

{-# LINE 172 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLtlsauth
  = CURL_TLSAUTH_SRP

instance ENUM CURLtlsauth where
  enumlist = [ CURL_TLSAUTH_SRP ]
  toENUM x = case x of
    CURL_TLSAUTH_SRP -> 1

{-# LINE 177 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLredir
  = CURL_REDIR_GET_ALL 
  | CURL_REDIR_POST_301 
  | CURL_REDIR_POST_302 
  | CURL_REDIR_POST_303 
  | CURL_REDIR_POST_ALL

instance ENUM CURLredir where
  enumlist = [ CURL_REDIR_GET_ALL , CURL_REDIR_POST_301 , CURL_REDIR_POST_302 , CURL_REDIR_POST_303 , CURL_REDIR_POST_ALL ]
  toENUM x = case x of
    CURL_REDIR_GET_ALL  -> 0
    CURL_REDIR_POST_301  -> 1
    CURL_REDIR_POST_302  -> 2
    CURL_REDIR_POST_303  -> 4
    CURL_REDIR_POST_ALL -> 7

{-# LINE 186 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLhttpver
  = CURL_HTTP_VERSION_NONE 
  | CURL_HTTP_VERSION_1_0 
  | CURL_HTTP_VERSION_1_1

instance ENUM CURLhttpver where
  enumlist = [ CURL_HTTP_VERSION_NONE , CURL_HTTP_VERSION_1_0 , CURL_HTTP_VERSION_1_1 ]
  toENUM x = case x of
    CURL_HTTP_VERSION_NONE  -> 0
    CURL_HTTP_VERSION_1_0  -> 1
    CURL_HTTP_VERSION_1_1 -> 2

{-# LINE 193 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLftpcreate
  = CURLFTP_CREATE_DIR_NONE 
  | CURLFTP_CREATE_DIR 
  | CURLFTP_CREATE_DIR_RETRY

instance ENUM CURLftpcreate where
  enumlist = [ CURLFTP_CREATE_DIR_NONE , CURLFTP_CREATE_DIR , CURLFTP_CREATE_DIR_RETRY ]
  toENUM x = case x of
    CURLFTP_CREATE_DIR_NONE  -> 0
    CURLFTP_CREATE_DIR  -> 1
    CURLFTP_CREATE_DIR_RETRY -> 2

{-# LINE 200 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLftpauth
  = CURLFTPAUTH_DEFAULT 
  | CURLFTPAUTH_SSL 
  | CURLFTPAUTH_TLS

instance ENUM CURLftpauth where
  enumlist = [ CURLFTPAUTH_DEFAULT , CURLFTPAUTH_SSL , CURLFTPAUTH_TLS ]
  toENUM x = case x of
    CURLFTPAUTH_DEFAULT  -> 0
    CURLFTPAUTH_SSL  -> 1
    CURLFTPAUTH_TLS -> 2

{-# LINE 207 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLftpssl
  = CURLFTPSSL_CCC_NONE 
  | CURLFTPSSL_CCC_PASSIVE 
  | CURLFTPSSL_CCC_ACTIVE

instance ENUM CURLftpssl where
  enumlist = [ CURLFTPSSL_CCC_NONE , CURLFTPSSL_CCC_PASSIVE , CURLFTPSSL_CCC_ACTIVE ]
  toENUM x = case x of
    CURLFTPSSL_CCC_NONE  -> 0
    CURLFTPSSL_CCC_PASSIVE  -> 1
    CURLFTPSSL_CCC_ACTIVE -> 2

{-# LINE 214 "Network/CURL000/Types.hsc" #-}
 

-------------------------------------------------------------------------------
data CURLftpmethod
  = CURLFTPMETHOD_DEFAULT 
  | CURLFTPMETHOD_MULTICWD 
  | CURLFTPMETHOD_NOCWD 
  | CURLFTPMETHOD_SINGLECWD

instance ENUM CURLftpmethod where
  enumlist = [ CURLFTPMETHOD_DEFAULT , CURLFTPMETHOD_MULTICWD , CURLFTPMETHOD_NOCWD , CURLFTPMETHOD_SINGLECWD ]
  toENUM x = case x of
    CURLFTPMETHOD_DEFAULT  -> 0
    CURLFTPMETHOD_MULTICWD  -> 1
    CURLFTPMETHOD_NOCWD  -> 2
    CURLFTPMETHOD_SINGLECWD -> 3

{-# LINE 222 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLrtspreq
  = CURL_RTSPREQ_OPTIONS 
  | CURL_RTSPREQ_DESCRIBE 
  | CURL_RTSPREQ_ANNOUNCE 
  | CURL_RTSPREQ_SETUP 
  | CURL_RTSPREQ_PLAY 
  | CURL_RTSPREQ_PAUSE 
  | CURL_RTSPREQ_TEARDOWN 
  | CURL_RTSPREQ_GET_PARAMETER 
  | CURL_RTSPREQ_SET_PARAMETER 
  | CURL_RTSPREQ_RECORD 
  | CURL_RTSPREQ_RECEIVE

instance ENUM CURLrtspreq where
  enumlist = [ CURL_RTSPREQ_OPTIONS , CURL_RTSPREQ_DESCRIBE , CURL_RTSPREQ_ANNOUNCE , CURL_RTSPREQ_SETUP , CURL_RTSPREQ_PLAY , CURL_RTSPREQ_PAUSE , CURL_RTSPREQ_TEARDOWN , CURL_RTSPREQ_GET_PARAMETER , CURL_RTSPREQ_SET_PARAMETER , CURL_RTSPREQ_RECORD , CURL_RTSPREQ_RECEIVE ]
  toENUM x = case x of
    CURL_RTSPREQ_OPTIONS  -> 1
    CURL_RTSPREQ_DESCRIBE  -> 2
    CURL_RTSPREQ_ANNOUNCE  -> 3
    CURL_RTSPREQ_SETUP  -> 4
    CURL_RTSPREQ_PLAY  -> 5
    CURL_RTSPREQ_PAUSE  -> 6
    CURL_RTSPREQ_TEARDOWN  -> 7
    CURL_RTSPREQ_GET_PARAMETER  -> 8
    CURL_RTSPREQ_SET_PARAMETER  -> 9
    CURL_RTSPREQ_RECORD  -> 10
    CURL_RTSPREQ_RECEIVE -> 11

{-# LINE 237 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLtimecond
  = CURL_TIMECOND_NONE 
  | CURL_TIMECOND_IFMODSINCE 
  | CURL_TIMECOND_IFUNMODSINCE 
  | CURL_TIMECOND_LASTMOD

instance ENUM CURLtimecond where
  enumlist = [ CURL_TIMECOND_NONE , CURL_TIMECOND_IFMODSINCE , CURL_TIMECOND_IFUNMODSINCE , CURL_TIMECOND_LASTMOD ]
  toENUM x = case x of
    CURL_TIMECOND_NONE  -> 0
    CURL_TIMECOND_IFMODSINCE  -> 1
    CURL_TIMECOND_IFUNMODSINCE  -> 2
    CURL_TIMECOND_LASTMOD -> 3

{-# LINE 245 "Network/CURL000/Types.hsc" #-}


{-
-------------------------------------------------------------------------------
#{ENUM CURLclosepol                   \
, CURLCLOSEPOLICY_NONE                \
, CURLCLOSEPOLICY_OLDEST              \
, CURLCLOSEPOLICY_LEAST_RECENTLY_USED \
, CURLCLOSEPOLICY_LEAST_TRAFFIC       \
, CURLCLOSEPOLICY_SLOWEST             \
, CURLCLOSEPOLICY_CALLBACK            }
-}


-------------------------------------------------------------------------------
data CURLipresolve
  = CURL_IPRESOLVE_WHATEVER 
  | CURL_IPRESOLVE_V4 
  | CURL_IPRESOLVE_V6

instance ENUM CURLipresolve where
  enumlist = [ CURL_IPRESOLVE_WHATEVER , CURL_IPRESOLVE_V4 , CURL_IPRESOLVE_V6 ]
  toENUM x = case x of
    CURL_IPRESOLVE_WHATEVER  -> 0
    CURL_IPRESOLVE_V4  -> 1
    CURL_IPRESOLVE_V6 -> 2

{-# LINE 264 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLusessl
  = CURLUSESSL_NONE 
  | CURLUSESSL_TRY 
  | CURLUSESSL_CONTROL 
  | CURLUSESSL_ALL

instance ENUM CURLusessl where
  enumlist = [ CURLUSESSL_NONE , CURLUSESSL_TRY , CURLUSESSL_CONTROL , CURLUSESSL_ALL ]
  toENUM x = case x of
    CURLUSESSL_NONE  -> 0
    CURLUSESSL_TRY  -> 1
    CURLUSESSL_CONTROL  -> 2
    CURLUSESSL_ALL -> 3

{-# LINE 272 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLsslver
  = CURL_SSLVERSION_DEFAULT 
  | CURL_SSLVERSION_TLSv1 
  | CURL_SSLVERSION_SSLv2 
  | CURL_SSLVERSION_SSLv3

instance ENUM CURLsslver where
  enumlist = [ CURL_SSLVERSION_DEFAULT , CURL_SSLVERSION_TLSv1 , CURL_SSLVERSION_SSLv2 , CURL_SSLVERSION_SSLv3 ]
  toENUM x = case x of
    CURL_SSLVERSION_DEFAULT  -> 0
    CURL_SSLVERSION_TLSv1  -> 1
    CURL_SSLVERSION_SSLv2  -> 2
    CURL_SSLVERSION_SSLv3 -> 3

{-# LINE 280 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLsslopt
  = CURLSSLOPT_ALLOW_BEAST

instance ENUM CURLsslopt where
  enumlist = [ CURLSSLOPT_ALLOW_BEAST ]
  toENUM x = case x of
    CURLSSLOPT_ALLOW_BEAST -> 1

{-# LINE 285 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLgssapi
  = CURLGSSAPI_DELEGATION_NONE 
  | CURLGSSAPI_DELEGATION_POLICY_FLAG 
  | CURLGSSAPI_DELEGATION_FLAG

instance ENUM CURLgssapi where
  enumlist = [ CURLGSSAPI_DELEGATION_NONE , CURLGSSAPI_DELEGATION_POLICY_FLAG , CURLGSSAPI_DELEGATION_FLAG ]
  toENUM x = case x of
    CURLGSSAPI_DELEGATION_NONE  -> 0
    CURLGSSAPI_DELEGATION_POLICY_FLAG  -> 1
    CURLGSSAPI_DELEGATION_FLAG -> 2

{-# LINE 292 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLsshauth
  = CURLSSH_AUTH_ANY 
  | CURLSSH_AUTH_NONE 
  | CURLSSH_AUTH_PUBLICKEY 
  | CURLSSH_AUTH_PASSWORD 
  | CURLSSH_AUTH_HOST 
  | CURLSSH_AUTH_KEYBOARD 
  | CURLSSH_AUTH_AGENT 
  | CURLSSH_AUTH_DEFAULT

instance ENUM CURLsshauth where
  enumlist = [ CURLSSH_AUTH_ANY , CURLSSH_AUTH_NONE , CURLSSH_AUTH_PUBLICKEY , CURLSSH_AUTH_PASSWORD , CURLSSH_AUTH_HOST , CURLSSH_AUTH_KEYBOARD , CURLSSH_AUTH_AGENT , CURLSSH_AUTH_DEFAULT ]
  toENUM x = case x of
    CURLSSH_AUTH_ANY  -> 18446744073709551615
    CURLSSH_AUTH_NONE  -> 0
    CURLSSH_AUTH_PUBLICKEY  -> 1
    CURLSSH_AUTH_PASSWORD  -> 2
    CURLSSH_AUTH_HOST  -> 4
    CURLSSH_AUTH_KEYBOARD  -> 8
    CURLSSH_AUTH_AGENT  -> 16
    CURLSSH_AUTH_DEFAULT -> 18446744073709551615

{-# LINE 304 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURLSH = CURLSH Unique (MVar ((Ptr C.CURLSH),(FunPtr ()),(FunPtr ())))

instance Show CURLSH where
  showsPrec p (CURLSH u _) = showString "CURLSH#" . showsPrec p (hashUnique u)

instance Eq CURLSH where
  (CURLSH u1 _) == (CURLSH u2 _) = u1 == u2


-------------------------------------------------------------------------------
data CURLSHE = CURLSHE CURLSH String String CURLSHC
  deriving (Eq, Typeable)

instance Exception CURLSHE

instance Show CURLSHE where
  showsPrec p (CURLSHE curlsh func desc code) =
    showsPrec p code . showString " (" . showString func . showString " "
    . showsPrec p curlsh . showString ") " . showString desc


-------------------------------------------------------------------------------
data CURLSHC
  = CURLSHE_FAILED_INIT
  | CURLSHE_BAD_OPTION
  | CURLSHE_IN_USE
  | CURLSHE_INVALID
  | CURLSHE_NOMEM
  | CURLSHE_NOT_BUILT_IN
  | CURLSHE_UNKNOWN_ERROR
  deriving (Show, Eq)

toCURLSHC :: CInt -> CURLSHC
toCURLSHC x = case x of
  1 -> CURLSHE_BAD_OPTION
{-# LINE 342 "Network/CURL000/Types.hsc" #-}
  2 -> CURLSHE_IN_USE
{-# LINE 343 "Network/CURL000/Types.hsc" #-}
  3 -> CURLSHE_INVALID
{-# LINE 344 "Network/CURL000/Types.hsc" #-}
  4 -> CURLSHE_NOMEM
{-# LINE 345 "Network/CURL000/Types.hsc" #-}
  5 -> CURLSHE_NOT_BUILT_IN
{-# LINE 346 "Network/CURL000/Types.hsc" #-}
  _                             -> CURLSHE_UNKNOWN_ERROR


-------------------------------------------------------------------------------
data CURLSHoption
  = CURLSHOPT_SHARE   CURLSHlockdata
  | CURLSHOPT_UNSHARE CURLSHlockdata


-------------------------------------------------------------------------------
data CURLSHlockdata
  = CURL_LOCK_DATA_COOKIE 
  | CURL_LOCK_DATA_DNS 
  | CURL_LOCK_DATA_SSL_SESSION

instance ENUM CURLSHlockdata where
  enumlist = [ CURL_LOCK_DATA_COOKIE , CURL_LOCK_DATA_DNS , CURL_LOCK_DATA_SSL_SESSION ]
  toENUM x = case x of
    CURL_LOCK_DATA_COOKIE  -> 2
    CURL_LOCK_DATA_DNS  -> 3
    CURL_LOCK_DATA_SSL_SESSION -> 4

{-# LINE 360 "Network/CURL000/Types.hsc" #-}


-------------------------------------------------------------------------------
data CURL_version_info = CURL_version_info
  { curl_version_info_version         :: String
  , curl_version_info_version_num     :: Int
  , curl_version_info_host            :: String
  , curl_version_info_features        :: [CURLfeature]
  , curl_version_info_ssl_version     :: String
  , curl_version_info_ssl_version_num :: Int
  , curl_version_info_libz_version    :: String
  , curl_version_info_protocols       :: [String]
  , curl_version_info_ares            :: String
  , curl_version_info_ares_num        :: Int
  , curl_version_info_libidn          :: String
  , curl_version_info_iconv_ver_num   :: Int
  , curl_version_info_libssh_version  :: String
  } deriving (Show)


-------------------------------------------------------------------------------
data CURLinfo a where
  CURLINFO_EFFECTIVE_URL           :: CURLinfo String     -- Ptr CChar
  CURLINFO_RESPONSE_CODE           :: CURLinfo CLong      -- CLong
  CURLINFO_HTTP_CONNECTCODE        :: CURLinfo CLong      -- CLong
  CURLINFO_FILETIME                :: CURLinfo (Maybe UTCTime) -- CLong
  CURLINFO_TOTAL_TIME              :: CURLinfo Double     -- CDouble
  CURLINFO_NAMELOOKUP_TIME         :: CURLinfo Double     -- CDouble
  CURLINFO_CONNECT_TIME            :: CURLinfo Double     -- CDouble
  CURLINFO_APPCONNECT_TIME         :: CURLinfo Double     -- CDouble
  CURLINFO_PRETRANSFER_TIME        :: CURLinfo Double     -- CDouble
  CURLINFO_STARTTRANSFER_TIME      :: CURLinfo Double     -- CDouble
  CURLINFO_REDIRECT_TIME           :: CURLinfo Double     -- CDouble
  CURLINFO_REDIRECT_COUNT          :: CURLinfo CLong      -- CLong
  CURLINFO_REDIRECT_URL            :: CURLinfo String     -- Ptr CChar
  CURLINFO_SIZE_UPLOAD             :: CURLinfo Double     -- CDouble
  CURLINFO_SIZE_DOWNLOAD           :: CURLinfo Double     -- CDouble
  CURLINFO_SPEED_DOWNLOAD          :: CURLinfo Double     -- CDouble
  CURLINFO_SPEED_UPLOAD            :: CURLinfo Double     -- CDouble
  CURLINFO_HEADER_SIZE             :: CURLinfo CLong      -- CLong
  CURLINFO_REQUEST_SIZE            :: CURLinfo CLong      -- CLong
  CURLINFO_SSL_VERIFYRESULT        :: CURLinfo CLong      -- CLong
  CURLINFO_SSL_ENGINES             :: CURLinfo [String]   -- Ptr CURLslist
  CURLINFO_CONTENT_LENGTH_DOWNLOAD :: CURLinfo Double     -- CDouble
  CURLINFO_CONTENT_LENGTH_UPLOAD   :: CURLinfo Double     -- CDouble
  CURLINFO_CONTENT_TYPE            :: CURLinfo String     -- Ptr CChar
  -- CURLINFO_PRIVATE
  CURLINFO_HTTPAUTH_AVAIL          :: CURLinfo [CURLauth] -- CLong
  CURLINFO_PROXYAUTH_AVAIL         :: CURLinfo [CURLauth] -- CLong
  CURLINFO_OS_ERRNO                :: CURLinfo CLong      -- CLong
  CURLINFO_NUM_CONNECTS            :: CURLinfo CLong      -- CLong
  CURLINFO_PRIMARY_IP              :: CURLinfo String     -- Ptr CChar
  CURLINFO_PRIMARY_PORT            :: CURLinfo CLong      -- CLong
  CURLINFO_LOCAL_IP                :: CURLinfo String     -- Ptr CChar
  CURLINFO_LOCAL_PORT              :: CURLinfo CLong      -- CLong
  CURLINFO_COOKIELIST              :: CURLinfo [String]   -- Ptr CURLslist
  CURLINFO_LASTSOCKET              :: CURLinfo CLong      -- CLong
  CURLINFO_FTP_ENTRY_PATH          :: CURLinfo String     -- Ptr CChar
  CURLINFO_CERTINFO                :: CURLinfo [[String]] -- Ptr CURLcertinfo
  CURLINFO_CONDITION_UNMET         :: CURLinfo Bool       -- CLong
  CURLINFO_RTSP_SESSION_ID         :: CURLinfo String     -- Ptr CChar
  CURLINFO_RTSP_CLIENT_CSEQ        :: CURLinfo CLong      -- CLong
  CURLINFO_RTSP_SERVER_CSEQ        :: CURLinfo CLong      -- CLong
  CURLINFO_RTSP_CSEQ_RECV          :: CURLinfo CLong      -- CLong


-------------------------------------------------------------------------------
data CURLoption
  ---- BEHAVIOR OPTIONS -------------------------------------------------------
  = CURLOPT_VERBOSE                 Bool
  | CURLOPT_HEADER                  Bool
  | CURLOPT_NOPROGRESS              Bool
  | CURLOPT_NOSIGNAL                Bool
  | CURLOPT_WILDCARDMATCH           Bool

  ---- CALLBACK OPTIONS -------------------------------------------------------
  | CURLOPT_WRITEFUNCTION           (Maybe CURL_write_callback)
 -- CURLOPT_WRITEDATA
  | CURLOPT_READFUNCTION            (Maybe CURL_read_callback)
 -- CURLOPT_READDATA
 -- CURLOPT_IOCTLFUNCTION
 -- CURLOPT_IOCTLDATA
 -- CURLOPT_SEEKFUNCTION
 -- CURLOPT_SEEKDATA
 -- CURLOPT_SOCKOPTFUNCTION
 -- CURLOPT_SOCKOPTDATA
 -- CURLOPT_OPENSOCKETFUNCTION
 -- CURLOPT_OPENSOCKETDATA
 -- CURLOPT_CLOSESOCKETFUNCTION
 -- CURLOPT_CLOSESOCKETDATA
 -- CURLOPT_PROGRESSFUNCTION
 -- CURLOPT_PROGRESSDATA
  | CURLOPT_HEADERFUNCTION          (Maybe CURL_header_callback)
 -- CURLOPT_HEADERDATA
 -- CURLOPT_DEBUGFUNCTION
 -- CURLOPT_DEBUGDATA
 -- CURLOPT_SSL_CTX_FUNCTION
 -- CURLOPT_SSL_CTX_DATA
 -- CURLOPT_CONV_TO_NETWORK_FUNCTION
 -- CURLOPT_CONV_FROM_NETWORK_FUNCTION
 -- CURLOPT_CONV_FROM_UTF8_FUNCTION
 -- CURLOPT_INTERLEAVEFUNCTION
 -- CURLOPT_INTERLEAVEDATA
 -- CURLOPT_CHUNK_BGN_FUNCTION
 -- CURLOPT_CHUNK_END_FUNCTION
 -- CURLOPT_CHUNK_DATA
 -- CURLOPT_FNMATCH_FUNCTION
 -- CURLOPT_FNMATCH_DATA

  ---- ERROR OPTIONS ----------------------------------------------------------
 -- CURLOPT_ERRORBUFFER             ?
 -- CURLOPT_STDERR                  ?
  | CURLOPT_FAILONERROR             Bool

  ---- NETWORK OPTIONS --------------------------------------------------------
  | CURLOPT_URL                     String
  | CURLOPT_PROTOCOLS               [CURLproto]
  | CURLOPT_REDIR_PROTOCOLS         [CURLproto]
  | CURLOPT_PROXY                   String
  | CURLOPT_PROXYPORT               CLong
  | CURLOPT_PROXYTYPE               CURLproxy
  | CURLOPT_NOPROXY                 String -- or better [String]
  | CURLOPT_HTTPPROXYTUNNEL         Bool
  | CURLOPT_SOCKS5_GSSAPI_SERVICE   String
  | CURLOPT_SOCKS5_GSSAPI_NEC       Bool
  | CURLOPT_INTERFACE               String
  | CURLOPT_LOCALPORT               CLong
  | CURLOPT_LOCALPORTRANGE          CLong
  | CURLOPT_DNS_CACHE_TIMEOUT       CLong
 -- CURLOPT_DNS_USE_GLOBAL_CACHE    Bool
  | CURLOPT_BUFFERSIZE              CLong
  | CURLOPT_PORT                    CLong
  | CURLOPT_TCP_NODELAY             Bool
  | CURLOPT_ADDRESS_SCOPE           CLong
  | CURLOPT_TCP_KEEPALIVE           Bool
  | CURLOPT_TCP_KEEPIDLE            CLong
  | CURLOPT_TCP_KEEPINTVL           CLong

  ---- NAMES and PASSWORDS OPTIONS (Authentication) ---------------------------
  | CURLOPT_NETRC                   CURLnetrc
  | CURLOPT_NETRC_FILE              FilePath
  | CURLOPT_USERPWD                 String
  | CURLOPT_PROXYUSERPWD            String
  | CURLOPT_USERNAME                String
  | CURLOPT_PASSWORD                String
  | CURLOPT_PROXYUSERNAME           String
  | CURLOPT_PROXYPASSWORD           String
  | CURLOPT_HTTPAUTH                [CURLauth]
  | CURLOPT_TLSAUTH_TYPE            String -- should be [CURLtlsauth]
  | CURLOPT_TLSAUTH_USERNAME        String
  | CURLOPT_TLSAUTH_PASSWORD        String
  | CURLOPT_PROXYAUTH               [CURLauth]

  ---- HTTP OPTIONS -----------------------------------------------------------
  | CURLOPT_AUTOREFERER             Bool
  | CURLOPT_ACCEPT_ENCODING         String
  | CURLOPT_TRANSFER_ENCODING       Bool
  | CURLOPT_FOLLOWLOCATION          Bool
  | CURLOPT_UNRESTRICTED_AUTH       Bool
  | CURLOPT_MAXREDIRS               CLong
  | CURLOPT_POSTREDIR               [CURLredir]
  | CURLOPT_PUT                     Bool
  | CURLOPT_POST                    Bool
 -- CURLOPT_POSTFIELDS              String -- not copied
  | CURLOPT_POSTFIELDSIZE           CLong
  | CURLOPT_POSTFIELDSIZE_LARGE     Int64
  | CURLOPT_COPYPOSTFIELDS          String
 -- CURLOPT_HTTPPOST                [CURL_httppost]
  | CURLOPT_REFERER                 String
  | CURLOPT_USERAGENT               String
  | CURLOPT_HTTPHEADER              [String]
  | CURLOPT_HTTP200ALIASES          [String]
  | CURLOPT_COOKIE                  String -- or better [String]
  | CURLOPT_COOKIEFILE              FilePath
  | CURLOPT_COOKIEJAR               FilePath
  | CURLOPT_COOKIESESSION           Bool
  | CURLOPT_COOKIELIST              String
  | CURLOPT_HTTPGET                 Bool
  | CURLOPT_HTTP_VERSION            CURLhttpver
  | CURLOPT_IGNORE_CONTENT_LENGTH   Bool
  | CURLOPT_HTTP_CONTENT_DECODING   Bool
  | CURLOPT_HTTP_TRANSFER_DECODING  Bool

  ---- SMTP OPTIONS -----------------------------------------------------------
  | CURLOPT_MAIL_FROM               String
  | CURLOPT_MAIL_RCPT               [String]
  | CURLOPT_MAIL_AUTH               String

  ---- TFTP OPTIONS -----------------------------------------------------------
  | CURLOPT_TFTP_BLKSIZE            CLong

  ---- FTP OPTIONS ------------------------------------------------------------
  | CURLOPT_FTPPORT                 String
  | CURLOPT_QUOTE                   [String]
  | CURLOPT_POSTQUOTE               [String]
  | CURLOPT_PREQUOTE                [String]
  | CURLOPT_DIRLISTONLY             Bool
  | CURLOPT_APPEND                  Bool
  | CURLOPT_FTP_USE_EPRT            Bool
  | CURLOPT_FTP_USE_EPSV            Bool
  | CURLOPT_FTP_USE_PRET            Bool
  | CURLOPT_FTP_CREATE_MISSING_DIRS CURLftpcreate
  | CURLOPT_FTP_RESPONSE_TIMEOUT    CLong
  | CURLOPT_FTP_ALTERNATIVE_TO_USER String
  | CURLOPT_FTP_SKIP_PASV_IP        Bool
  | CURLOPT_FTPSSLAUTH              CURLftpauth
  | CURLOPT_FTP_SSL_CCC             CURLftpssl
  | CURLOPT_FTP_ACCOUNT             String
  | CURLOPT_FTP_FILEMETHOD          CURLftpmethod

  ---- RTSP OPTIONS -----------------------------------------------------------
  | CURLOPT_RTSP_REQUEST            CURLrtspreq
  | CURLOPT_RTSP_SESSION_ID         String
  | CURLOPT_RTSP_STREAM_URI         String
  | CURLOPT_RTSP_TRANSPORT          String
  | CURLOPT_RTSP_HEADER             [String]
  | CURLOPT_RTSP_CLIENT_CSEQ        CLong
  | CURLOPT_RTSP_SERVER_CSEQ        CLong

  ---- PROTOCOL OPTIONS -------------------------------------------------------
  | CURLOPT_TRANSFERTEXT            Bool
  | CURLOPT_PROXY_TRANSFER_MODE     Bool
  | CURLOPT_CRLF                    Bool
  | CURLOPT_RANGE                   String
  | CURLOPT_RESUME_FROM             CLong
  | CURLOPT_RESUME_FROM_LARGE       Int64
  | CURLOPT_CUSTOMREQUEST           String
  | CURLOPT_FILETIME                Bool
  | CURLOPT_NOBODY                  Bool
  | CURLOPT_INFILESIZE              CLong
  | CURLOPT_INFILESIZE_LARGE        Int64
  | CURLOPT_UPLOAD                  Bool
  | CURLOPT_MAXFILESIZE             CLong
  | CURLOPT_MAXFILESIZE_LARGE       Int64
  | CURLOPT_TIMECONDITION           CURLtimecond
  | CURLOPT_TIMEVALUE               UTCTime

  ---- CONNECTION OPTIONS -----------------------------------------------------
  | CURLOPT_TIMEOUT                 CLong
  | CURLOPT_TIMEOUT_MS              CLong
  | CURLOPT_LOW_SPEED_LIMIT         CLong
  | CURLOPT_LOW_SPEED_TIME          CLong
  | CURLOPT_MAX_SEND_SPEED_LARGE    Int64
  | CURLOPT_MAX_RECV_SPEED_LARGE    Int64
  | CURLOPT_MAXCONNECTS             CLong
 -- CURLOPT_CLOSEPOLICY             CURLclosepol
  | CURLOPT_FRESH_CONNECT           Bool
  | CURLOPT_FORBID_REUSE            Bool
  | CURLOPT_CONNECTTIMEOUT          CLong
  | CURLOPT_CONNECTTIMEOUT_MS       CLong
  | CURLOPT_IPRESOLVE               CURLipresolve
  | CURLOPT_CONNECT_ONLY            Bool
  | CURLOPT_USE_SSL                 CURLusessl
  | CURLOPT_RESOLVE                 [String]
  | CURLOPT_DNS_SERVERS             String -- or better [String]
  | CURLOPT_ACCEPTTIMEOUT_MS        CLong

  ---- SSL and SECURITY OPTIONS -----------------------------------------------
  | CURLOPT_SSLCERT                 FilePath
  | CURLOPT_SSLCERTTYPE             String
  | CURLOPT_SSLKEY                  FilePath
  | CURLOPT_SSLKEYTYPE              String
  | CURLOPT_KEYPASSWD               String
  | CURLOPT_SSLENGINE               String
  | CURLOPT_SSLENGINE_DEFAULT       Bool
  | CURLOPT_SSLVERSION              CURLsslver
  | CURLOPT_SSL_VERIFYPEER          Bool
  | CURLOPT_CAINFO                  FilePath
  | CURLOPT_ISSUERCERT              FilePath
  | CURLOPT_CAPATH                  FilePath
  | CURLOPT_CRLFILE                 FilePath
  | CURLOPT_SSL_VERIFYHOST          Bool
  | CURLOPT_CERTINFO                Bool
  | CURLOPT_RANDOM_FILE             FilePath
  | CURLOPT_EGDSOCKET               String
  | CURLOPT_SSL_CIPHER_LIST         String -- or better [String]
  | CURLOPT_SSL_SESSIONID_CACHE     Bool
  | CURLOPT_SSL_OPTIONS             [CURLsslopt]
  | CURLOPT_KRBLEVEL                String
  | CURLOPT_GSSAPI_DELEGATION       CURLgssapi

  ---- SSH OPTIONS ------------------------------------------------------------
  | CURLOPT_SSH_AUTH_TYPES          [CURLsshauth]
  | CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 String
  | CURLOPT_SSH_PUBLIC_KEYFILE      FilePath
  | CURLOPT_SSH_PRIVATE_KEYFILE     FilePath
  | CURLOPT_SSH_KNOWNHOSTS          FilePath
 -- CURLOPT_SSH_KEYFUNCTION         (Maybe CURL_sshkey_callback)
 -- CURLOPT_SSH_KEYDATA             -- ?

  ---- OTHER OPTIONS ----------------------------------------------------------
 -- CURLOPT_PRIVATE                 -- ?
  | CURLOPT_SHARE                   (Maybe CURLSH)
  | CURLOPT_NEW_FILE_PERMS          CLong
  | CURLOPT_NEW_DIRECTORY_PERMS     CLong

  ---- TELNET OPTIONS ---------------------------------------------------------
  | CURLOPT_TELNETOPTIONS           [String]


-------------------------------------------------------------------------------
type CURL_write_callback = ByteString -> IO CURL_write_response

data CURL_write_response
  = CURL_WRITEFUNC_OK
  | CURL_WRITEFUNC_FAIL
  | CURL_WRITEFUNC_PAUSE
  deriving (Eq)


type CURL_read_callback = Int -> IO CURL_read_response

data CURL_read_response
  = CURL_READFUNC_OK ByteString
  | CURL_READFUNC_ABORT
  | CURL_READFUNC_PAUSE
  deriving (Eq)


type CURL_header_callback = ByteString -> IO CURL_header_response

data CURL_header_response
  = CURL_HEADERFUNC_OK
  | CURL_HEADERFUNC_FAIL
  deriving (Eq)



-------------------------------------------------------------------------------
data CURLC
  = CURLE_UNSUPPORTED_PROTOCOL
  | CURLE_FAILED_INIT
  | CURLE_URL_MALFORMAT
  | CURLE_NOT_BUILT_IN
  | CURLE_COULDNT_RESOLVE_PROXY
  | CURLE_COULDNT_RESOLVE_HOST
  | CURLE_COULDNT_CONNECT
  | CURLE_FTP_WEIRD_SERVER_REPLY
  | CURLE_REMOTE_ACCESS_DENIED
  | CURLE_FTP_ACCEPT_FAILED
  | CURLE_FTP_WEIRD_PASS_REPLY
  | CURLE_FTP_ACCEPT_TIMEOUT
  | CURLE_FTP_WEIRD_PASV_REPLY
  | CURLE_FTP_WEIRD_227_FORMAT
  | CURLE_FTP_CANT_GET_HOST
  | CURLE_FTP_COULDNT_SET_TYPE
  | CURLE_PARTIAL_FILE
  | CURLE_FTP_COULDNT_RETR_FILE
  | CURLE_QUOTE_ERROR
  | CURLE_HTTP_RETURNED_ERROR
  | CURLE_WRITE_ERROR
  | CURLE_UPLOAD_FAILED
  | CURLE_READ_ERROR
  | CURLE_OUT_OF_MEMORY
  | CURLE_OPERATION_TIMEDOUT
  | CURLE_FTP_PORT_FAILED
  | CURLE_FTP_COULDNT_USE_REST
  | 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_FUNCTION_NOT_FOUND
  | CURLE_ABORTED_BY_CALLBACK
  | CURLE_BAD_FUNCTION_ARGUMENT
  | CURLE_INTERFACE_FAILED
  | CURLE_TOO_MANY_REDIRECTS
  | CURLE_UNKNOWN_OPTION
  | CURLE_TELNET_OPTION_SYNTAX
  | CURLE_PEER_FAILED_VERIFICATION
  | CURLE_GOT_NOTHING
  | CURLE_SSL_ENGINE_NOTFOUND
  | CURLE_SSL_ENGINE_SETFAILED
  | CURLE_SEND_ERROR
  | CURLE_RECV_ERROR
  | 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
  | CURLE_FTP_PRET_FAILED
  | CURLE_RTSP_CSEQ_ERROR
  | CURLE_RTSP_SESSION_ERROR
  | CURLE_FTP_BAD_FILE_LIST
  | CURLE_CHUNK_FAILED
  | CURLE_UNKNOWN_ERROR
  deriving (Show, Eq)

toCURLC :: CInt -> CURLC
toCURLC x = case x of
  1 -> CURLE_UNSUPPORTED_PROTOCOL
{-# LINE 774 "Network/CURL000/Types.hsc" #-}
  2 -> CURLE_FAILED_INIT
{-# LINE 775 "Network/CURL000/Types.hsc" #-}
  3 -> CURLE_URL_MALFORMAT
{-# LINE 776 "Network/CURL000/Types.hsc" #-}
  4 -> CURLE_NOT_BUILT_IN
{-# LINE 777 "Network/CURL000/Types.hsc" #-}
  5 -> CURLE_COULDNT_RESOLVE_PROXY
{-# LINE 778 "Network/CURL000/Types.hsc" #-}
  6 -> CURLE_COULDNT_RESOLVE_HOST
{-# LINE 779 "Network/CURL000/Types.hsc" #-}
  7 -> CURLE_COULDNT_CONNECT
{-# LINE 780 "Network/CURL000/Types.hsc" #-}
  8 -> CURLE_FTP_WEIRD_SERVER_REPLY
{-# LINE 781 "Network/CURL000/Types.hsc" #-}
  9 -> CURLE_REMOTE_ACCESS_DENIED
{-# LINE 782 "Network/CURL000/Types.hsc" #-}
  10 -> CURLE_FTP_ACCEPT_FAILED
{-# LINE 783 "Network/CURL000/Types.hsc" #-}
  11 -> CURLE_FTP_WEIRD_PASS_REPLY
{-# LINE 784 "Network/CURL000/Types.hsc" #-}
  12 -> CURLE_FTP_ACCEPT_TIMEOUT
{-# LINE 785 "Network/CURL000/Types.hsc" #-}
  13 -> CURLE_FTP_WEIRD_PASV_REPLY
{-# LINE 786 "Network/CURL000/Types.hsc" #-}
  14 -> CURLE_FTP_WEIRD_227_FORMAT
{-# LINE 787 "Network/CURL000/Types.hsc" #-}
  15 -> CURLE_FTP_CANT_GET_HOST
{-# LINE 788 "Network/CURL000/Types.hsc" #-}
  17 -> CURLE_FTP_COULDNT_SET_TYPE
{-# LINE 789 "Network/CURL000/Types.hsc" #-}
  18 -> CURLE_PARTIAL_FILE
{-# LINE 790 "Network/CURL000/Types.hsc" #-}
  19 -> CURLE_FTP_COULDNT_RETR_FILE
{-# LINE 791 "Network/CURL000/Types.hsc" #-}
  21 -> CURLE_QUOTE_ERROR
{-# LINE 792 "Network/CURL000/Types.hsc" #-}
  22 -> CURLE_HTTP_RETURNED_ERROR
{-# LINE 793 "Network/CURL000/Types.hsc" #-}
  23 -> CURLE_WRITE_ERROR
{-# LINE 794 "Network/CURL000/Types.hsc" #-}
  25 -> CURLE_UPLOAD_FAILED
{-# LINE 795 "Network/CURL000/Types.hsc" #-}
  26 -> CURLE_READ_ERROR
{-# LINE 796 "Network/CURL000/Types.hsc" #-}
  27 -> CURLE_OUT_OF_MEMORY
{-# LINE 797 "Network/CURL000/Types.hsc" #-}
  28 -> CURLE_OPERATION_TIMEDOUT
{-# LINE 798 "Network/CURL000/Types.hsc" #-}
  30 -> CURLE_FTP_PORT_FAILED
{-# LINE 799 "Network/CURL000/Types.hsc" #-}
  31 -> CURLE_FTP_COULDNT_USE_REST
{-# LINE 800 "Network/CURL000/Types.hsc" #-}
  33 -> CURLE_RANGE_ERROR
{-# LINE 801 "Network/CURL000/Types.hsc" #-}
  34 -> CURLE_HTTP_POST_ERROR
{-# LINE 802 "Network/CURL000/Types.hsc" #-}
  35 -> CURLE_SSL_CONNECT_ERROR
{-# LINE 803 "Network/CURL000/Types.hsc" #-}
  36 -> CURLE_BAD_DOWNLOAD_RESUME
{-# LINE 804 "Network/CURL000/Types.hsc" #-}
  37 -> CURLE_FILE_COULDNT_READ_FILE
{-# LINE 805 "Network/CURL000/Types.hsc" #-}
  38 -> CURLE_LDAP_CANNOT_BIND
{-# LINE 806 "Network/CURL000/Types.hsc" #-}
  39 -> CURLE_LDAP_SEARCH_FAILED
{-# LINE 807 "Network/CURL000/Types.hsc" #-}
  41 -> CURLE_FUNCTION_NOT_FOUND
{-# LINE 808 "Network/CURL000/Types.hsc" #-}
  42 -> CURLE_ABORTED_BY_CALLBACK
{-# LINE 809 "Network/CURL000/Types.hsc" #-}
  43 -> CURLE_BAD_FUNCTION_ARGUMENT
{-# LINE 810 "Network/CURL000/Types.hsc" #-}
  45 -> CURLE_INTERFACE_FAILED
{-# LINE 811 "Network/CURL000/Types.hsc" #-}
  47 -> CURLE_TOO_MANY_REDIRECTS
{-# LINE 812 "Network/CURL000/Types.hsc" #-}
  48 -> CURLE_UNKNOWN_OPTION
{-# LINE 813 "Network/CURL000/Types.hsc" #-}
  49 -> CURLE_TELNET_OPTION_SYNTAX
{-# LINE 814 "Network/CURL000/Types.hsc" #-}
  51 -> CURLE_PEER_FAILED_VERIFICATION
{-# LINE 815 "Network/CURL000/Types.hsc" #-}
  52 -> CURLE_GOT_NOTHING
{-# LINE 816 "Network/CURL000/Types.hsc" #-}
  53 -> CURLE_SSL_ENGINE_NOTFOUND
{-# LINE 817 "Network/CURL000/Types.hsc" #-}
  54 -> CURLE_SSL_ENGINE_SETFAILED
{-# LINE 818 "Network/CURL000/Types.hsc" #-}
  55 -> CURLE_SEND_ERROR
{-# LINE 819 "Network/CURL000/Types.hsc" #-}
  56 -> CURLE_RECV_ERROR
{-# LINE 820 "Network/CURL000/Types.hsc" #-}
  58 -> CURLE_SSL_CERTPROBLEM
{-# LINE 821 "Network/CURL000/Types.hsc" #-}
  59 -> CURLE_SSL_CIPHER
{-# LINE 822 "Network/CURL000/Types.hsc" #-}
  60 -> CURLE_SSL_CACERT
{-# LINE 823 "Network/CURL000/Types.hsc" #-}
  61 -> CURLE_BAD_CONTENT_ENCODING
{-# LINE 824 "Network/CURL000/Types.hsc" #-}
  62 -> CURLE_LDAP_INVALID_URL
{-# LINE 825 "Network/CURL000/Types.hsc" #-}
  63 -> CURLE_FILESIZE_EXCEEDED
{-# LINE 826 "Network/CURL000/Types.hsc" #-}
  64 -> CURLE_USE_SSL_FAILED
{-# LINE 827 "Network/CURL000/Types.hsc" #-}
  65 -> CURLE_SEND_FAIL_REWIND
{-# LINE 828 "Network/CURL000/Types.hsc" #-}
  66 -> CURLE_SSL_ENGINE_INITFAILED
{-# LINE 829 "Network/CURL000/Types.hsc" #-}
  67 -> CURLE_LOGIN_DENIED
{-# LINE 830 "Network/CURL000/Types.hsc" #-}
  68 -> CURLE_TFTP_NOTFOUND
{-# LINE 831 "Network/CURL000/Types.hsc" #-}
  69 -> CURLE_TFTP_PERM
{-# LINE 832 "Network/CURL000/Types.hsc" #-}
  70 -> CURLE_REMOTE_DISK_FULL
{-# LINE 833 "Network/CURL000/Types.hsc" #-}
  71 -> CURLE_TFTP_ILLEGAL
{-# LINE 834 "Network/CURL000/Types.hsc" #-}
  72 -> CURLE_TFTP_UNKNOWNID
{-# LINE 835 "Network/CURL000/Types.hsc" #-}
  73 -> CURLE_REMOTE_FILE_EXISTS
{-# LINE 836 "Network/CURL000/Types.hsc" #-}
  74 -> CURLE_TFTP_NOSUCHUSER
{-# LINE 837 "Network/CURL000/Types.hsc" #-}
  75 -> CURLE_CONV_FAILED
{-# LINE 838 "Network/CURL000/Types.hsc" #-}
  76 -> CURLE_CONV_REQD
{-# LINE 839 "Network/CURL000/Types.hsc" #-}
  77 -> CURLE_SSL_CACERT_BADFILE
{-# LINE 840 "Network/CURL000/Types.hsc" #-}
  78 -> CURLE_REMOTE_FILE_NOT_FOUND
{-# LINE 841 "Network/CURL000/Types.hsc" #-}
  79 -> CURLE_SSH
{-# LINE 842 "Network/CURL000/Types.hsc" #-}
  80 -> CURLE_SSL_SHUTDOWN_FAILED
{-# LINE 843 "Network/CURL000/Types.hsc" #-}
  81 -> CURLE_AGAIN
{-# LINE 844 "Network/CURL000/Types.hsc" #-}
  82 -> CURLE_SSL_CRL_BADFILE
{-# LINE 845 "Network/CURL000/Types.hsc" #-}
  83 -> CURLE_SSL_ISSUER_ERROR
{-# LINE 846 "Network/CURL000/Types.hsc" #-}
  84 -> CURLE_FTP_PRET_FAILED
{-# LINE 847 "Network/CURL000/Types.hsc" #-}
  85 -> CURLE_RTSP_CSEQ_ERROR
{-# LINE 848 "Network/CURL000/Types.hsc" #-}
  86 -> CURLE_RTSP_SESSION_ERROR
{-# LINE 849 "Network/CURL000/Types.hsc" #-}
  87 -> CURLE_FTP_BAD_FILE_LIST
{-# LINE 850 "Network/CURL000/Types.hsc" #-}
  88 -> CURLE_CHUNK_FAILED
{-# LINE 851 "Network/CURL000/Types.hsc" #-}
  _                                       -> CURLE_UNKNOWN_ERROR


-------------------------------------------------------------------------------
data CURLCB where
  CURLCB :: CURLCBT a -> FunPtr () -> CURLCB

data CURLCBT a where
  FWRITE  :: CURLCBT CURL_write_callback
  FREAD   :: CURLCBT CURL_read_callback
  FHEADER :: CURLCBT CURL_header_callback

type CURLSL = (CInt, Ptr C.CURLslist)


-------------------------------------------------------------------------------
data CURL = CURL Unique (MVar (Ptr C.CURL)) (IORef [CURLCB]) (IORef [CURLSL])

instance Show CURL where
  showsPrec p (CURL u _ _ _) = showString "CURL#" . showsPrec p (hashUnique u)

instance Eq CURL where
  (CURL u1 _ _ _) == (CURL u2 _ _ _) = u1 == u2


-------------------------------------------------------------------------------
data CURLE = CURLE CURL String String CURLC
  deriving (Eq, Typeable)

instance Exception CURLE

instance Show CURLE where
  showsPrec p (CURLE curl func desc code) =
    showString "\n<curlhs> " . showString desc
    . showString "\n<curlhs> " . showsPrec p code . showString " ("
    . showString func . showString " <" . showsPrec p curl . showString ">)"