; Algemene instellingen installer
!define PRODUCT_NAME "PISAD"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "Intentio"
!define PRODUCT_WEB_SITE "http://www.intentio.be"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"

; Variabelen
var oradir                       ; Contains Oracle Directory
var execute_from                 ; What must be installed? Oracle, just sql for my app or .. ?
var db_passsystem                ; Password for system account in oracle db
var db_user                      ; Username to create tables in my db
var db_passuser                  ; Password for the db_user

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Installatie PISAD.exe"
InstallDir "$PROGRAMFILES\PISAD"
ShowInstDetails show
ShowUnInstDetails show

; Includes van plugins
!include "MUI.nsh"
!include "Registry.nsh"
!include "LogicLib.nsh"

; Instellingen aangepaste lay-out
;!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Language Selection Dialog Settings
!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"

; pagina's

!define MUI_PAGE_HEADER_TEXT "Installatie PISAD"
!define MUI_PAGE_HEADER_SUBTEXT "Met deze wizard installeert u de bestanden voor PISAD + bijkomende noodzakelijke software"

!insertmacro MUI_PAGE_WELCOME

!define MUI_LICENSEPAGE_BUTTON "Ik ga akkoord"
!insertmacro MUI_PAGE_LICENSE "Licentie.txt"

!insertmacro MUI_PAGE_COMPONENTS

Page custom Oracle
Page custom Sql

!insertmacro MUI_PAGE_DIRECTORY

var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "PISAD"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

; Uninstaller pagina's
!insertmacro MUI_UNPAGE_INSTFILES

; Taalbestanden
!insertmacro MUI_LANGUAGE "Dutch"

LangString TEXT_IO_TITLE ${LANG_DUTCH} "Database gegevens"
LangString TEXT_IO_SUBTITLE ${LANG_DUTCH} "${PRODUCT_NAME} ${PRODUCT_VERSION} maakt gebruik van een database. Geef hier de gevraagde informatie op"

Section "! Pisad" Pisad

        Call ExOracle

        SetOutPath "$INSTDIR"
        SetOverwrite try
        File /r "forms"
        File /r "reports"

        Call RegReportSrv

SectionEnd

Section "Database" Database
        MessageBox MB_OK "Database  sectie uitvoeren - Eerst handmatig de gebruiker nog aanmaken!"

        SetOutPath "$INSTDIR"
        File /r "sql"

        ; De locatie van sqlplus bepalen
        StrCpy $0 "$oradir\BIN\sqlplus.exe"
        
        GetFullPathName /SHORT $6 $INSTDIR
        StrCpy $4 "$6\sql\checkuserexists.sql"

SetOutPath $TEMP
File checkuserexists.sql
Push $1
nsExec::Exec "$0 -S system/$db_passsystem@XE @checkuserexists.sql $db_user"
Pop $1
IntCmp $1 0 not_exist oracleerror
IntCmp $1 1 0 0 oracleerror
MessageBox MB_OK "User exists"
goto done
not_exist:
MessageBox MB_OK "User doesn't exist"
goto done
oracleerror:
MessageBox MB_OK|MB_ICONSTOP "Oracle Error: $1"
done:
Pop $1

        StrCpy $4 "$6\sql\opvullen_tab.sql"
        nsExec::ExecToLog '$0 $db_user/$db_passuser@XE @"$4"'

SectionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
	!insertmacro MUI_DESCRIPTION_TEXT ${Pisad} "Hiermee installeert u de core files van de applicatie"
	!insertmacro MUI_DESCRIPTION_TEXT ${Database} "Hiermee installeert u de database, dit is alleen nodig bij een eerste installatie."
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Section -AdditionalIcons

  SetOutPath $INSTDIR
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Applicatie PISAD.lnk" "http://pieter-laptop:8889/forms/frmservlet?form=frm_inlogscherm.fmx"
  !insertmacro MUI_STARTMENU_WRITE_END

