--****************************************************************************
-- @file Parent script "SetFileNameAsync"
-- @author Valentin Schmidt
-- @version 0.2
-- @requires xtra("Curl")
--
-- Usage:
-- script("SetFileNameAsync").new(member("map"), "https://domain.com/foo/bar.w3d")
-- script("SetFileNameAsync").new(member("bmp"), "https://domain.com/foo.jpg", #myResultHandler)
--****************************************************************************
property ancestor
property _ch
property _mem
property _file
property _res
-- optional
property _cbHandler -- callback handler
property _cbTarget -- callback target object, default = _movie, i.e. callback handler expected in movie script
----------------------------------------
-- @constructor
----------------------------------------
on new (me, aMemOrCastlibRef, aUrl, cbHandler, cbTarget, timeoutSec)
me.ancestor = timeout().new("_detach_"&random(the maxinteger), 0, #__doneDetached, me)
-- extract filename from URL
od = _player.itemDelimiter
_player.itemDelimiter = "/"
localFile = curl_getEnvVar("TMP") & "\" & the last item of aUrl
_player.itemDelimiter = od
me._mem = aMemOrCastlibRef
me._file = localFile
me._cbHandler = cbHandler
if voidP(cbTarget) then cbTarget = _movie
me._cbTarget = cbTarget
-- start asynchronous download of file
me._ch = xtra("Curl").new()
me._ch.setOption(10018, "Curl Xtra") -- USERAGENT
me._ch.setOption(10002, aUrl) -- URL
if integerP(timeoutSec) then me._ch.setOption(13, timeoutSec) -- TIMEOUT
me._ch.setDestinationFile(localFile)
me._ch.execAsync(#__doneCurl, me)
return me
end
----------------------------------------
-- Called by curl xtra
-- @callback
----------------------------------------
on __doneCurl (me, res)
me._res = res
-- now detach from curl thread
me.period = 1
end
----------------------------------------
-- Called by timeout
-- @callback
----------------------------------------
on __doneDetached (me)
me.forget()
if me._res=0 then
response_code = me._ch.getInfo(2097154) -- RESPONSE_CODE
if response_code>=200 AND response_code<300 then
me._mem.filename = me._file
res = TRUE
else
res = "Server returned HTTP status code" && response_code
end if
else
res = curl_error(me._res)
end if
if symbolP(me._cbHandler) then
-- if a callback handler was passed to new(), it
-- is called now, and either receives TRUE for success
-- or an error string in case of failure.
call(me._cbHandler, me._cbTarget, res)
end if
end