- Code: Select all Expand view
#include "FiveWin.ch"
//----------------------------------------------------------------------------//
function Main()
local oDlg, oBtnDwn, oBtnOk
DEFINE DIALOG oDlg
@ 1, 1 BUTTON oBtnDwn PROMPT "Download" ACTION Download(oProg)
@ 2.5, 1 PROGRESS oProg POSITION 0 SIZE 100, 12
@ 3, 1 BUTTON oBtnOk PROMPT "Quit" ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTER
return nil
PROCEDURE Download
LOCAL cURL, cSaveAs, nFileSize
cURL := "http://www.fivetechsoft.com/files/utilities/prometheus.exe"
cSaveAs := "prometh.exe"
nFileSize := Get_File_Size(cURL)
IF wfSaveURL(cURL, cSaveAs, oProg, nFileSize)
? "Downloaded" // ... File is there AND downloaded as cSaveAs
ELSE
? "Can not downloaded " //... File is not there
ENDIF
RETURN
FUNCTION wfSaveURL(cUrl, cSaveAs, oProg, nFileSize)
LOCAL oConn, lReturn:=.T.
DEFAULT oProg := NIL
DEFAULT nFileSize := 0
IF Upper(Left(cUrl,4))#"HTTP"
cUrl:="http://"+cUrl
ENDIF
TRY
oConn := TipClientHttp():New(TURL():New(cUrl))
oConn:nConnTimeout := 20000
IF !EMPTY(oProg) .and. !EMPTY(nFileSize)
oConn:exGauge := { | done, size| wfProgress(done, size, oProg ) }
oProg:SetRange( 0, 99 )
ENDIF
IF oConn:Open(cURL)
oConn:ReadToFile(cSaveAs,,nFileSize)
oConn:Close()
ENDIF
CATCH
lReturn := .F.
END
RETURN lReturn
function wfProgress(nReceived,nTotalSize,ooProg)
ooProg:SetPos(INT(nReceived/nTotalSize*100)+1)
SysRefresh()
return
function Get_File_Size(cURL)
LOCAL cBuffer, cRequest, cResponse, nBytes, pSocket, aRequest
LOCAL crlf := CHR(13)+CHR(10), Result := 0, oUrl
// initialize sockets system and connect to server
DEFAULT cURL:=""
oUrl := tURL():New( cUrl )
IF Empty( oUrl )
Return 0
ENDIF
IF Lower( oUrl:cProto ) <> "http"
Return 0
ENDIF
INetInit()
pSocket := INetConnect( oUrl:cServer, 80 )
IF INetErrorCode( pSocket ) <> 0
? "Socket error:", INetErrorDesc( pSocket )
INetCleanUp()
RETURN 0
ENDIF
crlf := INETCRLF()
// send HTTP request to server
cRequest := "HEAD "+oUrl:BuildAddress() + " HTTP/1.1" + CRLF + ;
"Host: "+oUrl:cServer+ CRLF + ;
"User-Agent: HTTP-Get-File-Size" + CRLF + ;
"Connection:close" + CRLF + ;
CRLF
nBytes := INetSend( pSocket, cRequest )
cBuffer := Space(4096)
cResponse:= ""
// get HTTP response from server
DO WHILE ( nBytes > 0 )
nBytes := INetRecv( pSocket, @cBuffer )
cResponse += Left( cBuffer, nBytes )
cBuffer := Space(4096)
ENDDO
// disconnect and cleanup memory
INetClose( pSocket )
INetCleanUp()
aRequest := HB_ATokens(cResponse, CRLF)
clear
nAt := Ascan(aRequest,{|x|LEFT(LTRIM(X),15)="Content-Length:"})
IF nAt>0
Result := VAL(SUBSTR(aRequest[nAt],17))
ENDIF
RETURN RESULT