#include-once
#include <FTPEx.au3>
#include <Array.au3>

;===============================================================================
; Function Name:	_getAllFTPFilesRekursiv($l_FTPSession, $sRemote = "", $sLocal = @TempDir, $iMaxDepth, $iDebug = 0, $idPrgKB = 0, $idLblKB = 0, $idLblKBPer = 0, $idPrgFile = 0, $idLblFile = 0, $idLblFilePer = 0, $idLblColapsed = 0, $idLblKBperSec = 0, $idLblLog = 0)
; Description::		lädt einen bestimmten Ordner inkl. aller Unterverzeichnisse herunter
; Parameter(s):   	$l_FTPSession	das von _FTP_Connect zurückgegebene Handle		Angabe ist Pflicht
;					$sRemote		der FTP-Ordner der heruntergeladen werden soll	optionale Angabe Leer=Rootverzeichnis
;					$sLocal			der loakle Ordner in dem die Dateien			optionale Angabe Leer=@TempDir
;									gespeichert werden sollen, die Unter-
;									verzeichnisse werden angelegt
;									siehe dazu _createLocalDirIfNecessary
;					$iMaxDepth		maximale Rekursionstiefe
;										<1 = unendlich als Degault eingestellt	optionale Angabe
;					$iDebug	sollen Debuginfos in der Scitekosole angezeigt werden?	optionale Angabe
;									Default = 	0 = keine DebugInfos,
;									1 = Debubinfos anzeigen
;									2 = DebugInfos und ArrayDisplays
;						*** folgende opt. Parameter erleichtern die Sarstellung in einer GUI 	***
;						*** sie sind alle mit 0 vorbelegt, d.h. kein GUI-Control wird upgedatet ***
;					$idPrgKB		ControldID der Progressbar (Dateigrösse)		optionale Angabe
;					$idLblKB		" des Labels (anhand der Dateigrösse)			optionale Angabe
;					$idLblKBPer		" des Labels für Prozent (Dateigrösse)			optionale Angabe
;					$idPrgFile		ControldID der Progressbar (Dateianzahl)		optionale Angabe
;					$idLblFile		" des Labels (anhand der Dateianzahl)			optionale Angabe
;					$idLblFilePer	" des Labels für Prozent (Dateianzahl)			optionale Angabe
;					$idLblColapsed	" des Labes für benötigte Zeit					optionale Angabe
;					$idLblKBperSec	" des Labels für erreichte KB/sec				optionale Angabe
;					$idLblLog		" des Edits Logübersicht						optionale Angabe
; Autor(s):			AutoBert (www.autoit.de)
;					zur freien Benutzung in eigenen Skripten und auch zur freien Weitergabe unter der Vorgabe,
;					dass diese Funktionsbeschreibumg inkl. Autor nicht enfernt wird
;===============================================================================
Func _getAllFTPFilesRekursiv($l_FTPSession, $sRemote = "", $sLocal = @TempDir, $iMaxDepth=-1, $iDebug = 0, $idPrgKB = 0, $idLblKB = 0, $idLblKBPer = 0, $idPrgFile = 0, $idLblFile = 0, $idLblFilePer = 0, $idLblColapsed = 0, $idLblKBperSec = 0, $idLblLog = 0)
	Local $aResult[1][2]
	Local $errGet
	Local $s_LocalFile
	Local $iKBPer, $iFilePer, $iKB_Already, $iStart, $iSec, $sMsg, $sLog
	ToolTip('Searching for files to download, please wait...') ;kann auskommentiert werden

	If $idLblColapsed <> 0 Or $idLblKBperSec <> 0 Then $iStart = TimerInit()
	_FTP_FileList_Rekursiv2D($l_FTPSession, $aResult, $sRemote, False, $iMaxDepth, $iDebug)
	ToolTip('Downloading, please wait...') ;kann auskommentiert werden
	For $i = 1 To $aResult[0][0]
		$s_LocalFile = $sLocal & "\" & StringTrimLeft($aResult[$i][0], 1)
		$s_LocalFile = StringReplace($s_LocalFile, "/", "\")
		_createLocalDirIfNecessary($s_LocalFile)
		If $iDebug Then ConsoleWrite("Download: " & $i & "/" & $aResult[0][0] & " :" & $aResult[$i][0] & @TAB)
		If $idLblLog <> 0 Then $sLog = "Download: " & $i & "/" & $aResult[0][0] & " :" & $aResult[$i][0] & @TAB
		If $idLblFile <> 0 Then GUICtrlSetData($idLblFile, $aResult[$i][0] & @TAB & $i & "/" & $aResult[0][0])
		If _FTP_FileGet($l_FTPSession, $aResult[$i][0], $s_LocalFile) Then;,"_UpdateProgress") Then
			$errGet = @error
			If $iDebug Then ConsoleWrite("erfolgreich ")
			If $idLblLog <> 0 Then $sLog &= "erfolgreich "
			$iKB_Already += $aResult[$i][1]
		Else
			If $iDebug Then ConsoleWrite("fehlgeschlagen ")
			If $idLblLog <> 0 Then $sLog &= "fehlgeschlagen "
			If _FTP_DirSetCurrent($l_FTPSession, $aResult[$i][0]) Then
				If $iDebug Then ConsoleWrite(" da ein Mountpoint ")
				If $idLblLog <> 0 Then $sLog &= " da ein Mountpoint "
				$aResult[0][1] -= $aResult[$i][1] ;kein Fehler daher von Gesamtsumme abziehen
			EndIf
		EndIf
		If $iDebug Then ConsoleWrite($errGet & @CRLF)
		If $idLblLog <> 0 Then
			$sLog &= @CRLF
			GUICtrlSetData($idLblLog, GUICtrlRead($idLblLog) & $sLog)
		EndIf
		If $idPrgFile <> 0 Or $idLblFilePer <> 0 Then ;Prozente anhand Dateianzahl errechnen und anzeigen
			$iFilePer = Int($i / $aResult[0][0] * 100)
			If $idPrgFile <> 0 Then GUICtrlSetData($idPrgFile, $iFilePer)
			If $idLblFilePer <> 0 Then GUICtrlSetData($idLblFilePer, $iFilePer & "%")
		EndIf
		If $idPrgKB <> 0 Or $idLblKBPer <> 0 Then ;Prozente anhand Grösse errechnen und anzeigen
			$iKBPer = Int($iKB_Already / $aResult[0][1] * 100)
			If $idPrgKB <> 0 Then GUICtrlSetData($idPrgKB, $iKBPer)
			If $idLblKBPer <> 0 Then GUICtrlSetData($idLblKBPer, $iKBPer & "%")
		EndIf
		If $idLblKB <> 0 Then GUICtrlSetData($idLblKB, $iKB_Already & @TAB & "/" & $aResult[0][1])
		;If $iDebug Then ConsoleWrite(@CRLF)
	Next
	If $idLblColapsed <> 0 Or $idLblKBperSec <> 0 Then
		$iSec = TimerDiff($iStart) / 1000
		If $idLblKBperSec <> 0 Then GUICtrlSetData($idLblKBperSec, Round($iKB_Already / 1024 / $iSec, 2) & "KB/sec")
		If $idLblColapsed <> 0 Then
			Local $iMin = Int($iSec / 60), $iHour
			If $iMin > 0 Then
				$iSec -= $iMin * 60
				$iHour = Int($iMin / 60)
				If $iHour > 0 Then
					$iMin -= $iHour * 60
					$sMsg = StringFormat("%02d:%02d Stunden", $iHour, $iMin, $iSec)
				Else
					$sMsg = StringFormat("%02d:%02d Minuten", $iMin, $iSec)
				EndIf
			Else
				If $iSec > 0 Then $sMsg = StringFormat("%02d Sekunden", $iSec)
			EndIf
			GUICtrlSetData($idLblColapsed, "benötigt: " & $sMsg)
		EndIf
	EndIf
	ToolTip('') ;kann auskommentiert werden
