Now this is cool. I fixed it so if you the connection is list, the function just returns false.
Global win:TGadget=CreateWindow("",Desktop().ClientWidth()/2-200,Desktop().ClientHeight()/2-50,400,100,Null,WINDOW_TITLEBAR)
CreateLabel("Downloading...",10,10,100,16,win)
Global progbar:TGadget=CreateProgBar(10,10+16,win.clientwidth()-20,28,win)
file$="http://blitzbasic.com/file/get.php?file=/Products/demos/Blitz3DDemo183.exe"
If CopyFile2(file$,"",DisplayDownloadProgress)
Notify "Download successful."
OpenURL AppDir$+""+StripDir(file)
Else
Notify "Download failed."
EndIf
Function CopyFile2:Int(src$,dst$="",callback:Byte Ptr=Null,bufsize=128)
url$=src
src$=Replace(src,"","/")
src=Replace(src,"://","::")
If dst="" dst=AppDir$+"/"+StripDir(src)
If callback=Null
'Just use the regular CopyFile()
Return CopyFile(src,dst)
Else
'Set up the callback function
Local DownloadFileUpdateCallback(p#)
DownloadFileUpdateCallback=callback
'Get the file size
size=FileSize2(url)
If size=-1 Return
'Open streams
out:TStream=WriteFile(dst)
If Not out Return
in:TStream=ReadStream(src)
If Not in
out.close()
Return
EndIf
'Copy file and display progress
Try
Local buf:Byte[bufSize]
While Not in.Eof()
out.WriteBytes buf,in.Read(buf,bufSize)
pos=pos+bufsize
progress#=Float(pos)/Float(size)
DownloadFileUpdateCallback progress
Wend
Catch ex:TStreamWriteException
EndTry
'Close the streams
in.close()
out.close()
'Verify file size
If FileSize(dst)<>size
DeleteFile dst
Return
EndIf
Return True
EndIf
EndFunction
Function Round(val#)
Local dec#
dec#=val-Floor(val)
If dec<0.5 Return Floor(val) Else Return Ceil(val)
EndFunction
Function DisplayDownloadProgress(progress:Float)
UpdateProgBar progbar,progress
If PeekEvent() WaitEvent()
EndFunction
Function FileSize2:Int(url$)
If Instr(url,"http://")
url$ = url$.Replace("http://", "")
Local slashPos = url$.Find("/"), host$, file$
If slashPos <> -1
host$ = url$[..slashPos]
file$ = url$[slashPos..]
Else
Return -1
EndIf
Local stream:TStream=OpenStream("tcp::" + host$, 80)
If Not stream Then Return -1
stream.WriteLine "HEAD " + file$ + " HTTP/1.0"
stream.WriteLine "Host: " + host$
stream.WriteLine ""
While Not Eof(stream)
Local in$ = stream.ReadLine()
If in$.Find("Content-Length:") <> -1
stream.Close()
Return Int(in$[in$.Find(":") + 1..].Trim())
EndIf
Wend
stream.Close()
Return -1
Else
Return FileSize(url)
EndIf
End FunctionAnd this will automatically detect and download app updates:
Framework BRL.System
Import Pub.Win32
Import BRL.HTTPStream
Import BRL.Retro
Import BRL.Win32MaxGUI
Extern "win32"
Function FreeLibrary:Int(hlib)="FreeLibrary@4"
EndExtern
Global SERVERNAME$="www.frauleinspace.com"
Global PRODUCTNAME$="LW3D"
Global PROGBAR:TGADGET
Global BUTTON_CANCEL:TGadget
Global VERSION_MAJOR=0
Global VERSION_MINOR=0
Global VERSION_BUGFIX=0
Notify webupdate()
Function SetUpdateServer(hservername:Byte Ptr)
servername$=string.fromcstring(hservername)
MemFree hservername
EndFunction
Function SetUpdateProduct(hproductname:Byte Ptr)
productname$=string.fromcstring(hproductname)
MemFree hproductname
EndFunction
Function SetUpdateVersion(major,minor,bugfix)
VERSION_MAJOR=major
VERSION_MINOR=minor
VERSION_BUGFIX=bugfix
EndFunction
Function WebUpdate:Int()
If Not DeleteFile(CurrentDir$()+"\update.exe") Return
result=1
Local InternetAttemptConnect:Int(dwReserved:Int)
hlib=loadlibrarya("wininet.dll")
If hlib
InternetAttemptConnect=GetProcAddress(hlib,"InternetAttemptConnect")
InternetAttemptConnect(0)
freelibrary hlib
EndIf
If filesize2("http://"+SERVERNAME+"/data/"+PRODUCTNAME+"/data.ini")=-1 Return
stream:TStream=ReadFile("http::"+SERVERNAME+"/data/"+PRODUCTNAME+"/data.ini")
If Not stream Return
While Not stream.eof()
s$=stream.readline()
name$=Lower(Trim(piece(s,1,"=")))
value$=piece(s,2,"=")
value=Replace(value,Chr(34),"")
value=value.trim()
Select name
Case "latestversion"
major=Int(piece(value,1,"."))
minor=Int(piece(value,2,"."))
bugfix=Int(piece(value,3,"."))
If major>VERSION_MAJOR
update=True
ElseIf major=VERSION_MAJOR
If minor>VERSION_MINOR
update=True
ElseIf minor=VERSION_MINOR
If bugfix>VERSION_BUGFIX
update=True
Else
update=False
EndIf
Else
update=False
EndIf
Else
update=False
EndIf
Case "latestversionurl"
updateurl$=value
EndSelect
Wend
If update
result=result+2
win:TGadget=CreateWindow("",Desktop().ClientWidth()/2-160,Desktop().ClientHeight()/2-50,320,86,Null,WINDOW_HIDDEN)
hwnd=QueryGadget(win,QUERY_HWND_CLIENT)
style=getwindowlonga(hwnd,GWL_STYLE)
setwindowlonga hwnd,GWL_STYLE,style+WS_DLGFRAME
SetWindowPos hwnd, -1, 0, 0, 0, 0, 3
SetGadgetShape(win,GadgetX(win),GadgetY(win),GadgetWidth(win)+1,GadgetHeight(win)+1)
SetGadgetShape(win,GadgetX(win),GadgetY(win),GadgetWidth(win)-1,GadgetHeight(win)-1)
CreateLabel("Updating...",10,10,100,16,win)
progbar=CreateProgBar(10,10+16,win.clientwidth()-20,20,win)
BUTTON_CANCEL=CreateButton("Cancel",win.clientwidth()/2-30,win.clientheight()-26,60,24,win)
ShowGadget win
If CopyFile2(updateurl$,CurrentDir$()+"\update.exe",DisplayDownloadProgress,64)
result=result+4
Else
DeleteFile(CurrentDir$()+"\update.exe")
EndIf
HideGadget win
FreeGadget win
EndIf
Return result
EndFunction
Function DisplayDownloadProgress:Int(progress:Float)
UpdateProgBar progbar,progress
If PeekEvent()
Select WaitEvent()
Case EVENT_GADGETACTION
Select EventSource()
Case BUTTON_CANCEL
If Confirm("Cancel update?") Return True
EndSelect
EndSelect
EndIf
EndFunction
Function CopyFile2:Int(src$,dst$="",callback:Byte Ptr=Null,bufsize=4096)
url$=src
src$=Replace(src,"","/")
src=Replace(src,"://","::")
If dst="" dst=AppDir$+"/"+StripDir(src)
If callback=Null
'Just use the regular CopyFile()
Return CopyFile(src,dst)
Else
'Set up the callback function
Local DownloadFileUpdateCallback:Int(p#)
DownloadFileUpdateCallback=callback
'Get the file size
size=FileSize2(url)
If size=-1 Return
'Open streams
out:TStream=WriteFile(dst)
If Not out Return
in:TStream=ReadStream(src)
If Not in
out.close()
Return
EndIf
'Copy file and display progress
Try
Local buf:Byte[bufSize]
While Not in.Eof()
out.WriteBytes buf,in.Read(buf,bufSize)
pos=pos+bufsize
progress#=Float(pos)/Float(size)
If DownloadFileUpdateCallback(progress)
in.close()
out.close()
Return False
EndIf
Wend
Catch ex:TStreamWriteException
EndTry
'Close the streams
in.close()
out.close()
'Verify file size
If FileSize(dst)<>size
DeleteFile dst
Return
EndIf
Return True
EndIf
EndFunction
Function Piece$(s$,entry,char$=" ")
Local n
Local p
Local a$
While Instr(s,char+char)
s=Replace(s,char+char,char)
Wend
For n=1 To entry-1
p=Instr(s,char)
s=Right(s,Len(s)-p)
If Not p
If entry=n Exit Else Return
EndIf
Next
p=Instr(s,char)
If p<1
a$=s
Else
a=Left(s,p-1)
EndIf
Return a
End Function
Function FileSize2:Int(url$)
If Instr(url,"http://")
url$ = url$.Replace("http://", "")
Local slashPos = url$.Find("/"), host$, file$
If slashPos <> -1
host$ = url$[..slashPos]
file$ = url$[slashPos..]
Else
Return -1
EndIf
Local stream:TStream=OpenStream("tcp::" + host$, 80)
If Not stream Then Return -1
stream.WriteLine "HEAD " + file$ + " HTTP/1.0"
stream.WriteLine "Host: " + host$
stream.WriteLine ""
While Not Eof(stream)
Local in$ = stream.ReadLine()
If in$.Find("Content-Length:") <> -1
stream.Close()
Return Int(in$[in$.Find(":") + 1..].Trim())
EndIf
Wend
stream.Close()
Return -1
Else
Return FileSize(url)
EndIf
End Function