#include-once
; #INDEX# =======================================================================================================================
; Title .........: _SelfUpdater
; AutoIt Version: 3.0.0++
; Language:       eutsch
; Description:    Function die das eigene Script mit einer Datei aus dem Internet aktualisiert
; ===============================================================================================================================
; ------------------------------------------------------------------------------
;
; AutoIt Version: 3.0
; Language:       Deutsch
; Description:    Funktion die das eigene Script mit einer Datei aus dem Internet aktualisiert
;
; ------------------------------------------------------------------------------

; #FUNCTION# ====================================================================================================================
; Name...........: _SelfUpdater
; Description ...:  Function die das eigene Script mit einer Datei aus dem Internet aktualisiert
; Syntax.........: _SelfUpdater($upd_dlfile, $upd_autostart, $upd_title)
; Parameters ....:  $upd_dlfile			- Pfad zur aktuellen Datei, die gedownloadet werden soll
;						z.B. 				"http://12345.de/datei.txt" ohne Angabe eines Users/Passwortes
;						oder				"http://Username:Passwort@12345.de/datei.txt" mit Angabe eines Users/Passwortes
;					$upd_autostart		- 0/1 als Schalter für automatischen Restart der Anwendung nach Update
;					$upd_title			- Name der Anwendung / Titel der Download Progressbar i.d.R sollte dies der Name der Anwendung sein
; Return values .:  Erfolg:   		    = 1
;                   Fehler: @error      = 1
;					Rückgabewert:		= 0 (Es wurde keine Datei zum Downloaden angegeben oder der Pfad enthält kein "/")
;										= 2 (Download Datei hat 0 Byte Größe)
;										= 3 (akt. Datei entspr. Update-Datei -- Test erfolgt nur anhand der Größe!!!)
;										= 4 (Abbruch des Update's durch User)
;										= 5 (Download-Datei hat nicht den selben Namen wie das ausgeführte Programm selbst. Daher kann das Update sich nicht selbst überschreiben)
; Author ........: Schnuffel @ www.autoit.de
; Modified.......:
; Remarks .......: Funktion am Anfang des Scriptes ausführen, damit das Script aktualisiert wird bevor es weiter ausgeführt wird
; Remarks .......: Um Passwort geschützte Bereiche zu erreichen verwende die Syntax: http://username:password@url oder ftp://username:password@url
; Related .......: NA
; Link ..........;
; Example .......; MsgBox(0, 'Ergebnis des Updates:', _SelfUpdater("Pfad zur Downloaddatei", 0, "Titel des Upload Fensters"))
; ===============================================================================================================================
Func _SelfUpdater($upd_dlfile = "", $upd_autostart = 0, $upd_title = "", $upd_srcfile = @ScriptFullPath)
	$upd_mb_title = "Softwareupdate vorhanden für: " & $upd_title
	$upd_mb_text1 = "Für das Programm " & $upd_title & " ist ein Update verfügbar." & @CRLF & @CRLF
	$upd_mb_text2 = "Möchten Sie das Update jetzt herunterladen und installieren?"
	$upd_mb_text3 = "Das Update wird geladen"
	$upd_mb_text4 = "Das Update wird installiert"
	$upd_mb_text5 = "Bitte warten Sie..."
	$upd_mb_dl1 = "Das Softwareupdate wurde erfolgreich durchgeführt."
	$upd_mb_dl2 = "Das Softwareupdate wurde nicht erfolgreich durchgeführt."
	$upd_mb_dl3 = "Das Softwareupdate wurde abgebrochen, da die Datei nicht der heruntergeladenen entspricht." & @CRLF & @CRLF & "Bitte starten Sie die Anwendung erneut für einen Updateversuch,"
	Local $upd_namesplit, $upd_file, $upd_mb_title, $upd_mb_text1, $upd_mb_text2, $upd_dlsize, $upd_actsize, $upd_split, $upd_mb, $upd_ini, $upd_iniold, $upd_get, $upd_sb, $upd_temp, $upd_mb_dl1, $upd_mb_dl2, $upd_mb_dl3, $upd_temp = @TempDir & "\_upd\"
	If $upd_dlfile = "" Then Return SetError(1,0,0)
	If Not StringInStr($upd_dlfile,"/") Then Return SetError(1,0,0)
	$upd_namesplit = StringSplit($upd_dlfile, "/")
	$upd_file = $upd_namesplit[$upd_namesplit[0]]
	If $upd_title = "" Then
		$upd_split = StringSplit(@ScriptName, ".")
		$upd_title = $upd_split[0]
	EndIf
	If Not $upd_file = @ScriptName Then Return SetError(1,5,0)
	If FileExists($upd_temp & "upd_version.ini") Then
		$upd_iniold = IniRead($upd_temp & "upd_version.ini", "Update", "version", "0")
		If $upd_iniold = $upd_dlsize Then
			FileDelete($upd_temp & "upd_version.ini")
			DirRemove($upd_temp)
			MsgBox(262160, $upd_title, $upd_mb_dl2)
		Else
			FileDelete($upd_temp & "upd_version.ini")
			DirRemove($upd_temp)
			MsgBox(262208, $upd_title, $upd_mb_dl1)
		EndIf
	EndIf
	$upd_dlsize = InetGetSize($upd_dlfile)
	If $upd_dlsize = "0" Then Return SetError(1,0,2)
	$upd_actsize = FileGetSize($upd_srcfile)
	If $upd_dlsize = $upd_actsize Then Return SetError(1,0,3)
	$upd_mb = MsgBox(262180, $upd_mb_title, $upd_mb_text1 & $upd_mb_text2)
	If $upd_mb = 6 Then
		DirCreate($upd_temp)
		ProgressOn("Update " & $upd_title, $upd_mb_text3, $upd_mb_text5)
		Sleep(500)
		$upd_ini = IniWrite($upd_temp & "upd_version.ini", "Update", "version", $upd_actsize)
		$upd_get = InetGet($upd_dlfile, $upd_temp & $upd_file, 1, 1)
		Do
			ProgressSet(Round(InetGetInfo($upd_get, 0) / ($upd_dlsize / 100), 0), Floor(InetGetInfo($upd_get, 0) / 1024) & "kB von " & Floor($upd_dlsize / 1024) & "kB bereits geladen" & @CRLF & "Bitte warten Sie...")
			Sleep(50)
		Until InetGetInfo($upd_get, 2)
		ProgressSet(Round(InetGetInfo($upd_get, 0) / ($upd_dlsize / 100), 0), Floor($upd_dlsize / 1024) & "kB von " & Floor($upd_dlsize / 1024) & "kB bereits geladen" & @CRLF & "Bitte warten Sie...")
		Sleep(1000)
		If FileGetSize($upd_temp & $upd_file) <> $upd_dlsize Then
			ProgressOff()
			MsgBox(262160, $upd_title, $upd_mb_dl3)
			DirRemove($upd_temp)
			Return
		EndIf
		Local $upd_sb = FileOpen($upd_temp & "upd_start.bat", 2)
		ProgressSet(100, $upd_mb_text5, $upd_mb_text4)
		If $upd_autostart = 1 Then
			FileWrite($upd_sb, "ping localhost -n 3" & @CRLF & "move /Y " & '"' & "%temp%\_upd\" & $upd_file & '" "' & @ScriptDir & "\" & $upd_file & '"' & @CRLF & '"' & $upd_srcfile & '"' & @CRLF & "del " & '"' & "%temp%\_upd\upd_start.bat")
		Else
			FileWrite($upd_sb, "ping localhost -n 3" & @CRLF & "move /Y " & '"' & "%temp%\_upd\" & $upd_file & '" "' & @ScriptDir & "\" & $upd_file & '"' & @CRLF & "del " & '"' & "%temp%\_upd\upd_start.bat")
		EndIf
		Sleep(2000)
		FileClose($upd_sb)
		ProgressOff()
		Run($upd_temp & "upd_start.bat", $upd_temp, @SW_HIDE)
		Exit
	EndIf
	If $upd_mb = 7 Then
		Return SetError(1,0,4)
	EndIf
EndFunc   ;==>_SelfUpdater