EndFunc   ;==>_getAllFTPFilesRekursiv


;===============================================================================
; Function Name:	_createLocalDirIfNecessary($s_LocalFile)
; Description::		prüft ob für eine Datei die lokale Verzeichnisstruktur besteht, falls nötig wird diese angelegt
; Parameter(s):		$s_LocalFile	Dateuname für den die Verzeichnisstruktur geprüft werden soll
; Autor(s):			AutoBert (www.autoit.de)
;					zur freien Benutzung in eigenen Skripten und auch zur freien Weitergabe unter der Vorgabe,
;					dass diese Funktionsbeschreibumg inkl. Autor nicht enfernt wird
;===============================================================================
Func _createLocalDirIfNecessary($s_LocalFile)
	Local $aLocalPath = StringSplit($s_LocalFile, "\") ;hier lokale Pfad erstellen falls notwendig
	Local $sLocalPath = ""
	For $j = 1 To $aLocalPath[0] - 1
		$sLocalPath &= $aLocalPath[$j] & "\"
		If Not FileExists($sLocalPath) And Not StringInStr($aLocalPath[$j], ":") Then
			;ConsoleWrite($sLocalPath & @CRLF)
			DirCreate($sLocalPath)
		EndIf
	Next
EndFunc   ;==>_createLocalDirIfNecessary

;===============================================================================
; Function Name:  	_FTP_FileList_Rekursiv2D($l_FTPSession, $aResult, $sPath, $bFolders=False, $iMaxDepth=-1, $iDebug=0)
; Description::   	füllt ein Array mit Dateien (und Verzeichnissen wenn $bFolders true) des FTP-Pfades inkl. aller Unterverzeichnisse
; Parameter(s):   	$l_FTPSession	das von _FTP_Connect zurückgegebene Handle
;					$aResult   = das Array in dem die Ergebnisse eingefügt werden
;					$sPath     = Verzeichnispfad, der eingefügt werden soll
;					$bFolders    = True = auch Verzeichnisse einfügen, False = nur Dateien, Default = nur Dateien
;					$iMaxDepth		maximale Rekursionstiefe
;										<1 = unendlich als Degault eingestellt	optionale Angabe
;					$iDebug	sollen Debuginfos in der Scitekosole angezeigt werden?
;									Default = 	0 = keine DebugInfos,
;									1 = Debubinfos anzeigen
;									2 = DebugInfos und ArrayDisplays
; Autor(s):			AutoBert (www.autoit.de)
;					zur freien Benutzung in eigenen Skripten und auch zur freien Weitergabe unter der Vorgabe,
;					dass diese Funktionsbeschreibumg inkl. Autor nicht enfernt wird
;
;					Achtung benötugt bugfreie Version von FTPEx.au3 (3.3.6.1)
;===============================================================================
Func _FTP_FileList_Rekursiv2D($l_FTPSession, ByRef $aResult, $sPath, $bFolders = False, $iMaxDepth=-1, $iDebug = 0)
	Local $aTmp[1] ;das Array das für _FTP_FileList_Rekursiv benötigt wird
	Local $aSplit
	_FTP_FileList_Rekursiv($l_FTPSession, $aTmp, $sPath, $bFolders, $iMaxDepth, $iDebug, True)
	If $iDebug = 2 Then _ArrayDisplay($aTmp) ;kann auskommentiert werden
	If IsArray($aTmp) Then
		$aTmp[0] = UBound($aTmp) - 1
		ReDim $aResult[$aTmp[0] + 1][2]
		$aResult[0][0] = $aTmp[0]
		For $i = 1 To $aResult[0][0]
			$aSplit = StringSplit($aTmp[$i], "|")
			$aResult[$i][0] = $aSplit[1]
			If $aSplit[0] > 1 Then
				$aResult[$i][1] = $aSplit[2]
				$aResult[0][1] += $aSplit[2]
			EndIf
		Next
	EndIf
	If $iDebug = 2 Then _ArrayDisplay($aResult) ;kann auskommentiert werden
EndFunc   ;==>_FTP_FileList_Rekursiv2D

;===============================================================================
; Function Name:  	_FTP_FileList_Rekursiv($l_FTPSession, $aResult, $sPath, $bFolders=False,$iDebug=0,§b2D=False)
; Description::   	füllt ein Array mit Dateien (und Verzeichnissen wenn $bFolders true) des FTP-Pfades inkl. aller Unterverzeichnisse
; Parameter(s):   	$l_FTPSession	das von _FTP_Connect zurückgegebene Handle
;					$aResult   = das Array in dem die Ergebnisse eingefügt werden
;					$sPath     = Verzeichnispfad, der eingefügt werden soll
;					$bFolders    = True = auch Verzeichnisse einfügen, False = nur Dateien, Default = nur Dateien
;					$iMaxDepth	= <1 = Rekursion bis zum letzten Ästchen, jede andere Zahl stellt die max. Rekursionstiefe ein
;					$iDebug	sollen Debuginfos in der Scitekosole angezeigt werden? Default = 0 = keine, 1=mit, 2)mit + Arraydisplay
;					$b2D als Vorbereutung für _FTP_FileList_Rekursiv2D Default=False
;						wird nur benötigt wenn von _FTP_FileList_Rekursiv2D aufgerufen daher nicht selbst setzen
;					$iDepth für internen Gebrauch daher nicht selbst setzen
; Autor(s):			AutoBert (www.autoit.de)
;					zur freien Benutzung in eigenen Skripten und auch zur freien Weitergabe unter der Vorgabe,
;					dass diese Funktionsbeschreibumg inkl. Autor nicht enfernt wird
;
;					Achtung benötugt bugfreie Version von FTPEx.au3 (3.3.6.1)
;===============================================================================
Func _FTP_FileList_Rekursiv($l_FTPSession, ByRef $aResult, $sPath, $bFolders = False, $iMaxDepth=-1, $iDebug = 0, $b2D = False, $iDepth=0)
	Local $aFiles, $aFolders
	If $sPath = "/" Then $sPath = ""
	If $iDebug Then ConsoleWrite($sPath & @TAB & $iDepth & '/' & $iMaxDepth & @CRLF)
	If $iMaxDepth > 0 Then
		If $iDepth > $iMaxDepth Then Return
	EndIf
			$iDepth += 1
	If $sPath <> "" Then
		_FTP_DirSetCurrent($l_FTPSession, $sPath)
		If @error Then
			If $iDebug Then ConsoleWrite("Remoteverzeichnis: " & $sPath & " existiert nicht!")
			Return
		Else
			$sPath = _FTP_DirGetCurrent($l_FTPSession)
		EndIf
	EndIf
	$aFiles = _Ftp_ListToArray2D($l_FTPSession, 2)
	If IsArray($aFiles) Then
		If $iDebug = 2 Then _ArrayDisplay($aFiles)
		If $aFiles[0][0] > 0 Then
			For $i = 1 To $aFiles[0][0]
				If $b2D Then
					_ArrayAdd($aResult, $sPath & "/" & $aFiles[$i][0] & "|" & $aFiles[$i][1])
					If $iDebug Then ConsoleWrite("File: " & $sPath & "/" & $aFiles[$i][0] & "|" & $aFiles[$i][1] & @CRLF)
				Else
					_ArrayAdd($aResult, $sPath & "/" & $aFiles[$i][0])
					If $iDebug Then ConsoleWrite("File: " & $sPath & "/" & $aFiles[$i][0] & @CRLF)
				EndIf
			Next
		EndIf
	EndIf
	$aFolders = _Ftp_ListToArray2D($l_FTPSession, 1)
	If $iDebug = 2 Then _ArrayDisplay($aFolders)
	If IsArray($aFolders) Then
		If $aFolders[0][0] > 0 Then
			For $i = 1 To $aFolders[0][0]
				If $aFolders[$i][0] <> '.' And $aFolders[$i][0] <> '..' Then
					If $iDebug Then ConsoleWrite("Folder: " & $sPath & "/" & $aFolders[$i][0] & "|" & $aFolders[$i][1] & @CRLF)
					If $bFolders Then _ArrayAdd($aResult, $sPath & "/" & $aFolders[$i][0] & "|" & $aFolders[$i][1])
					_FTP_FileList_Rekursiv($l_FTPSession, $aResult, $sPath & "/" & $aFolders[$i][0], $bFolders, $iMaxDepth, $iDebug, $b2D,$iDepth)
				EndIf
			Next
		EndIf
	EndIf
EndFunc   ;==>_FTP_FileList_Rekursiv
