1. --****************************************************************************
  2. -- @file     Parent script "SetFileNameAsync"
  3. -- @author   Valentin Schmidt
  4. -- @version  0.2
  5. -- @requires xtra("Curl")
  6. --
  7. -- Usage:
  8. -- script("SetFileNameAsync").new(member("map"), "https://domain.com/foo/bar.w3d")
  9. -- script("SetFileNameAsync").new(member("bmp"), "https://domain.com/foo.jpg", #myResultHandler)
  10. --****************************************************************************
  11.  
  12. property ancestor
  13.  
  14. property _ch
  15. property _mem
  16. property _file
  17. property _res
  18.  
  19. -- optional
  20. property _cbHandler -- callback handler
  21. property _cbTarget -- callback target object, default = _movie, i.e. callback handler expected in movie script
  22.  
  23. ----------------------------------------
  24. -- @constructor
  25. ----------------------------------------
  26. on new (me, aMemOrCastlibRef, aUrl, cbHandler, cbTarget, timeoutSec)
  27.   me.ancestor = timeout().new("_detach_"&random(the maxinteger), 0, #__doneDetached, me)
  28.  
  29.   -- extract filename from URL
  30.   od = _player.itemDelimiter
  31.   _player.itemDelimiter = "/"
  32.   localFile = curl_getEnvVar("TMP") & "\" & the last item of aUrl
  33.   _player.itemDelimiter = od
  34.  
  35.   me._mem = aMemOrCastlibRef
  36.   me._file = localFile
  37.   me._cbHandler = cbHandler
  38.   if voidP(cbTarget) then cbTarget = _movie
  39.   me._cbTarget = cbTarget
  40.  
  41.   -- start asynchronous download of file
  42.   me._ch = xtra("Curl").new()
  43.   me._ch.setOption(10018, "Curl Xtra") -- USERAGENT
  44.   me._ch.setOption(10002, aUrl) -- URL
  45.   if integerP(timeoutSec) then me._ch.setOption(13, timeoutSec) -- TIMEOUT
  46.   me._ch.setDestinationFile(localFile)
  47.   me._ch.execAsync(#__doneCurl, me)
  48.  
  49.   return me
  50. end
  51.  
  52. ----------------------------------------
  53. -- Called by curl xtra
  54. -- @callback
  55. ----------------------------------------
  56. on __doneCurl (me, res)
  57.   me._res = res
  58.   -- now detach from curl thread
  59.   me.period = 1
  60. end
  61.  
  62. ----------------------------------------
  63. -- Called by timeout
  64. -- @callback
  65. ----------------------------------------
  66. on __doneDetached (me)
  67.   me.forget()
  68.   if me._res=0 then
  69.     response_code = me._ch.getInfo(2097154) -- RESPONSE_CODE
  70.     if response_code>=200 AND response_code<300 then
  71.       me._mem.filename = me._file
  72.       res = TRUE
  73.     else
  74.       res = "Server returned HTTP status code" && response_code
  75.     end if
  76.   else
  77.     res = curl_error(me._res)
  78.   end if
  79.   if symbolP(me._cbHandler) then
  80.     -- if a callback handler was passed to new(), it
  81.     -- is called now, and either receives TRUE for success
  82.     -- or an error string in case of failure.
  83.     call(me._cbHandler, me._cbTarget, res)
  84.   end if
  85. end
  86.  
[raw code]