#include <File.au3>
#include <Array.au3>

; #FUNCTION# ;===============================================================================
;
; Name...........: _Plugininsert
; Description ...: Add Plugin to Plugin-ini
; AutoIt Version : V3.3.6.1
; Syntax.........: _Plugininsert($Pluginvar [, $Plugincat = "Standard"])
; Parameters ....: $Pluginvar - The variables the script needs
;                  $Plugincat - Optional: (Default = "Standard") : Plugin category
; Return values .: Success - Returns : 1
;                  Failure - Returns 0 and Sets @Error:
;                  |0 - No error.
;				   |1 - already registered
; Author ........: chip
;
; ;==========================================================================================
Func _Plugininsert($Pluginvar, $Plugincat = "Standard")
	Local $check = IniRead(@ScriptDir & "\plugins.ini", $Plugincat, @ScriptName, "0")
	If $check == 0 Then
		IniWrite(@ScriptDir & "\plugins.ini", $Plugincat, @ScriptName, $Pluginvar)
		Return 1
	EndIf
	SetError(1)
	Return 0
EndFunc   ;==>_Plugininsert


; #FUNCTION# ;===============================================================================
;
; Name...........: _Plugininizial
; Description ...: Plugin initialize
; AutoIt Version : V3.3.6.1
; Syntax.........: _Plugininizial([$Plugincat = "all" [,$Plugindir = "\plugins"])
; Parameters ....: $Plugincat - Optional: (Default = "all") : Plugin category
;                  $Plugindir - Optional: (Default = "\plugins") : Plugin directory
; Return values .: Success - Returns : Plugin array
;                  Failure - Returns 0 and Sets @Error:
;                  |0 - No error.
;				   |1 - no Plugins registered
; Author ........: chip
;
; ;==========================================================================================
Func _Plugininizial($Plugincat = "all", $Plugindir = "\plugins")
	If $Plugincat == "all" Then
		Local $sectionnames = IniReadSectionNames(@ScriptDir & $Plugindir & "\plugins.ini")
		If @error Then
			SetError(1)
			Return 0
		EndIf

		Local $check[1][2]
		$check[0][0] = 0

		For $i = 1 To $sectionnames[0] Step 1
			Local $sectionitems = IniReadSection(@ScriptDir & $Plugindir & "\plugins.ini", $sectionnames[$i])
			If Not @error Then
				For $b = 1 To $sectionitems[0][0] Step 1
					Local $arrayid = UBound($check)
					ReDim $check[$arrayid + 1][2]
					$check[0][0] = $check[0][0] + 1
					$check[$arrayid][0] = $sectionitems[$b][0]
					$check[$arrayid][1] = $sectionitems[$b][1]
				Next
			EndIf
		Next
	Else
		Local $check = IniReadSection(@ScriptDir & $Plugindir & "\plugins.ini", $Plugincat)
		If @error Then
			SetError(1)
			Return 0
		EndIf
	EndIf
	Return $check
EndFunc   ;==>_Plugininizial


; #FUNCTION# ;===============================================================================
;
; Name...........: _Plugincheck
; Description ...: check the plugins
; AutoIt Version : V3.3.6.1
; Syntax.........: _Plugincheck([$Plugindir = "\plugins"])
; Parameters ....: $Plugindir - Optional: (Default = "\plugins") : Plugin directory
; Return values .: Success - Returns : 1
;                  Failure - Returns 0 and Sets @Error:
;                  |0 - No error.
; Author ........: chip
;
; ;==========================================================================================
Func _Plugincheck($Plugindir = "\plugins")
	If Not FileExists(@ScriptDir & $Plugindir & "\plugins.ini") Then
		IniWrite(@ScriptDir & $Plugindir & "\plugins.ini", "Standard", "dummy", "dummy")
	EndIf

	Local $files = _FileListToArray(@ScriptDir & $Plugindir, "*.exe", 1)
	Local $sectionnames = IniReadSectionNames(@ScriptDir & $Plugindir & "\plugins.ini")

	For $i = 1 To $sectionnames[0] Step 1
		Local $sectionitems = IniReadSection(@ScriptDir & $Plugindir & "\plugins.ini", $sectionnames[$i])
		If Not @error Then
			For $b = 1 To $sectionitems[0][0] Step 1
				If Not FileExists(@ScriptDir & $Plugindir & "\" & $sectionitems[$b][0]) Then
					IniDelete(@ScriptDir & $Plugindir & "\plugins.ini", $sectionnames[$i], $sectionitems[$b][0])
				EndIf

				Local $fileid = _ArraySearch($files, $sectionitems[$b][0])
				If $fileid > 0 Then
					_ArrayDelete($files, $fileid)
				EndIf
			Next
		EndIf
	Next

	If UBound($files) > 1 Then
		For $i = 1 To $files[0] Step 1
			Run(@ScriptDir & $Plugindir & "\" & $files[$i])
		Next
	EndIf

	Return 1
EndFunc   ;==>_Plugincheck




; #FUNCTION# ;===============================================================================
;
; Name...........: _Pluginstart
; Description ...: starts a plugin
; AutoIt Version : V3.3.6.1
; Syntax.........: _Pluginstart($Pluginname, $Pluginvar[,  $Pluginvartyp = "global"[, $Plugindir = "\plugins"]])
; Parameters ....: $Pluginname - Plugin Filename
;				   $Pluginvar - Plugin parameter ("#" as the parameter separator)
;                  $Pluginvartyp - Optional: (Default = "global") : Parametertyp, "global" to use global variables or "local" for direct parameter
;                  $Plugindir - Optional: (Default = "\plugins") : Plugin directory
; Return values .: Success - Returns : PID
;                  Failure - Returns 0 and Sets @Error:
;                  |0 - No error.
;                  |1 - incorrect value for $Pluginvartyp
; Author ........: chip
;
; ;==========================================================================================
Func _Pluginstart($Pluginname, $Pluginvar, $Pluginvartyp = "global", $Plugindir = "\plugins")
	Local $vars = StringSplit($Pluginvar, "#", 2)
	Local $element
	Local $param

	Switch $Pluginvartyp
		Case "global"
			For $element In $vars
				$param = $param & ' "' & Eval($element) & '"'
			Next
		Case "local"
			For $element In $vars
				$param = $param & ' "' & $element & '"'
			Next
		Case Else
			SetError(1)
			Return (0)
	EndSwitch
;~ MsgBox(0,"",@ScriptDir & $Plugindir & "\" & $Pluginname & $param)
	Local $pid = Run(@ScriptDir & $Plugindir & "\" & $Pluginname & $param)
	Return $pid
EndFunc   ;==>_Pluginstart