--!parent
 
--!encoding=utf-8
 
 
 
--****************************************************************************
 
-- @file      LSW CORE LIB: CURL
 
-- @author    Valentin Schmidt
 
-- @version   0.2
 
-- @requires  xtra("Curl")
 
--****************************************************************************
 
 
 
property $
 
 
 
property _DetachClass
 
 
 
----------------------------------------
 
-- @constructor
 
----------------------------------------
 
on new (me)
 
    
 
    $.loadXtras(me.libdir, ["Curl.x32"], ["CurlXtra.xtra"])
 
    
 
    $.import("detacher")
 
    $.import("string")
 
     
 
    -- LOAD EXTENSIONS
 
    $.inherit(me, $.include(me.libdir&"curlopt.ls"))
 
    $.inherit(me, $.include(me.libdir&"curlinfo.ls"))
 
    $.inherit(me, $.include(me.libdir&"curlform.ls"))
 
 
 
    -- LOAD "DETACH" HELPER CLASS
 
    me._DetachClass = $.include(me.libdir&"detach.ls")
 
 
 
    return me
 
end
 
 
 
----------------------------------------
 
-- FACTORY METHOD
 
-- @return {instance} Curl handle (xtra instance)
 
----------------------------------------
 
on init (me)
 
    return xtra("Curl").new()
 
end
 
 
 
----------------------------------------
 
-- Used for "detaching" xtra callbacks from original thread,
 
-- so scripting errors in the callback's code don't fail silently
 
-- @param {instance} ch - Curl handle
 
-- @param {symbol} cbHandler - Callback handler
 
-- @param {object} [cbTarget=_movie] - Callback target
 
-- @param {bool} [passImmediately=false] - If specified, received data chunks are passed to callback immediately
 
-- @return {integer} Curl multi error code (0 = no error)
 
----------------------------------------
 
on execAsyncDetached (me, ch, cbHandler, cbTarget, passImmediately, customData)
 
    if voidP(cbTarget) then cbTarget = _movie
 
    obj = me._DetachClass.new(cbHandler, cbTarget, ch, customData)
 
    return ch.execAsync(#_detach, obj, passImmediately)
 
end
 
 
 
----------------------------------------
 
--
 
----------------------------------------
 
on setHeaderCallbackDetached (me, ch, cbHandler, cbTarget)--, passImmediately, customData)
 
    if voidP(cbTarget) then cbTarget = _movie
 
    obj = me._DetachClass.new(cbHandler, cbTarget, ch)--, customData)
 
    return ch.setHeaderCallback(#_detach, obj)
 
end
 
 
 
----------------------------------------
 
--
 
----------------------------------------
 
on setProgressCallbackDetached (me, ch, cbHandler, cbTarget, customData)
 
    if voidP(cbTarget) then cbTarget = _movie
 
    obj = me._DetachClass.new(cbHandler, cbTarget, ch, customData)
 
    return ch.setProgressCallback(#_detachProgress, obj)
 
end
 
 
 
----------------------------------------
 
-- Generates URL-encoded query string
 
-- @param {propList} param_obj
 
-- @return {string}
 
----------------------------------------
 
on httpBuildQuery (me, param_obj)
 
    query_str = ""
 
    cnt = count(param_obj)
 
    repeat with i = 1 to cnt
 
        put param_obj.getPropAt(i)&"="&curl_escape(param_obj[i])&"&" after query_str
 
    end repeat
 
    delete the last char of query_str
 
    return query_str
 
end
 
 
 
----------------------------------------
 
-- Parse HTTP result headers
 
-- @param {string} headerStr
 
-- @return {propList}
 
----------------------------------------
 
on parseHeaders (me, resultStr) 
 
    headerSep = $.CRLF&$.CRLF
 
    lineSep = $.CRLF
 
    parts = $.string.explode(headerSep, resultStr, 2)
 
    headerStr = parts[1]
 
    lines = $.string.explode(lineSep, headerStr)
 
    statusLine = lines[1]
 
    if not (statusLine contains ":") then
 
        statusCode = integer(statusLine.word[2]) -- TODO
 
        lines.deleteAt(1)
 
    end if
 
    headers = [:]
 
    repeat with s in lines
 
        if not (s contains ":") then next repeat
 
        parts = $.string.explode(":", s, 2)
 
        k = parts[1]
 
        v = parts[2]
 
        if v starts " " then delete char 1 of v
 
        --headers[k] = v
 
        headers.addProp(k, v)
 
    end repeat
 
    --return headers
 
    return [#status:statusCode, #headers:headers]
 
end