/*
 * * * Compile_AHK SETTINGS BEGIN * * *


[AHK2EXE]
Exe_File=%In_Dir%\..\..\Framakey.exe
[VERSION]
Set_Version_Info=1
Company_Name=Framakey
File_Description=Lanceur principal pour Framakey
File_Version=0.8.0.5
Inc_File_Version=1
Internal_Name=FramaStarter
Legal_Copyright=(c) 2011 Framakey.org
Original_Filename=Framakey.exe
Product_Name=Framakey
Product_Version=2.0.0.8
Inc_Product_Version=1
Language_ID=56
[ICONS]
Icon_1=%In_Dir%\Framakey.ico
Icon_2=0
Icon_3=0
Icon_4=0
Icon_5=0
Icon_6=0
Icon_7=0

* * * Compile_AHK SETTINGS END * * *
*/

; ----------------------------------------------------
; Framakey 
; ----------------------------------------------------
; Par fat115
; Utilisant comme base de travail les scripts NSIS de
; Sarkos and Lahire Biette (aka Tuxmouraille)
; License : GPL
; Ce script produit un exécutable gérant le lancement
; de la Framakey2 et des programmes associés cafe & co)
; Compiler: AutoHotkey (http://www.autohotkey.com/).
; $id=Framakey.ahk $date=2011-05-04
; ----------------------------------------------------
;Copyright (C) 2005-2011 Framakey

;Website: http://www.framakey.org

;This software is OSI Certified Open Source Software.
;OSI Certified is a certification mark of the Open Source Initiative.

;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either version 2
;of the License, or (at your option) any later version.

;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	See the
;GNU General Public License for more details.

;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA	02110-1301, USA.
; ----------------------------------------------------

#NoEnv
#Include %A_ScriptDir%\AhkIncludes
#Include ini.ahk
#Include Functions.ahk
#SingleInstance IGNORE

; Initialisation
s_ThisAppName := A_ScriptName
StringTrimRight, s_ThisAppName, s_ThisAppName, 4

; on définit le fichier de conf par défaut
f_IniConfFile := s_ThisAppName . ".ini"
	
; Vérification des paramètres
Gosub VerifParam

SetWorkingDir, %A_ScriptDir%
EnvSet, FramaRoot, %A_ScriptDir%
ini_load(s_IniFile, f_IniConfFile, "UTF-8")
p_FramaDir := ini_getValue(s_IniFile, "Main", "FramakeyDir")
IfExist, %A_ScriptDir%\%p_FramaDir%\PythonPortable
	EnvSet, FramaPython, %A_ScriptDir%\%p_FramaDir%\PythonPortable
IfExist, %A_ScriptDir%\%p_FramaDir%\WebappsManagerPortable
	EnvSet, FWM, %A_ScriptDir%\%p_FramaDir%\WebappsManagerPortable
b_DisAllSplash := ini_getValue(s_IniFile, "Main", "DisableAllSplash")
EnvSet, NOSPLASH, %b_DisAllSplash%
b_Splash := ini_getValuewDefault(s_IniFile, "SplashScreen", "DisableSplashScreen", "false")
b_MainTrayTip := ini_getValuewDefault(s_IniFile, "SplashScreen", "DisableMainTrayTip", "false")
s_TrayTipMsg := ini_getValuewDefault(s_IniFile, "SplashScreen", "MainTrayTipMessage", "Lancement en cours`nVeuillez patienter...")
f_SplashLocation := A_ScriptDir . "\" . p_FramaDir . "\" . ini_getValue(s_IniFile, "SplashScreen", "SplashScreenDir")
IfEqual, b_Splash, false
	{
	IfExist, %f_SplashLocation%
		SplashImage, %f_SplashLocation%, B
	Else
		MsgBox, 16, Erreur, Impossible de trouver l'écran de démarrage :`n%f_SplashLocation%`nVérifiez votre fichier de configuration.`nLe lancement va se poursuivre., 3
	}
IfEqual, b_MainTrayTip, false
	{
	StringReplace, s_TrayTipMsg, s_TrayTipMsg, \n, `n, All
	TrayTip, Framakey, %TrayTipMsg%, , 1
	}

Sleep, 1000
; Gestion des applis principales
FramaSuite := ini_getValue(s_IniFile, "MainApps", "LaunchFramaSuite")
FramaKiosk := ini_getValue(s_IniFile, "MainApps", "LaunchFramaKiosk")
Cafe := ini_getValue(s_IniFile, "MainApps", "LaunchCafe")
s_MainApps := "FramaSuite|FramaKiosk|Cafe"

Loop, parse, s_MainApps, |
{
	s_Appli := A_LoopField
	b_Launch := %A_LoopField%
	If (b_Launch = "false")
		Continue
	p_SubDir := ini_getValue(s_IniFile, s_Appli, "SubDir")
	f_Exec := ini_getValue(s_IniFile, s_Appli, "Exe")
	f_Command = %A_ScriptDir%\%p_FramaDir%\%p_SubDir%\%f_Exec%
	; on vérifie l'existence du fichier à lancer
	IfNotExist, %f_Command%
		{
		MsgBox, 16, Erreur, Impossible de trouver le programme :`n%f_Command%`nVérifiez votre fichier de configuration.`nLe lancement va se poursuivre., 3
		Continue
		}
	; On enlève d'éventuels doubles \
	StringReplace, f_Command, f_Command, \\, \, All
	; Pas besoin de définir le WorkingDirectory, les lanceurs en AHK sont conçus pour le forcer
	Run, %f_Command%
	IfEqual, b_MainTrayTip, false
		{
		TrayTip, Framakey, %s_TrayTipMsg% `nLancement de %s_Appli%, , 1
		Sleep, 1000
		}
}
TrayTip
SplashImage, Off

; Maintenant on boucle sur les programmes associés (MoreApps)
Loop
{
	Transform, s_ExecProg, Deref, ExecuteProg%A_Index%
	Transform, s_ProgStop, Deref, ExecuteProgToStop%A_Index%
	Transform, p_WorkDir, Deref, WorkDir%A_Index%
	Transform, s_Params, Deref, Parameter%A_Index%
	Transform, b_AskBeforeLaunch, Deref, AskForIt%A_Index%
	Transform, s_MsgToAsk, Deref, MessageToShow%A_Index%
	Transform, s_DefButton, Deref, DefaultButton%A_Index%
	s_ExecProg := ini_getValuewDefault(s_IniFile, "MoreApps", ExecuteProg%A_Index%, "Fini")
	; Vérification de la validité de l'action
	If (s_ExecProg = "Fini")
		Break
	; On lit le reste
	s_ProgStop := ini_getValue(s_IniFile,  "MoreApps", s_ProgStop)
	p_WorkDir := ini_getValue(s_IniFile,  "MoreApps", p_WorkDir)
	s_Params := ini_getValue(s_IniFile,  "MoreApps", s_Params)
	b_AskBeforeLaunch := ini_getValue(s_IniFile,  "MoreApps", b_AskBeforeLaunch)
	s_MsgToAsk := ini_getValue(s_IniFile,  "MoreApps", s_MsgToAsk)
	s_DefButton := ini_getValuewDefault(s_IniFile,  "MoreApps", s_DefButton, "yes")
	s_ActionName := StringTrimRight( s_ExecProg, 4)
	If (b_AskBeforeLaunch = "true")
		{
		If s_MsgToAsk
			s_Message := s_MsgToAsk
		Else
			s_Message := "Voulez-vous lancer" . s_ActionName . " ?"
		If (s_DefButton = "no")
			MsgBox, 292, %s_ThisAppName%, %s_Message%
		Else
			MsgBox, 36, %s_ThisAppName%, %s_Message%
		IfMsgBox, No
			Continue
		}
	If s_ProgStop
		{
		Process, WaitClose, %s_ProgStop%, 5
		If ErrorLevel
			{
			MsgBox, 64, Oups !, Impossible d'arrêter %s_ProgStop% .`n %s_ActionName% ne sera pas lancé., 3
			Continue
			}
		}
	; Quelques tests sur WorkingDir
	IfNotInString, p_WorkDir, :
		{
		; A priori un chemin relatif, on vérifie qu'il soit entièrement défini.
		If (SubStr(p_WorkDir, 1, 1) <> ".")
			p_WorkDir = %A_ScriptDir%\%p_WorkDir%
		}
	s_Command = %p_WorkDir%\%s_ExecProg%
	StringReplace, s_Command, s_Command, \\, \, All
	StringReplace, p_WorkDir, p_WorkDir, \\, \, All
	; on ne lance que si le programme est défini (sinon ça ouvre un explorateur, sic) et s'il existe
	If s_ExecProg
		{
		IfExist, %s_Command%
			Run, %s_Command% "%s_Params%", %p_WorkDir%
		Else
			MsgBox, 16, Erreur !, Le programme à lancer est introuvable.`nLa commande complète que vous vouliez lancer est :`n%s_Command% %s_Params%`nVeuillez vérifier votre fichier de configuration., 5
		}
	; on évite d'afficher une erreur pour les valeurs exemples
	Else If (s_ExecProg = "" AND A_Index = 1)
		Continue
	Else
		MsgBox, 16, Erreur !, Le programme à lancer n° %A_Index% n'est pas défini.`nVeuillez vérifier votre fichier de configuration., 5
}

