; ----------------------------------------------------
; PortableCDex
; ----------------------------------------------------
; Par Tuxmouraille modifié par Joshua
; D'après le script de John Haller
; License : GPL
; Ce script permet de créer Portable CDex.
; Ce script est à compiler avec NSIS de Nullsoft (http://www.nullsoft.com).
; Il nécessite les plugins "ipicsplash" (affichage splashscreen) et "CreateMutex_plug-in" 
; (empèche les multiinstances) pour être compilé.
; $id=PortableCDex.nsi $date=2006-03-20
; ----------------------------------------------------

;Niveau d'execution pour Windows Vista
RequestExecutionLevel user

; Général
!define NAME "PortableCDex"
!define FRIENDLYNAME "version française"
!define APP "CDex"
!define VER "0.4.1.5"
!define WEBSITE "http://www.framakey.org"
!define DEFAULTEXE "CDex.exe"
!define DEFAULTAPPDIR "CDex"
!define MYMUSICDIRECTORY "Ma musique"
!define MYDOCUMENTSDIRECTORY "Mes documents"
!define MYINFOMESSAGE "Permet à ${APP} d'être utilisé depuis un media amovible. Pour plus d'information, visitez ${WEBSITE}"
!define MYEXEMESSAGE "${DEFAULTEXE} n'est pas présent. S'il vous plait vérifiez votre configuration"
!define MYMUTEXMESSAGE "${NAME} est déjà lancé."

;=== Program Details
Name "${NAME}"
OutFile "${NAME}.exe"
Caption "${NAME}"
VIProductVersion "${VER}"
VIAddVersionKey FileDescription "${FRIENDLYNAME}"
VIAddVersionKey LegalCopyright "GPL"
VIAddVersionKey Comments "${MYINFOMESSAGE}"
VIAddVersionKey CompanyName "par FramaKey team"
VIAddVersionKey OriginalFilename "${NAME}.exe"
VIAddVersionKey FileVersion "${VER}"

;=== Runtime Switches
CRCCheck On
WindowIcon Off
SilentInstall Silent
AutoCloseWindow True

;=== Program Icon
Icon "${NAME}.ico"

Var PROGRAMDIRECTORY
Var MYMUSICPATH
Var ADDITIONALPARAMETERS
Var EXECSTRING
Var WAITFORPROGRAM
Var PROGRAMEXECUTABLE
Var INIPATH
Var DISABLESPLASHSCREEN

Section "Main"
	;=== Find the INI file, if there is one
		IfFileExists "$EXEDIR\${NAME}.ini" "" CheckSubINI
			StrCpy "$INIPATH" "$EXEDIR\"
			Goto ReadINI

	CheckSubINI:
		IfFileExists "$EXEDIR\${NAME}\${NAME}.ini" "" CheckSubSubINI
			StrCpy "$INIPATH" "$EXEDIR\${NAME}\"
			Goto ReadINI

	CheckSubSubINI:
		IfFileExists "$EXEDIR\PortableApps\${NAME}\${NAME}.ini" "" CheckPortableAppsINI
			StrCpy "$INIPATH" "$EXEDIR\PortableApps\${NAME}\"
			Goto ReadINI

	CheckPortableAppsINI:
		IfFileExists "$EXEDIR\Data\${NAME}\${NAME}.ini" ""  NoINI
			StrCpy "$INIPATH" "$EXEDIR\Data\${NAME}\"
			Goto ReadINI

	ReadINI:
		;=== Read the parameters from the INI file
		ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "${APP}Directory"
		StrCpy "$PROGRAMDIRECTORY" "$EXEDIR\$0"
        ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "MyMusicDirectory"
        StrCpy "$MYMUSICPATH" "$0"


		;=== Check that the above required parameters are present
		IfErrors NoINI

		ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "AdditionalParameters"
		StrCpy "$ADDITIONALPARAMETERS" $0
		ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "WaitFor${APP}"
		StrCpy "$WAITFORPROGRAM" $0
		ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "${APP}Executable"
		StrCpy "$PROGRAMEXECUTABLE" $0
		ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "DisableSplashScreen"
		StrCpy "$DISABLESPLASHSCREEN" $0

		
		;=== Any missing unrequired INI entries will be an empty string, ignore associated errors
		ClearErrors

		;=== Correct PROGRAMEXECUTABLE if blank
		StrCmp $PROGRAMEXECUTABLE "" "" EndINI
			StrCpy "$PROGRAMEXECUTABLE" "${DEFAULTEXE}"
			Goto EndINI

	NoINI:
		;=== No INI file, so we'll use the defaults
		StrCpy "$ADDITIONALPARAMETERS" ""
		StrCpy "$WAITFORPROGRAM" "false"
		StrCpy "$PROGRAMEXECUTABLE" "${DEFAULTEXE}"

		IfFileExists "$EXEDIR\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" CheckPortableProgramDIR
			StrCpy "$PROGRAMDIRECTORY" "$EXEDIR\${DEFAULTAPPDIR}"
            StrCpy "$MYMUSICPATH" "${MYMUSICDIRECTORY}"
			Goto EndINI

		CheckPortableProgramDIR:
			IfFileExists "$EXEDIR\${NAME}\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" CheckPortableAppsDIR
			StrCpy "$PROGRAMDIRECTORY" "$EXEDIR\${NAME}\${DEFAULTAPPDIR}"
            StrCpy "$MYMUSICPATH" "${NAME}\${MYMUSICDIRECTORY}"
			Goto EndINI

		CheckPortableAppsDIR:
			IfFileExists "$EXEDIR\PortableApps\${NAME}\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" CheckPortableAppsSplitDIR
			StrCpy "$PROGRAMDIRECTORY" "$EXEDIR\PortableApps\${NAME}\${DEFAULTAPPDIR}"
            StrCpy "$MYMUSICPATH" "PortableApps\${NAME}\${MYMUSICDIRECTORY}"
			Goto EndINI

		CheckPortableAppsSplitDIR:
			IfFileExists "$EXEDIR\Apps\${NAME}\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" NoProgramEXE
			StrCpy "$PROGRAMDIRECTORY" "$EXEDIR\Apps\${NAME}\${DEFAULTAPPDIR}"
            
            IfFileExists "$EXEDIR\Data\${MYMUSICDIRECTORY}" "" UniqueUserProfile
            StrCpy "$MYMUSICPATH" "Data\${MYMUSICDIRECTORY}"
			Goto EndINI
            
             UniqueUserProfile:
            IfFileExists "$EXEDIR\MyMusic.ini" "" SubINI
                StrCpy "$INIPATH" "$EXEDIR\"
			    Goto ReadDOCINI
                
	        SubINI:
		    IfFileExists "$EXEDIR\Apps\${NAME}\MyMusic.ini" ""  MDfr
			    StrCpy "$INIPATH" "$EXEDIR\Apps\${NAME}\"
			    Goto ReadDOCINI

	        ReadDOCINI:
		    ;=== Read the parameters from the INI file
            ReadINIStr $0 "$INIPATH\MyMusic.ini" "MyMusic" "MyMusicDirectory"
                StrCpy "$MYMUSICPATH" "Data\UserProfile\$0"
            Goto EndINI

            MDfr:
            StrCpy "$MYMUSICPATH" "Data\UserProfile\${MYDOCUMENTSDIRECTORY}\${MYMUSICDIRECTORY}"
            Goto EndINI

            EndINI:
            
		IfFileExists "$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" INIFiles

	NoProgramEXE:
		;=== Program executable not where expected
		MessageBox MB_OK|MB_ICONEXCLAMATION `${MYEXEMESSAGE}`
		Abort
		
	INIFiles:
    ;==On vérifie les valeurs cdex.ini, si non égale alors on les reécit
    ReadINIStr $0 "$PROGRAMDIRECTORY\CDex.INI" "General" "MP3OutputDir"
    StrCmp $0 "$MYMUSICPATH" Tempdirectory1 WriteCDexINI
    
    ;==On écrit les chemins dans cdex.ini
    WriteCDexINI:
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "General" "MP3OutputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "General" "CnvOutputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "General" "RecOutputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "General" "MP3InputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "General" "PlayDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "General" "WAVInputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "General" "CDDBPath" "$MYMUSICPATH\LocalCDDB\"
        
    Tempdirectory1:
    ;==On vérifie la valeur de TempDir dans cdex.ini, si non égale alors on la reécit
    ReadINIStr $0 "$PROGRAMDIRECTORY\CDex.INI" "General" "TempDir"
    StrCmp $0 $TEMP ReadDefaultINI WriteTemp1INI
    
    WriteTemp1INI:
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "General" "TempDir" $TEMP
    
    ReadDefaultINI:
    ;==On vérifie les valeurs default.prf.ini, si non égale alors on les reécit
    ReadINIStr $0 "$PROGRAMDIRECTORY\Default.prf.INI" "General" "MP3OutputDir"
    StrCmp $0 "$MYMUSICPATH" Tempdirectory2 WriteDefaultprfINI
    
    ;==On écrit les chemins dans cdex.ini
    WriteDefaultprfINI:
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "General" "MP3OutputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "General" "CnvOutputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "General" "RecOutputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "General" "MP3InputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "General" "PlayDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "General" "WAVInputDir" "$MYMUSICPATH"
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "General" "CDDBPath" "$MYMUSICPATH\LocalCDDB\"
    
    Tempdirectory2:
    ;==On vérifie la valeur de TempDir dans default.pdf.ini, si non égale alors on la reécit
    ReadINIStr $0 "$PROGRAMDIRECTORY\Default.prf.INI" "General" "TempDir"
    StrCmp $0 $TEMP LastDirCDex WriteTemp2INI
    
    WriteTemp2INI:
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "General" "TempDir" $TEMP

    LastDirCDex:
    ;==On vérifie la valeur Directory de LastDirectory dans cdex.ini, si non égale alors on la reécit
    ReadINIStr $0 "$PROGRAMDIRECTORY\CDex.INI" "LastDirectory" "Directory"
    StrCmp $0 "$MYMUSICPATH" LastDirDefault WriteLastDirCDexINI
    
    WriteLastDirCDexINI:
    WriteINIStr "$PROGRAMDIRECTORY\CDex.INI" "LastDirectory" "Directory" "$MYMUSICPATH"
    
    LastDirDefault:
    ;==On vérifie la valeur Directory de LastDirectory dans default.pdf.ini, si non égale alors on la reécit
    ReadINIStr $0 "$PROGRAMDIRECTORY\Default.prf.INI" "LastDirectory" "Directory"
    StrCmp $0 "$MYMUSICPATH" FoundProgramExe WriteLastDirDefaultINI
    
    WriteLastDirDefaultINI:
    WriteINIStr "$PROGRAMDIRECTORY\Default.prf.INI" "LastDirectory" "Directory" "$MYMUSICPATH"

    FoundProgramExe:
		StrCmp $DISABLESPLASHSCREEN "true" SkipSplashScreen
			;=== Show the splash screen before processing the files
			InitPluginsDir
			File /oname=$PLUGINSDIR\splash.jpg "${NAME}_splash.jpg"
			ipicsplash::show 3000 600 400 0x04025C "$PLUGINSDIR\splash.jpg"

	SkipSplashScreen:
	
		;=== Get any passed parameters
		Call GetParameters
		Pop $0
		StrCmp "'$0'" "''" "" LaunchProgramParameters

		;=== No parameters
		StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE"`
		Goto AdditionalParameters

	LaunchProgramParameters:
		StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" $0`

	AdditionalParameters:
		StrCmp $ADDITIONALPARAMETERS "" LaunchNow

		;=== Additional Parameters
		StrCpy $EXECSTRING `$EXECSTRING $ADDITIONALPARAMETERS`

	LaunchNow:
		StrCmp $WAITFORPROGRAM "true" LaunchAndWait LaunchAndClose

	LaunchAndWait:
		ExecWait $EXECSTRING
		Goto TheEnd

	LaunchAndClose:
		Exec $EXECSTRING

	TheEnd:

SectionEnd

Section .onInit
  Call Mutex
SectionEnd

Function "GetParameters"
  Push $R0
  Push $R1
  Push $R2
  StrCpy $R0 $CMDLINE 1
  StrCpy $R1 '"'
  StrCpy $R2 1
  StrCmp $R0 '"' loop
    StrCpy $R1 ' ' ; we're scanning for a space instead of a quote
  loop:
    StrCpy $R0 $CMDLINE 1 $R2
    StrCmp $R0 $R1 loop2
    StrCmp $R0 "\" "" "nofile"
      IntOp $2 $R2 + 1
    nofile:
    ;MessageBox MB_OK "r0: $R0"
    StrCmp $R0 "" loop2
    IntOp $R2 $R2 + 1
    Goto loop
  loop2:
    IntOp $R0 $R2 - $2
    IntOp $R0 $R0 - 4
    ;MessageBox MB_OK "$R2 - $2 = $R0"
    StrCpy $R7 $CMDLINE $R0 $2 ; we save the filename
    ;MessageBox MB_OK "$2"
  loop2b:
    IntOp $R2 $R2 + 1
    StrCpy $R0 $CMDLINE 1 $R2
    ;MessageBox MB_OK "rr0: $R0"
    StrCmp $R0 " " loop2b
  StrCpy $R0 $CMDLINE "" $R2
  Pop $R2
  Pop $R1
  Exch $R0
FunctionEnd

; -------------------------------------------
; Prévenir plusieurs Instances
; Sources : http://www.veekee.net/wikinsis/docs/AppendiceC.html#C.11
; -------------------------------------------
  Function Mutex
  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'
  Pop $R0

  StrCmp $R0 0 +3
   MessageBox MB_OK|MB_ICONEXCLAMATION "${MYMUTEXMESSAGE}"
   Abort
  FunctionEnd

; -------------------------------------------
; Fin du script