SectionEnd

Section -Post

  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"

SectionEnd

Function .onInit

  !insertmacro MUI_LANGDLL_DISPLAY
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS "OracleDir.ini" "OracleDir.ini"
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS "Sql.ini" "Sql.ini"
  StrCpy $execute_from 'begin'

FunctionEnd

Function Oracle

  	${registry::Open} "HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE" "/K=0 /V=1 /S=0 /B=1 /N='ORACLE_HOME'" $0
        ${registry::Find} "$0" $1 $2 $3 $4
        StrCpy $oradir $3
	${registry::Close} "$0"
	${registry::Unload}

        IfFileExists "$oradir\forms\server\formsweb.cfg" file_ok file_nok1

              file_ok:
              StrCpy $execute_from "sqlpisad"
              GoTo eindeOracle

              file_nok1:
              ; Oracle dir NIET gevonden
              ; De pagina om een dir om te geven wordt getoond
              !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)"
              !insertmacro MUI_INSTALLOPTIONS_DISPLAY "OracleDir.ini"
              !insertmacro MUI_INSTALLOPTIONS_READ $oradir "OracleDir.ini" "Field 2" "State"

              IfFileExists "$oradir\forms\server\formsweb.cfg" file_ok file_nok2
                           file_nok2:
                           MessageBox MB_YESNO "De opgegeven directory is ongeldig, wil u een andere directory selecteren?" IDYES file_nok1 IDNO stoppen1

              stoppen1:
              Messagebox MB_YESNO "Oracle is noodzakelijk om PISAD te kunnen installeren. Wenst u Oracle straks te installeren?" IDYES stoppen2 IDNO stoppen3

              stoppen2:
              StrCpy $execute_from "installoracle"
              GoTo eindeOracle

              stoppen3:
              Quit

              eindeOracle:
FunctionEnd

Function Sql

         !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)"
         !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Sql.ini"
         !insertmacro MUI_INSTALLOPTIONS_READ $db_passsystem "Sql.ini" "Field 1" "State"
         !insertmacro MUI_INSTALLOPTIONS_READ $db_user "Sql.ini" "Field 2" "State"
         !insertmacro MUI_INSTALLOPTIONS_READ $db_passuser "Sql.ini" "Field 3" "State"

FunctionEnd

Function RegReportSrv
         MessageBox MB_OK "report server registreren!"
FunctionEnd

Function ExOracle

         ${If} $execute_from == 'installoracle'
                  nsExec::ExecToLog 'software\oraclexe.exe'

                  ${registry::Open} "HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE" "/K=0 /V=1 /S=0 /B=1 /N='ORACLE_BASE'" $1
                  ; In $4 zit de base directory van Oracle
                  ${registry::Find} "$1" $2 $3 $4 $5
                  ${registry::Close} "$1"
                  ${registry::Unload}
                  nsExec::ExecToLog '$0 connect system/$db_passsystem@XE as sysdba @"$4\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catproc.sql"'
                  nsExec::ExecToLog '$0 connect system/$db_passsystem@XE as sysdba @"$4\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catalog.sql"'

                  nsExec::ExecToLog 'software\DS_1\setup.exe'
                  nsExec::ExecToLog 'software\jinit13125.exe'
                  Messagebox MB_OK "Klik pas op OK wanneer u alle onderdelen (3 in totaal) van Oracle eventueel handmatig heeft geïnstalleerd!"
         ${EndIf}

        SetOutPath "$oradir\forms\j2ee\formsapp\formsweb\"
        File /r "icons\*.*"

        SetOutPath "$INSTDIR"
        File "formsweb.cfg"

        Push workingDirectory= #text to be replaced
        Push workingDirectory=$INSTDIR\forms\ #replace with
        Push all #replace all occurrences
        Push all #replace all occurrences
        Push $INSTDIR\formsweb.cfg #file to replace in
        Call AdvReplaceInFile

        Push oracle_home=
        Push "oracle_home=$oradir\"
        Push all
        Push all
        Push $INSTDIR\formsweb.cfg
        Call AdvReplaceInFile

        ; Formsweb.cfg op de juiste locatie backuppen en kopiëren vanaf de install dir
        Delete /REBOOTOK "$oradir\forms\server\formsweb.cfg.bak"
        Rename "$oradir\forms\server\formsweb.cfg" "$oradir\forms\server\formsweb.cfg.bak"
        Delete /REBOOTOK "$oradir\forms\server\formsweb.cfg"
        Rename "$INSTDIR\formsweb.cfg" "$oradir\forms\server\formsweb.cfg"

