#include <Array.au3>
#include <FTPEx.au3>
#include <GUIConstants.au3>
#include-once

#cs
	----------------------------------------------------------------------------------------------------------------------------------

	_Update
	=======

	Beschreibung:
	-------------
	Eine Funktion um das Script automatisch zu aktualisieren.
	Verwendet einen FTP-Server zum Download neuer Versionen.


	Version:
	--------
	1.0


	Autor:
	------
	Shadowigor


	Parameter:
	----------
	$sServerName 	 = 	Name des FTP-Servers
	$sUserName 		 = 	Username
	$sPassword 		 = 	Passwort
	$iCurrentVersion = 	Aktuelle Version des Programmes. Muss eine Zahl sein. (Siehe Bemerkungen)
	$sFileName		 = 	Vorangehender Dateiname. (Siehe Bemerkungen)
	[$sDir] 		 = 	Dateipfad zum FTP-Ordner in dem sich die Versionen befinden.
	[$fStartAfter]	 =	Wenn True, wird das Programm nach erfolgreicher Aktualisierung gestartet.
	[$sDatatype]	 =	Datentyp (Standartmässig '.exe')


	Rückgabewerte:
	--------------
	Erfolg ---> Neue Version (Wenn der User aktualisiert hat)
				1 (Wenn der User nicht aktualisiert hat oder keine neuere Version vorliegt)

	Fehler --->	@error 	  = 1

				@extended =	1 (Fehler bei öffnen des FTP-Services)
							2 (Fehler beim verbinden)
							3 (Ordnerpfad existiert nicht)
							4 (Fehler bei der Versionsüberprüfung)
							5 (Fehler beim herunterladen einer neuen Version)


	Bemerkungen:
	------------
	Die Version muss eine Zahl sein, kein String.
	$sFilename ist der Dateiname vor der Version.
	Bsp.: Die Datei der neuen Version heisst 'MeinProg v2.1.exe'.
	In diesem Fall wäre $sFilename = 'MeinProg v' und $iCurrentVersion = '2.0'(z.B.).

	Beispiel:
	---------
	_Update("ftp.'server'.com", "Username", "Passwort", 1.0, "/Scripts", "MeinScript v", False, ".au3")

	----------------------------------------------------------------------------------------------------------------------------------
#ce

Func _Update($sServerName, $sUserName, $sPassword, $iCurrentVersion, $sFileName, $sDir = "", $fStartAfter = True, $sDatatype = ".exe")

	Local $aFileListNEW[1], $iFileNameLen = StringLen($sFileName), $hFTP_Open, $hFTP, $aFileListOLD[1], $i, $hGUI_UPDATE, $idBtnJA_UPDATE, $idBtnNEIN_UPDATE, $iNewestVersion

	$hFTP_Open = _FTP_Open("UPDATE")
	If @error Then Return SetError(1, 1)
	$hFTP = _FTP_Connect($hFTP_Open, $sServerName, $sUserName, $sPassword)
	If @error Then Return SetError(1, 2)
	If $sDir <> "" Then _FTP_DirSetCurrent($hFTP, $sDir)
	If @error Then Return SetError(1, 3)
	$aFileListOLD = _Ftp_ListToArray($hFTP)
	For $i = 0 To $aFileListOLD[0]
		If StringLeft($aFileListOLD[$i], $iFileNameLen) = $sFileName Then _ArrayAdd($aFileListNEW, StringTrimRight(StringTrimLeft($aFileListOLD[$i], $iFileNameLen), 4))
	Next
	$iNewestVersion = _ArrayMax($aFileListNEW)
	If @error Then Return SetError(1, 4)
	If $iNewestVersion <= $iCurrentVersion Then Return 1

	$hGUI_UPDATE = GUICreate("Neue Version verfügbar!", 300, 200)
	GUISetBkColor(0xF7F6F9, $hGUI_UPDATE)
	$idLbl = GUICtrlCreateLabel("Es ist eine neue Version ihrer Software verfügbar!" & @CRLF & @CRLF & "Möchten Sie sie jetzt aktualisieren?", 5, 5, 300, 300)
	GUICtrlSetFont($idLbl, 12)
	$idBtnJA_UPDATE = GUICtrlCreateButton("Ja", 50, 160, 50, 20)
	$idBtnNEIN_UPDATE = GUICtrlCreateButton("Nein", 170, 160, 50, 20)
	GUISetState(@SW_SHOW)

	While 1
		Switch GUIGetMsg()

			Case $idBtnJA_UPDATE
				_FTP_FileGet($hFTP, $sFileName & $iNewestVersion & $sDatatype, @ScriptDir & "\" & $sFileName & $iNewestVersion & $sDatatype)
				If @error Then Return SetError(1, 5)
				_FTP_Close($hFTP)
				If $fStartAfter Then ShellExecute(@ScriptDir & "\" & $sFileName & $iNewestVersion & $sDatatype)
				Return $iNewestVersion

			Case $idBtnNEIN_UPDATE
				GUIDelete($hGUI_UPDATE)
				_FTP_Close($hFTP)
				Return 1

			Case $GUI_EVENT_CLOSE
				GUIDelete($hGUI_UPDATE)
				_FTP_Close($hFTP)
				Return 1

		EndSwitch
	WEnd

EndFunc   ;==>_Update