Exit


;===============================================================================
; Subroutine Name:	VerifParam
; Description:		Vérification de la validité des paramètres
;===============================================================================
VerifParam:
{
	If 0 = 0
		Return
	If 0 > 1
		{
		i_MessageIcon := 16
		s_UnknownParam := "Trop de paramètres."
		Gosub MessageUsage
		}
	s_ParametreScript = %1%
	StringReplace, s_ParametreScript, s_ParametreScript, ",, All
	;ligne de bidouille pour ne pas flinguer la coloration syntaxique"
	; on regarde si le paramètre n'est pas un fichier (cas du fichier ini déposé sur l'exécutable)
	; puis on vérifie la validité de l'éventuel ini
	IfExist, %s_ParametreScript%
		{
		IniRead, Splash, %s_ParametreScript%, SplashScreen, DisableSplashScreen
		If (Splash <> "ERROR")
			{
			f_IniConfFile := s_ParametreScript
			Return
			}
		}
	
	If s_ParametreScript not contains -help,/?,-conf:,/conf:
		{
		i_MessageIcon := 16
		s_UnknownParam := "Paramètre inconnu : " . s_ParametreScript
		Gosub MessageUsage
		}
	If s_ParametreScript in -help,/?
		{
		i_MessageIcon := 64
		s_UnknownParam := "Vous avez crié au secours. Voilà un peu d'aide :"
		Gosub MessageUsage
		}
	If s_ParametreScript contains -conf:,/conf:
		f_IniConfFile := SubStr(s_ParametreScript, 7)
Return
}


;===============================================================================
; Subroutine Name:	MessageUsage
; Description:		Pop-up expliquant succinctement les options possibles
;===============================================================================
MessageUsage:
{
	HelpMessage := s_UnknownParam . "`n`n"
				. s_ThisAppName . " gère le lancement des éléments Framakey et des programmes associés`n"
				. "Options supportées (ne se cumulent pas):`n"
				. "-help : Affiche cet écran d'aide.`n"
				. "/? : Affiche cet écran d'aide aussi.`n"
				. "-conf:""chemin\vers\ini"" : Utilise le fichier de configuration indiqué.`n"
	If (i_MessageIcon = 64)
		MsgBox, 64, Options supportées, %HelpMessage%
	Else
		MsgBox, 16, Options supportées, %HelpMessage%
	ExitApp
Return
}