;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Funktion		_WriteInstall($SOURCEPATHES, $TARGET, $FILENAME[, $S_BAR=-1[, $LOG=-1]])
;
; Beschreibung	Erzeugt eine Installationsdatei, mit FileInstall()-Routinen
;				für alle Dateien des bzw. der Quellpfade, Optional Install-Log und
;				Progressbar für Installationsfortschritt
;
; Parameter		$SOURCEPATHES 	Pfad(e) des/der Quellordner getrennt mit "|"
;								als String - keine Macros oder Variablen
;				$TARGET 		Zielordner für Installation,
;								Macros und Variablen können verwendet werden
;				$FILENAME		Name der zu erzeugenden Datei (z.B. 'setup.au3')
;								als String - keine Macros oder Variablen
;				$S_BAR			Statusbar generieren (-1 JA, 0 NEIN) [Optional], Default -1
;				$LOG			Logdatei und Fehlercheck (-1 JA, 0 NEIN) [Optional], Default -1
;
; Autor			BugFix	( bugfix@autoit.de )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include <Array.au3>
#include <file.au3>
Func _WriteInstall($SOURCEPATHES, $TARGET, $FILENAME, $S_BAR=-1, $LOG=-1)
	Dim $QUELLPFADE, $aFILES[1], $FH = FileOpen($FILENAME,1), $PERCENT, $DIRECTORIES
	$aFILES[0] = 0
	If ($S_BAR = -1) And ($LOG = -1) Then 
		FileWrite($FH, "#include <file.au3>" & @CRLF)
		FileWrite($FH, "Dim $fehler = 0" & @CRLF)
		FileWrite($FH, 'ProgressOn("Installation", "Installationsfortschritt", "")' & @CRLF)
	ElseIf $LOG = -1 Then
		FileWrite($FH, "#include <file.au3>" & @CRLF)
	ElseIf ($S_BAR = -1) And ($LOG <> -1) Then
		FileWrite($FH, 'ProgressOn("Installation", "Installationsfortschritt", "")' & @CRLF)
	EndIf
	If StringInStr($SOURCEPATHES, "|")  Then $QUELLPFADE = StringSplit($SOURCEPATHES, "|")
	If IsArray($QUELLPFADE) Then
		For $i = 1 To $QUELLPFADE[0]
			$var = _GetFileList($QUELLPFADE[$i], "*.*")
			For $k = 1 To $var[0]
				_ArrayAdd($aFILES, $var[$k])
				$aFILES[0] += 1
			Next
		Next
	Else
		$var = _GetFileList($SOURCEPATHES, "*.*")
		If Not IsArray($var) Then
			MsgBox(16, 'Achtung', 'In ' & $SOURCEPATHES & ' sind keine Dateien vorhanden!')
			Return 0
		EndIf
		For $i = 1 To $var[0]
			_ArrayAdd($aFILES, $var[$i])
			$aFILES[0] += 1
		Next	
	EndIf
	Select
		Case ($S_BAR = -1) And ($LOG = -1)		; mit Statusbar und Log/Fehlercheck
			For $i = 1 To $aFILES[0]
				$PERCENT = Round(100/$aFILES[0]*$i)
				$DIERECTORIES = StringTrimLeft(StringLeft($aFILES[$i], StringInStr($aFILES[$i],"\",0,-1)-1 ), 2 )
				If StringRight($TARGET, 1) = "\" Then $TARGET = StringTrimRight($TARGET, 1)
				FileWrite($FH, 'ProgressSet(' & $PERCENT & ', "' & StringRight($aFILES[$i], StringLen($aFILES[$i])- StringInStr($aFILES[$i], "\",0,-1)) & '")' & @CRLF)
				If StringInStr($TARGET, "@") Then
					FileWrite($FH, 'If Not FileExists(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") Then' & @CRLF)
					FileWrite($FH, @TAB & 'If DirCreate(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") = 1 Then' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '\ = OK")' & @CRLF)
					FileWrite($FH, @TAB & 'Else' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '\ = Fehler")' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '$fehler = 1' & @CRLF)
					FileWrite($FH, @TAB & 'EndIf' & @CRLF)
					FileWrite($FH, 'EndIf' & @CRLF)
					FileWrite($FH, 'If FileInstall("' & $aFILES[$i] & '", ' & $TARGET & ' & ' & '"' & StringTrimLeft($aFILES[$i],2) & '") = 1 Then' & @CRLF)
					FileWrite($FH, @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = OK")' & @CRLF)
				Else
					FileWrite($FH, 'If Not FileExists("' & $TARGET & $DIERECTORIES & '") Then' & @CRLF)
					FileWrite($FH, @TAB & 'If DirCreate("' & $TARGET & $DIERECTORIES & '") = 1 Then' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '_FileWriteLog("' & $TARGET & $DIERECTORIES & '\ = OK")' & @CRLF)
					FileWrite($FH, @TAB & 'Else' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '_FileWriteLog("' & $TARGET & $DIERECTORIES & '\ = Fehler")' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '$fehler = 1' & @CRLF)
					FileWrite($FH, @TAB & 'EndIf' & @CRLF)
					FileWrite($FH, 'EndIf' & @CRLF)
					FileWrite($FH, 'If FileInstall("' & $aFILES[$i] & '", "' & $TARGET & StringTrimLeft($aFILES[$i],2) & '") = 1 Then' & @CRLF)
					FileWrite($FH, @TAB & '_FileWriteLog("' & $TARGET & '\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = OK")' & @CRLF)
				EndIf
				FileWrite($FH, 'Else' & @CRLF)
				If StringInStr($TARGET, "@") Then
					FileWrite($FH, @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = Fehler")' & @CRLF)
				Else
					FileWrite($FH, @TAB & '_FileWriteLog("' & $TARGET & '\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = Fehler")' & @CRLF)
				EndIf
				FileWrite($FH, @TAB & '$fehler = 1' & @CRLF)
				FileWrite($FH, 'EndIf' & @CRLF)
			Next
			FileWrite($FH, 'If $fehler = 1 Then' & @CRLF)
			If StringInStr($TARGET, "@") Then
				FileWrite($FH, @TAB & 'ProgressSet( 100, "s. ' & $TARGET & ' & ' & '\Install.log", "Installation fehlerhaft!")' & @CRLF)
			Else
				FileWrite($FH, @TAB & 'ProgressSet( 100, "s. ' & $TARGET & '\Install.log", "Installation fehlerhaft!")' & @CRLF)
			EndIf
			FileWrite($FH, 'Else' & @CRLF)
			FileWrite($FH, @TAB & 'ProgressSet( 100, "Beendet", "Installation erfolgreich!")' & @CRLF)
			FileWrite($FH, 'EndIf' & @CRLF)
			FileWrite($FH, 'Sleep(3000)' & @CRLF)
			FileWrite($FH, 'ProgressOff()' & @CRLF)
		Case ($S_BAR = -1) And ($LOG <> -1)		; mit Statusbar, ohne Log/Fehlercheck
			For $i = 1 To $aFILES[0]
				$PERCENT = Round(100/$aFILES[0]*$i)
				$DIERECTORIES = StringTrimLeft(StringLeft($aFILES[$i], StringInStr($aFILES[$i],"\",0,-1)-1 ), 2 )
				If StringRight($TARGET, 1) = "\" Then $TARGET = StringTrimRight($TARGET, 1)
				FileWrite($FH, 'ProgressSet(' & $PERCENT & ', "' & StringRight($aFILES[$i], StringLen($aFILES[$i])- StringInStr($aFILES[$i], "\",0,-1)) & '")' & @CRLF)
				If StringInStr($TARGET, "@") Then
					FileWrite($FH, 'If Not FileExists(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") Then' & @CRLF)
					FileWrite($FH, @TAB & 'DirCreate(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '")' & @CRLF)
					FileWrite($FH, 'EndIf' & @CRLF)
					FileWrite($FH, 'FileInstall("' & $aFILES[$i] & '", ' & $TARGET & ' & ' & '"' & StringTrimLeft($aFILES[$i],2) & '")' & @CRLF)
				Else
					FileWrite($FH, 'If Not FileExists("' & $TARGET & $DIERECTORIES & '") Then' & @CRLF)
					FileWrite($FH, @TAB & 'DirCreate("' & $TARGET & $DIERECTORIES & '")' & @CRLF)
					FileWrite($FH, 'EndIf' & @CRLF)
					FileWrite($FH, 'FileInstall("' & $aFILES[$i] & '", "' & $TARGET & StringTrimLeft($aFILES[$i],2) & '")' & @CRLF)
				EndIf
			Next
			FileWrite($FH, 'ProgressSet( 100, "", "Installation abgeschlossen!")' & @CRLF)
			FileWrite($FH, 'Sleep(3000)' & @CRLF)
			FileWrite($FH, 'ProgressOff()' & @CRLF)	
		Case ($S_BAR <> -1) And ($LOG = -1)		; ohne Statusbar, mit Log/Fehlercheck
			For $i = 1 To $aFILES[0]
				$DIERECTORIES = StringTrimLeft(StringLeft($aFILES[$i], StringInStr($aFILES[$i],"\",0,-1)-1 ), 2 )
				If StringRight($TARGET, 1) = "\" Then $TARGET = StringTrimRight($TARGET, 1)
				If StringInStr($TARGET, "@") Then
					FileWrite($FH, 'If Not FileExists(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") Then' & @CRLF)
					FileWrite($FH, @TAB & 'If DirCreate(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") = 1 Then' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '\ = OK")' & @CRLF)
					FileWrite($FH, @TAB & 'Else' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '\ = Fehler")' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '$fehler = 1' & @CRLF)
					FileWrite($FH, @TAB & 'EndIf' & @CRLF)
					FileWrite($FH, 'EndIf' & @CRLF)
					FileWrite($FH, 'If FileInstall("' & $aFILES[$i] & '", ' & $TARGET & ' & ' & '"' & StringTrimLeft($aFILES[$i],2) & '") = 1 Then' & @CRLF)
					FileWrite($FH, @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = OK")' & @CRLF)
				Else
					FileWrite($FH, 'If Not FileExists("' & $TARGET & $DIERECTORIES & '") Then' & @CRLF)
					FileWrite($FH, @TAB & 'If DirCreate("' & $TARGET & $DIERECTORIES & '") = 1 Then' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '_FileWriteLog("' & $TARGET & $DIERECTORIES & '\ = OK")' & @CRLF)
					FileWrite($FH, @TAB & 'Else' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '_FileWriteLog("' & $TARGET & $DIERECTORIES & '\ = Fehler")' & @CRLF)
					FileWrite($FH, @TAB & @TAB & '$fehler = 1' & @CRLF)
					FileWrite($FH, @TAB & 'EndIf' & @CRLF)
					FileWrite($FH, 'If FileInstall("' & $aFILES[$i] & '", "' & $TARGET & StringTrimLeft($aFILES[$i],2) & '") = 1 Then' & @CRLF)
					FileWrite($FH, @TAB & '_FileWriteLog("' & $TARGET & '\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = OK")' & @CRLF)
				EndIf	
				FileWrite($FH, 'Else' & @CRLF)
				If StringInStr($TARGET, "@") Then
					FileWrite($FH, @TAB & '_FileWriteLog(' & $TARGET & ' & ' & '"\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = Fehler")' & @CRLF)
				Else
					FileWrite($FH, @TAB & '_FileWriteLog("' & $TARGET & '\Install.log", "' & StringTrimLeft($aFILES[$i],2) & ' = Fehler")' & @CRLF)
				EndIf
				FileWrite($FH, @TAB & '$fehler = 1' & @CRLF)
				FileWrite($FH, 'EndIf' & @CRLF)
			Next			
		Case ($S_BAR <> -1) And ($LOG <> -1)	; ohne Statusbar, ohne Log/Fehlercheck
			For $i = 1 To $aFILES[0]
				$DIERECTORIES = StringTrimLeft(StringLeft($aFILES[$i], StringInStr($aFILES[$i],"\",0,-1)-1 ), 2 )
				If StringRight($TARGET, 1) = "\" Then $TARGET = StringTrimRight($TARGET, 1)
				If StringInStr($TARGET, "@") Then
					FileWrite($FH, 'If Not FileExists(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '") Then' & @CRLF)
					FileWrite($FH, @TAB & 'DirCreate(' & $TARGET & ' & ' & '"' & $DIERECTORIES & '")' & @CRLF)
					FileWrite($FH, 'EndIf' & @CRLF)
					FileWrite($FH, 'FileInstall("' & $aFILES[$i] & '", ' & $TARGET & ' & ' & '"' & StringTrimLeft($aFILES[$i],2) & '")' & @CRLF)
				Else
					FileWrite($FH, 'If Not FileExists("' & $TARGET & $DIERECTORIES & '") Then' & @CRLF)
					FileWrite($FH, @TAB & 'DirCreate("' & $TARGET & $DIERECTORIES & '")' & @CRLF)
					FileWrite($FH, 'EndIf' & @CRLF)
					FileWrite($FH, 'FileInstall("' & $aFILES[$i] & '", "' & $TARGET & StringTrimLeft($aFILES[$i],2) & '")' & @CRLF)
				EndIf
			Next
	EndSelect
	FileClose($FH)
EndFunc	;==>_WriteInstall


;********************************************************************************
; AutoIt Version: 3.0
; Language:       English
; Platform:       Win9x/NT/XP
; Author:         jos van der Zande
;
; Find files in directory and subdirectories and return it in an Array, all coded in Autoit3
;
; _GetFileList($DIR, $FILEMASK, 1)	; _GetFileList($DIR, $FILEMASK [, Flag])  Flag GetFile(Default) = 0 , GetDirOnly = 1
;********************************************************************************
;Recursive search for filemask
;********************************************************************************

Func _GetFileList($T_DIR,$T_MASK,$DIR_ONLY=0)
   Dim $N_DIRNAMES[200000] ; max number of directories that can be scanned
   Local $N_DIRCOUNT = 0
   Local $N_FILE
   Local $N_SEARCH
   Local $N_TFILE
   Local $N_OFILE
   Local $T_FILENAMES
   Local $T_FILECOUNT
   Local $T_DIRCOUNT = 1
   Local $FILEMASK
   ; check Filemask \ for empty File-Array by GetDirOnly
   If $FILEMASK = "n" Then $FILEMASK = "*.no"
   ; remove the end \ If specified
   If StringRight($T_DIR,1) = "\" Then $T_DIR = StringTrimRight($T_DIR,1)
   $N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
   ; Exit if base dir doesn't exists
   If Not FileExists($T_DIR) Then Return 0
   ; keep on looping until all directories are scanned
   While $T_DIRCOUNT > $N_DIRCOUNT
      $N_DIRCOUNT = $N_DIRCOUNT + 1
      ; find all subdirs in this directory and save them in a array
      $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*") 
      While 1
         $N_FILE = FileFindNextFile($N_SEARCH)
         If @error Then ExitLoop
         ; skip these references
         If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
         $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
         ; if Directory than add to the list of directories to be processed
         If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 Then
            $T_DIRCOUNT = $T_DIRCOUNT + 1
            $N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
         EndIf
	  Wend
      FileClose($N_SEARCH)      ; find all Files that mtach the MASK
      $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\" & $T_MASK ) 
      If $N_SEARCH = -1 Then ContinueLoop
      While 1
         $N_FILE = FileFindNextFile($N_SEARCH)
         If @error Then ExitLoop
         ; skip these references
         If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
         $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
         ; if Directory than add to the list of directories to be processed
         If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0 Then
            $T_FILENAMES  = $T_FILENAMES & $N_TFILE & @CR
            $T_FILECOUNT = $T_FILECOUNT + 1
            ;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
         EndIf
      Wend
      FileClose($N_SEARCH)
    Wend
    If $DIR_ONLY = 0 Then
	  $T_FILENAMES  = StringTrimRight($T_FILENAMES,1)
	  $N_OFILE = StringSplit($T_FILENAMES,@CR)
      Return( $N_OFILE )
    Else
	  ReDim $N_DIRNAMES[$N_DIRCOUNT+1]
	  $N_DIRNAMES[0] = $N_DIRCOUNT
	  Return $N_DIRNAMES
    EndIf
EndFunc   ;==>_GetFileList