FunctionEnd

Section Uninstall
  !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
  RMDir /r "$INSTDIR"

;  Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
;  Delete "$SMPROGRAMS\$ICONS_GROUP\Website.lnk"

  RMDir "$SMPROGRAMS\$ICONS_GROUP"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  SetAutoClose true
SectionEnd

Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 'Ben je zeker dat je de applicatie " $(^Name) " wil verwijderen?' IDYES +2
  Abort
FunctionEnd

Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) werd succesvol van uw systeem verwijderd!"
FunctionEnd

Function AdvReplaceInFile
         Exch $0 ;file to replace in
         Exch
         Exch $1 ;number to replace after
         Exch
         Exch 2
         Exch $2 ;replace and onwards
         Exch 2
         Exch 3
         Exch $3 ;replace with
         Exch 3
         Exch 4
         Exch $4 ;to replace
         Exch 4
         Push $5 ;minus count
         Push $6 ;universal
         Push $7 ;end string
         Push $8 ;left string
         Push $9 ;right string
         Push $R0 ;file1
         Push $R1 ;file2
         Push $R2 ;read
         Push $R3 ;universal
         Push $R4 ;count (onwards)
         Push $R5 ;count (after)
         Push $R6 ;temp file name

           GetTempFileName $R6
           FileOpen $R1 $0 r ;file to search in
           FileOpen $R0 $R6 w ;temp file
           StrLen $R3 $4
           StrCpy $R4 -1
           StrCpy $R5 -1

        loop_read:
           ClearErrors
           FileRead $R1 $R2 ;read line
           IfErrors exit

           StrCpy $5 0
           StrCpy $7 $R2
        loop_filter:
           IntOp $5 $5 - 1
           StrCpy $6 $7 $R3 $5 ;search
           StrCmp $6 "" file_write2
           StrCmp $6 $4 0 loop_filter
           StrCpy $8 $7 $5 ;left part
           IntOp $6 $5 + $R3
           IntCmp $6 0 is0 not0
        is0:
            StrCpy $9 ""
            Goto done
        not0:
            StrCpy $9 $7 "" $6 ;right part
        done:
            StrCpy $7 $8$3$9 ;re-join

            IntOp $R4 $R4 + 1
            StrCmp $2 all file_write1
            StrCmp $R4 $2 0 file_write2
            IntOp $R4 $R4 - 1

            IntOp $R5 $R5 + 1
            StrCmp $1 all file_write1
            StrCmp $R5 $1 0 file_write1
            IntOp $R5 $R5 - 1
            Goto file_write2

        file_write1:
            FileWrite $R0 $7 ;write modified line
            Goto loop_read

        file_write2:
            FileWrite $R0 $R2 ;write unmodified line
            Goto loop_read

        exit:
             FileClose $R0
             FileClose $R1

             SetDetailsPrint none
             Delete $0
             Rename $R6 $0
             Delete $R6
             SetDetailsPrint both

             Pop $R6
             Pop $R5
             Pop $R4
             Pop $R3
             Pop $R2
             Pop $R1
             Pop $R0
             Pop $9
             Pop $8
             Pop $7
             Pop $6
             Pop $5
             Pop $0
             Pop $1
             Pop $2
             Pop $3
             Pop $4
FunctionEnd