File "cURL.inc"

Path: /ComicDir2Cbr/inc/cURL.inc
File size: 4.78 KB
MIME-type:
Charset: utf-8

'------------------------------------------------------------------------------
' cURL.inc - cURL library for PowerBasic.
' currently supported: FTP UPLOAD with text-progressbar
' Usage: ErrCode = UPLOAD(hDlg, TxPgBarId, "myfile", "/temp")
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
GLOBAL curlFile, curlRdir AS STRING : GLOBAL curlStatus AS LONG
'------------------------------------------------------------------------------
FUNCTION UPLOAD (BYVAL hDlg AS DWORD, BYVAL PgBarId AS LONG, _
                 BYVAL file AS STRING, BYVAL rdir AS STRING) AS LONG
    curlFile = file
    curlRdir = rdir
    curlStatus = %STILL_ACTIVE
    DIALOG POST hDlg, %WM_APP, PgBarId, 0
    WHILE curlStatus = %STILL_ACTIVE
        DIALOG DOEVENTS
        SLEEP 0
    WEND
    FUNCTION = curlStatus
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
MACRO UPLOAD_CALLBACK
    STATIC hConsole, curlPid AS DWORD
    STATIC curlTimer, curlPg AS LONG
    LOCAL timeleft, curlErr AS STRING
    LOCAL curlBuffer AS ASCIIZ * 512
    LOCAL curlPct, curlBps AS LONG
    LOCAL hInfo AS DWORD
    LOCAL curlCod AS LONG

    SELECT CASE AS LONG CB.MSG

        CASE %WM_APP
            curlErr = DIR$(EXE.PATH$ + "curl.exe") : DIR$ CLOSE
            IF ISFALSE LEN(curlErr) THEN
                ? "cURL executable not found", %MB_ICONERROR, EXE.NAME$
                curlStatus = 1
                EXIT FUNCTION
            END IF
            ' Get text-progressbar id from message
            curlPg = CB.WPARAM
            SET_TEXT_PROGRESSBAR CB.HNDL, curlPg, 0, "", %RGB_DARKGREEN, %GREEN
            ' Spawn a cURL process via Shell
            curlPid = SHELL ("curl -T " + curlFile _
                           + " -u " + $USR + ":" + $PWD _
                           + " ftp://" + $FTP _
                           + "/" + TRIM$(curlRdir, "/") + "/" _
                           , 0)
            SLEEP 1000
            ' Attach the corresponding console and get its handle
            AttachConsole(curlPid)
            hConsole = GetStdHandle(%STD_OUTPUT_HANDLE)
            ' Start the 1 second timer to read console content
            curlTimer = SetTimer(CB.HNDL, %WM_USER, 1000, BYVAL 0)
            DIALOG POST CB.HNDL, %WM_TIMER, %WM_USER, 0

        CASE %WM_DESTROY
            ' If parent dialog (this program) is killed then kill child process (cURL) as well
            IF ISTRUE curlTimer THEN KillTimer CB.HNDL, curlTimer
            IF ISTRUE hConsole THEN
                FreeConsole ()
                hConsole = OpenProcess(%PROCESS_TERMINATE, %FALSE, curlPid)
                TerminateProcess(hConsole, 0)
                CloseHandle(hConsole)
            END IF

        CASE %WM_TIMER
            ' Check status of cURL process
            hInfo = OpenProcess(%PROCESS_QUERY_INFORMATION, %FALSE, curlPid)
            GetExitCodeProcess(hInfo, curlCod)
            CloseHandle(hInfo)

            ' Get cURL progress (%)
            readConsoleOutputCharacter (hConsole, BYVAL VARPTR (curlBuffer), 80*4, BYVAL 0, curlBps)
            curlPct = VAL(MID$(curlBuffer, 161, 3))

            ' cURL is finished: end timer + show result
            IF curlCod <> %STILL_ACTIVE THEN
                KillTimer CB.HNDL, curlTimer : curlTimer = 0
                IF curlCod <> 0 THEN
                    curlErr = TRIM$(MID$(curlBuffer, 239))
                    SET_TEXT_PROGRESSBAR CB.HNDL, curlPg, curlPct, "", %RGB_DARKRED, %RED
                ELSE
                    SET_TEXT_PROGRESSBAR CB.HNDL, curlPg, curlPct, ""
                END IF
                FreeConsole () : hConsole = 0
                curlStatus = curlCod
                EXIT FUNCTION
            END IF

            ' cURL is active: get more info
            timeleft = LTRIM$(MID$(curlBuffer, 228, 5)) : IF LEFT$(timeleft,1) = "0" THEN timeleft = MID$(timeleft,2)
            curlBps = VAL(MID$(curlBuffer, 234))

            ' Display info
            SET_TEXT_PROGRESSBAR CB.HNDL, curlPg, curlPct, SIZEKB(curlBps) + "/s (" + timeleft + " left)"

    END SELECT
END MACRO
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION SIZEKB(fs AS LONG) AS STRING ' File size, in B, KB or MB
    LOCAL n AS LONG
    n = fs ' filesize
    IF n < 1024 THEN
        FUNCTION = TRIM$(n) + " B"
    ELSE
        n \= 1024
        IF n < 1024 THEN
            FUNCTION = TRIM$(n) + " KB"
        ELSE
            n \= 1024
            FUNCTION = TRIM$(n) + " MB"
        END IF
    END IF
END FUNCTION
'------------------------------------------------------------------------------