-- parent script "CurlManager"
--****************************************************************************
-- @file Curl Manager Class for asynchronous requests (singleton)
-- @author Valentin Schmidt
-- @requires xtra("Curl"), script("CurlDetacher")
--****************************************************************************
property CURLOPT
property CURLINFO
property CURLFORM
property _instance
----------------------------------------
-- @constructor (explicitely forced singleton class)
----------------------------------------
on new (me)
if not voidP(me.script._instance) then return me.script._instance
-- load constants
me._loadOptConstants()
me._loadInfoConstants()
me._loadFormConstants()
me.script._instance = me
return me
end
----------------------------------------
-- Factory function
-- @return {instance} Curl handle (xtra instance)
----------------------------------------
on init (me)
return xtra("Curl").new()
end
----------------------------------------
-- Function for asynchronous Curl requests.
-- It takes care of 2 things:
-- a) Garbage collection is prevented for ongoing requests.
-- b) The final callback is "detached" from the original xtra thread,
-- so scripting errors in the callback's code don't fail silently.
-- In addition, it also allows to specify arbitrary custom data which
-- is then passed to the final callback handler.
--
-- @param {instance} ch - Curl handle
-- @param {symbol} cbHandler - Callback handler
-- @param {object} [cbTarget=_movie] - Callback target
-- @param {integer} [returnMode=0] - 0=return error code, 1=return data, 2=return received chunks immediately
-- @param {any} [customData=VOID] - If specified, this data will be passed back to the callback handler
-- @return {integer} Curl multi error code (0 = no error)
----------------------------------------
on execAsync (me, ch, cbHandler, cbTarget, returnMode, customData)
if voidP(cbTarget) then cbTarget = _movie
obj = script("CurlDetacher").new(cbHandler, cbTarget, ch, customData)
return ch.execAsync(#_detach, obj, returnMode)
end
----------------------------------------
--
----------------------------------------
on _loadOptConstants (me)
-- see curl.h
opt = [:]
opt[#ACCEPT_ENCODING] = 10102
opt[#ACCEPTTIMEOUT_MS] = 212
opt[#ADDRESS_SCOPE] = 171
opt[#APPEND] = 50
opt[#AUTOREFERER] = 58
opt[#BUFFERSIZE] = 98
opt[#CAINFO] = 10065
opt[#CAPATH] = 10097
opt[#CERTINFO] = 172
opt[#CHUNK_BGN_FUNCTION] = 20198
opt[#CHUNK_DATA] = 10201
opt[#CHUNK_END_FUNCTION] = 20199
opt[#CLOSESOCKETDATA] = 10209
opt[#CLOSESOCKETFUNCTION] = 20208
opt[#CONNECT_ONLY] = 141
opt[#CONNECTTIMEOUT] = 78
opt[#CONNECTTIMEOUT_MS] = 156
opt[#CONV_FROM_NETWORK_FUNCTION] = 20142
opt[#CONV_FROM_UTF8_FUNCTION] = 20144
opt[#CONV_TO_NETWORK_FUNCTION] = 20143
opt[#COOKIE] = 10022
opt[#COOKIEFILE] = 10031
opt[#COOKIEJAR] = 10082
opt[#COOKIELIST] = 10135
opt[#COOKIESESSION] = 96
opt[#COPYPOSTFIELDS] = 10165
opt[#CRLF] = 27
opt[#CRLFILE] = 10169
opt[#CUSTOMREQUEST] = 10036
opt[#DEBUGDATA] = 10095
opt[#DEBUGFUNCTION] = 20094
opt[#DIRLISTONLY] = 48
opt[#DNS_CACHE_TIMEOUT] = 92
opt[#DNS_INTERFACE] = 10221
opt[#DNS_LOCAL_IP4] = 10222
opt[#DNS_LOCAL_IP6] = 10223
opt[#DNS_SERVERS] = 10211
opt[#EGDSOCKET] = 10077
opt[#ERRORBUFFER] = 10010
opt[#EXPECT_100_TIMEOUT_MS] = 227
opt[#FAILONERROR] = 45
opt[#FILETIME] = 69
opt[#FNMATCH_DATA] = 10202
opt[#FNMATCH_FUNCTION] = 20200
opt[#FOLLOWLOCATION] = 52
opt[#FORBID_REUSE] = 75
opt[#FRESH_CONNECT] = 74
opt[#FTP_ACCOUNT] = 10134
opt[#FTP_ALTERNATIVE_TO_USER] = 10147
opt[#FTP_CREATE_MISSING_DIRS] = 110
opt[#FTP_FILEMETHOD] = 138
opt[#FTP_RESPONSE_TIMEOUT] = 112
opt[#FTP_SKIP_PASV_IP] = 137
opt[#FTP_SSL_CCC] = 154
opt[#FTP_USE_EPRT] = 106
opt[#FTP_USE_EPSV] = 85
opt[#FTP_USE_PRET] = 188
opt[#FTPPORT] = 10017
opt[#FTPSSLAUTH] = 129
opt[#GSSAPI_DELEGATION] = 210
opt[#HEADER] = 42
opt[#HEADERDATA] = 10029
opt[#HEADERFUNCTION] = 20079
opt[#HEADEROPT] = 229
opt[#HTTP200ALIASES] = 10104
opt[#HTTP_CONTENT_DECODING] = 158
opt[#HTTP_TRANSFER_DECODING] = 157
opt[#HTTP_VERSION] = 84
opt[#HTTPAUTH] = 107
opt[#HTTPGET] = 80
opt[#HTTPHEADER] = 10023
opt[#HTTPPOST] = 10024
opt[#HTTPPROXYTUNNEL] = 61
opt[#IGNORE_CONTENT_LENGTH] = 136
opt[#INFILESIZE] = 14
opt[#INFILESIZE_LARGE] = 30115
opt[#INTERFACE] = 10062
opt[#INTERLEAVEDATA] = 10195
opt[#INTERLEAVEFUNCTION] = 20196
opt[#IOCTLDATA] = 10131
opt[#IOCTLFUNCTION] = 20130
opt[#IPRESOLVE] = 113
opt[#ISSUERCERT] = 10170
opt[#KEYPASSWD] = 10026
opt[#KRBLEVEL] = 10063
opt[#LOCALPORT] = 139
opt[#LOCALPORTRANGE] = 140
opt[#LOGIN_OPTIONS] = 10224
opt[#LOW_SPEED_LIMIT] = 19
opt[#LOW_SPEED_TIME] = 20
opt[#MAIL_AUTH] = 10217
opt[#MAIL_FROM] = 10186
opt[#MAIL_RCPT] = 10187
opt[#MAX_RECV_SPEED_LARGE] = 30146
opt[#MAX_SEND_SPEED_LARGE] = 30145
opt[#MAXCONNECTS] = 71
opt[#MAXFILESIZE] = 114
opt[#MAXFILESIZE_LARGE] = 30117
opt[#MAXREDIRS] = 68
opt[#NETRC] = 51
opt[#NETRC_FILE] = 10118
opt[#NEW_DIRECTORY_PERMS] = 160
opt[#NEW_FILE_PERMS] = 159
opt[#NOBODY] = 44
opt[#NOPROGRESS] = 43
opt[#NOPROXY] = 10177
opt[#NOSIGNAL] = 99
opt[#OBSOLETE40] = 10040
opt[#OPENSOCKETDATA] = 10164
opt[#OPENSOCKETFUNCTION] = 20163
opt[#PASSWORD] = 10174
opt[#PATH_AS_IS] = 234
opt[#PINNEDPUBLICKEY] = 10230
opt[#PIPEWAIT] = 237
opt[#PORT] = 3
opt[#POST] = 47
opt[#POSTFIELDS] = 10015
opt[#POSTFIELDSIZE] = 60
opt[#POSTFIELDSIZE_LARGE] = 30120
opt[#POSTQUOTE] = 10039
opt[#POSTREDIR] = 161
opt[#PREQUOTE] = 10093
opt[#PRIVATE] = 10103
opt[#PROGRESSDATA] = 10057
opt[#PROGRESSFUNCTION] = 20056
opt[#PROTOCOLS] = 181
opt[#PROXY] = 10004
opt[#PROXY_SERVICE_NAME] = 10235
opt[#PROXY_TRANSFER_MODE] = 166
opt[#PROXYAUTH] = 111
opt[#PROXYHEADER] = 10228
opt[#PROXYPASSWORD] = 10176
opt[#PROXYPORT] = 59
opt[#PROXYTYPE] = 101
opt[#PROXYUSERNAME] = 10175
opt[#PROXYUSERPWD] = 10006
opt[#PUT] = 54
opt[#QUOTE] = 10028
opt[#RANDOM_FILE] = 10076
opt[#range] = 10007
opt[#READDATA] = 10009
opt[#READFUNCTION] = 20012
opt[#REDIR_PROTOCOLS] = 182
opt[#REFERER] = 10016
opt[#RESOLVE] = 10203
opt[#RESUME_FROM] = 21
opt[#RESUME_FROM_LARGE] = 30116
opt[#RTSP_CLIENT_CSEQ] = 193
opt[#RTSP_REQUEST] = 189
opt[#RTSP_SERVER_CSEQ] = 194
opt[#RTSP_SESSION_ID] = 10190
opt[#RTSP_STREAM_URI] = 10191
opt[#RTSP_TRANSPORT] = 10192
opt[#SASL_IR] = 218
opt[#SEEKDATA] = 10168
opt[#SEEKFUNCTION] = 20167
opt[#SERVICE_NAME] = 10236
opt[#SHARE] = 10100
opt[#SOCKOPTDATA] = 10149
opt[#SOCKOPTFUNCTION] = 20148
opt[#SOCKS5_GSSAPI_NEC] = 180
opt[#SOCKS5_GSSAPI_SERVICE] = 10179
opt[#SSH_AUTH_TYPES] = 151
opt[#SSH_HOST_PUBLIC_KEY_MD5] = 10162
opt[#SSH_KEYDATA] = 10185
opt[#SSH_KEYFUNCTION] = 20184
opt[#SSH_KNOWNHOSTS] = 10183
opt[#SSH_PRIVATE_KEYFILE] = 10153
opt[#SSH_PUBLIC_KEYFILE] = 10152
opt[#SSL_CIPHER_LIST] = 10083
opt[#SSL_CTX_DATA] = 10109
opt[#SSL_CTX_FUNCTION] = 20108
opt[#SSL_ENABLE_ALPN] = 226
opt[#SSL_ENABLE_NPN] = 225
opt[#SSL_FALSESTART] = 233
opt[#SSL_OPTIONS] = 216
opt[#SSL_SESSIONID_CACHE] = 150
opt[#SSL_VERIFYHOST] = 81
opt[#SSL_VERIFYPEER] = 64
opt[#SSL_VERIFYSTATUS] = 232
opt[#SSLCERT] = 10025
opt[#SSLCERTTYPE] = 10086
opt[#SSLENGINE] = 10089
opt[#SSLENGINE_DEFAULT] = 90
opt[#SSLKEY] = 10087
opt[#SSLKEYTYPE] = 10088
opt[#SSLVERSION] = 32
opt[#STDERR] = 10037
opt[#TCP_KEEPALIVE] = 213
opt[#TCP_KEEPIDLE] = 214
opt[#TCP_KEEPINTVL] = 215
opt[#TCP_NODELAY] = 121
opt[#TELNETOPTIONS] = 10070
opt[#TFTP_BLKSIZE] = 178
opt[#TIMECONDITION] = 33
opt[#TIMEOUT] = 13
opt[#TIMEOUT_MS] = 155
opt[#TIMEVALUE] = 34
opt[#TLSAUTH_PASSWORD] = 10205
opt[#TLSAUTH_TYPE] = 10206
opt[#TLSAUTH_USERNAME] = 10204
opt[#TRANSFER_ENCODING] = 207
opt[#TRANSFERTEXT] = 53
opt[#UNIX_SOCKET_PATH] = 10231
opt[#UNRESTRICTED_AUTH] = 105
opt[#UPLOAD] = 46
opt[#URL] = 10002
opt[#USE_SSL] = 119
opt[#USERAGENT] = 10018
opt[#USERNAME] = 10173
opt[#USERPWD] = 10005
opt[#VERBOSE] = 41
opt[#WILDCARDMATCH] = 197
opt[#WRITEDATA] = 10001
opt[#WRITEFUNCTION] = 20011
opt[#XFERINFOFUNCTION] = 20219
opt[#XOAUTH2_BEARER] = 10220
me.CURLOPT = opt
end
----------------------------------------
--
----------------------------------------
on _loadInfoConstants (me)
info = [:]
info[#APPCONNECT_TIME] = 3145761
info[#CERTINFO] = 4194338
info[#CONDITION_UNMET] = 2097187
info[#CONNECT_TIME] = 3145733
info[#CONTENT_LENGTH_DOWNLOAD] = 3145743
info[#CONTENT_LENGTH_UPLOAD] = 3145744
info[#CONTENT_TYPE] = 1048594
info[#COOKIELIST] = 4194332
info[#EFFECTIVE_URL] = 1048577
info[#FILETIME] = 2097166
info[#FTP_ENTRY_PATH] = 1048606
info[#HEADER_SIZE] = 2097163
info[#HTTP_CONNECTCODE] = 2097174
info[#HTTPAUTH_AVAIL] = 2097175
info[#LASTSOCKET] = 2097181
info[#LOCAL_IP] = 1048617
info[#LOCAL_PORT] = 2097194
info[#NAMELOOKUP_TIME] = 3145732
info[#NUM_CONNECTS] = 2097178
info[#OS_ERRNO] = 2097177
info[#PRETRANSFER_TIME] = 3145734
info[#PRIMARY_IP] = 1048608
info[#PRIMARY_PORT] = 2097192
info[#PRIVATE] = 1048597
info[#PROXYAUTH_AVAIL] = 2097176
info[#REDIRECT_COUNT] = 2097172
info[#REDIRECT_TIME] = 3145747
info[#REDIRECT_URL] = 1048607
info[#REQUEST_SIZE] = 2097164
info[#RESPONSE_CODE] = 2097154
info[#RTSP_CLIENT_CSEQ] = 2097189
info[#RTSP_CSEQ_RECV] = 2097191
info[#RTSP_SERVER_CSEQ] = 2097190
info[#RTSP_SESSION_ID] = 1048612
info[#SIZE_DOWNLOAD] = 3145736
info[#SIZE_UPLOAD] = 3145735
info[#SPEED_DOWNLOAD] = 3145737
info[#SPEED_UPLOAD] = 3145738
info[#SSL_ENGINES] = 4194331
info[#SSL_VERIFYRESULT] = 2097165
info[#STARTTRANSFER_TIME] = 3145745
info[#TLS_SESSION] = 4194347
info[#TOTAL_TIME] = 3145731
me.CURLINFO = info
end
----------------------------------------
--
----------------------------------------
on _loadFormConstants (me)
form = [:]
form[#COPYNAME] = 1
form[#PTRNAME] = 2
form[#NAMELENGTH] = 3
form[#COPYCONTENTS] = 4
form[#PTRCONTENTS] = 5
form[#CONTENTSLENGTH] = 6
form[#FILECONTENT] = 7
form[#ARRAY] = 8
form[#OBSOLETE] = 9
form[#FILE] = 10
form[#BUFFER] = 11
form[#BUFFERPTR] = 12
form[#BUFFERLENGTH] = 13
form[#CONTENTTYPE] = 14
form[#CONTENTHEADER] = 15
form[#FILENAME] = 16
form[#END] = 17
form[#OBSOLETE2] = 18
form[#STREAM] = 19
me.CURLFORM = form
end