You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2010/09/23 16:33:35 UTC
svn commit: r1000481 - in
/directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main:
java/org/apache/directory/daemon/installers/nsis/NsisInstallerCommand.java
resources/org/apache/directory/daemon/installers/nsis/installer.nsi
Author: pamarcelot
Date: Thu Sep 23 14:33:35 2010
New Revision: 1000481
URL: http://svn.apache.org/viewvc?rev=1000481&view=rev
Log:
Improvements in Windows NSIS installer script.
Modified:
directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/java/org/apache/directory/daemon/installers/nsis/NsisInstallerCommand.java
directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/resources/org/apache/directory/daemon/installers/nsis/installer.nsi
Modified: directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/java/org/apache/directory/daemon/installers/nsis/NsisInstallerCommand.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/java/org/apache/directory/daemon/installers/nsis/NsisInstallerCommand.java?rev=1000481&r1=1000480&r2=1000481&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/java/org/apache/directory/daemon/installers/nsis/NsisInstallerCommand.java (original)
+++ directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/java/org/apache/directory/daemon/installers/nsis/NsisInstallerCommand.java Thu Sep 23 14:33:35 2010
@@ -39,6 +39,10 @@ import org.apache.tools.ant.taskdefs.Exe
*/
public class NsisInstallerCommand extends AbstractMojoCommand<NsisTarget>
{
+ private static final String INSTALLATION_FILES = "installationFiles";
+ private static final String INSTANCES_FILES = "instancesFiles/default";
+
+
/**
* Creates a new instance of NsisInstallerCommand.
*
@@ -162,6 +166,8 @@ public class NsisInstallerCommand extend
finalName = finalName + ".exe";
}
filterProperties.put( "finalname", target.getFinalName() );
+ filterProperties.put( "installationFiles", INSTALLATION_FILES );
+ filterProperties.put( "instancesFiles", INSTANCES_FILES );
}
@@ -170,7 +176,7 @@ public class NsisInstallerCommand extend
*/
public File getInstallationDirectory()
{
- return new File( getTargetDirectory(), "files" );
+ return new File( getTargetDirectory(), INSTALLATION_FILES );
}
@@ -179,6 +185,6 @@ public class NsisInstallerCommand extend
*/
public File getInstanceDirectory()
{
- return new File( getInstallationDirectory(), "instances/default" );
+ return new File( getTargetDirectory(), INSTANCES_FILES );
}
}
Modified: directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/resources/org/apache/directory/daemon/installers/nsis/installer.nsi
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/resources/org/apache/directory/daemon/installers/nsis/installer.nsi?rev=1000481&r1=1000480&r2=1000481&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/resources/org/apache/directory/daemon/installers/nsis/installer.nsi (original)
+++ directory/apacheds/branches/apacheds-apacheds-2.0/installers-plugin/src/main/resources/org/apache/directory/daemon/installers/nsis/installer.nsi Thu Sep 23 14:33:35 2010
@@ -1,655 +1,691 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-!define AppName "ApacheDS"
-!define AppVersion "${version}"
-!define ShortName "${app}"
-!define JRE_VERSION "1.5.0"
-!define Vendor "Apache Software Foundation"
-
-!define JAVA_URL "http://java.sun.com/javase/downloads/index_jdk5.jsp"
-
-!macro CreateInternetShortcut FILENAME URL ;ICONFILE ICONINDEX
-WriteINIStr "${FILENAME}.url" "InternetShortcut" "URL" "${URL}"
-!macroend
-
-!include "MUI.nsh"
-!include "Sections.nsh"
-
-Var InstallJRE
-Var JREPath
-
-
-
-;--------------------------------
-;Configuration
-
- ;General
- Name "${AppName}"
- OutFile "..\${finalname}"
-
- ;Folder selection page
- InstallDir "$PROGRAMFILES\${AppName}"
-
- ;Get install folder from registry if available
- InstallDirRegKey HKLM "SOFTWARE\${Vendor}\${ShortName}" ""
-
-; Installation types
-InstType "Full"
-
-BrandingText "${AppName} - ${AppVersion}"
-XPStyle on
-
-!define MUI_HEADERIMAGE
-!define MUI_HEADERIMAGE_BITMAP "header.bmp"
-!define MUI_COMPONENTSPAGE_SMALLDESC
-!define MUI_WELCOMEFINISHPAGE_BITMAP "welcome.bmp"
-!define MUI_ICON "installer.ico"
-!define MUI_UNICON "installer.ico"
-
-;--------------------------------
-;Pages
-
- ; License page
- !insertmacro MUI_PAGE_WELCOME
- !insertmacro MUI_PAGE_LICENSE "files\LICENSE"
-
- ; This page checks for JRE. It displays a dialog based on JRE.ini if it needs to install JRE
- ; Otherwise you won't see it.
- ;Page custom CheckInstalledJRE
-
- ; Define headers for the 'Java installation successfully' page
- #!define MUI_INSTFILESPAGE_FINISHHEADER_TEXT "Java installation complete"
- #!define MUI_PAGE_HEADER_TEXT "Installing Java runtime"
- #!define MUI_PAGE_HEADER_SUBTEXT "Please wait while we install the Java runtime"
- #!define MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT "Java runtime installed successfully."
- #!insertmacro MUI_PAGE_INSTFILES
- !define MUI_INSTFILESPAGE_FINISHHEADER_TEXT "Installation complete"
- !define MUI_PAGE_HEADER_TEXT "Installing"
- !define MUI_PAGE_HEADER_SUBTEXT "Please wait while ${AppName} is being installed."
-
- !insertmacro MUI_PAGE_COMPONENTS
-
- # The main installation directory
-
- Var SERVER_HOME_DIR
- ;!define MUI_PAGE_CUSTOMFUNCTION_PRE PreServerDir
- !define MUI_DIRECTORYPAGE_VARIABLE $SERVER_HOME_DIR ;selected by user
- !define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Server Home Directory" ;descriptive text
- !define MUI_DIRECTORYPAGE_TEXT_TOP "Select the directory where you would like to install ${AppName}" ; GUI page title
- !insertmacro MUI_PAGE_DIRECTORY ; this pops-up the GUI page
-
- Var INSTANCES_HOME_DIR
- !define MUI_PAGE_CUSTOMFUNCTION_PRE PreInstancesDir
- !define MUI_DIRECTORYPAGE_VARIABLE $INSTANCES_HOME_DIR ;selected by user
- !define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Server Instances Home Directory" ;descriptive text
- !define MUI_DIRECTORYPAGE_TEXT_TOP "Select the directory where you would like instances data to be stored.$\n$\nThis directory will be the home location for new instances." ; GUI page title
- !insertmacro MUI_PAGE_DIRECTORY ; this pops-up the GUI page
-
- Var JAVA_HOME_DIR
- !define MUI_DIRECTORYPAGE_VARIABLE $JAVA_HOME_DIR ;selected by user
- !define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Java Home Directory" ;descriptive text
- !define MUI_DIRECTORYPAGE_TEXT_TOP "Select the Java home directory that you would like to use for running the installed applications."
- !insertmacro MUI_PAGE_DIRECTORY ; this pops-up the GUI page
-
-
- !insertmacro MUI_PAGE_INSTFILES
- !insertmacro MUI_PAGE_FINISH
-
-; Uninstall
- !insertmacro MUI_UNPAGE_CONFIRM
- !insertmacro MUI_UNPAGE_INSTFILES
-
-;--------------------------------
-;Modern UI Configuration
-
- !define MUI_ABORTWARNING
-
-;--------------------------------
-;Languages
-
-!insertmacro MUI_LANGUAGE "English"
-
-
-;--------------------------------
-;Language Strings
-
- ;Description
- LangString DESC_SecServerFiles ${LANG_ENGLISH} "Installs all required ApacheDS server files."
- LangString DESC_SecInstanceFiles ${LANG_ENGLISH} "Creates and registers a default server instance."
-
- ;Header
- LangString TEXT_JRE_TITLE ${LANG_ENGLISH} "Java Runtime Environment"
- LangString TEXT_JRE_SUBTITLE ${LANG_ENGLISH} "Installation"
- LangString TEXT_PRODVER_TITLE ${LANG_ENGLISH} "Installed version of ${AppName}"
- LangString TEXT_PRODVER_SUBTITLE ${LANG_ENGLISH} "Installation canceled"
-
-;--------------------------------
-;Installer Sections
-
-SectionGroup "ApacheDS"
-Section "Apache DS Server Files" SecServerFiles
- SectionIn 1 RO
- SetOutPath "$SERVER_HOME_DIR\bin"
- File /r "files\bin\*.*"
-
- SetOutPath "$SERVER_HOME_DIR\lib"
- File /r "files\lib\*.*"
-
- SetOutPath "$SERVER_HOME_DIR\conf"
- File /r "files\conf\*.*"
-
- SetOutPath "$SERVER_HOME_DIR"
- File "*"
-
- Push "$SERVER_HOME_DIR"
- Push "*.txt"
- Call ConvertFiles
-
- Push "$SERVER_HOME_DIR\conf"
- Push "*.*"
- Call ConvertFiles
-
- GetFunctionAddress $R0 ReplaceConfig ; handle to callback fn
- Push $R0
- Push "$SERVER_HOME_DIR\conf\apacheds.conf" ; file to replace in
- Call ReplaceInFile
-
- CreateDirectory "$INSTANCES_HOME_DIR"
-
- ;Store install folder
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "DisplayName" "ApacheDS - (remove only)"
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "DisplayIcon" "$SERVER_HOME_DIR\uninstall.exe"
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "UninstallString" '"$SERVER_HOME_DIR\uninstall.exe"'
- WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "NoModify" "1"
- WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "NoRepair" "1"
-
- # Probably need to filter the file here (put in instance home)
-
-
- ;Create uninstaller
- WriteUninstaller "$SERVER_HOME_DIR\Uninstall.exe"
-
- CreateDirectory "$SMPROGRAMS\ApacheDS"
-
- !insertmacro CreateInternetShortcut "$SMPROGRAMS\ApacheDS\Basic Users Guide" \
- "http://directory.apache.org/apacheds/1.5/apacheds-v15-basic-users-guide.html"
- !insertmacro CreateInternetShortcut "$SMPROGRAMS\ApacheDS\Advanced Users Guide" \
- "http://directory.apache.org/apacheds/1.5/apacheds-v15-advanced-users-guide.html"
- !insertmacro CreateInternetShortcut "$SMPROGRAMS\ApacheDS\Developers Guide" \
- "http://directory.apache.org/apacheds/1.5/apacheds-v15-developers-guide.html"
-
- CreateShortCut "$SMPROGRAMS\ApacheDS\Uninstall.lnk" "$SERVER_HOME_DIR\uninstall.exe" "" "$SERVER_HOME_DIR\uninstall.exe" 0
-
-SectionEnd
-
-; This section needs a custom screen to ask for a name for the instance (replace default)
-Section "Default Instance" SecInstanceFiles
- SectionIn 1
- StrCpy $R9 "Passed the Example Instance section"
-
- Push "default"
- Call CreateInstanceDirs
-
- ;I am hand picking the files for now, but we could simplify this by creating a template for new instances
- SetOutPath "$INSTANCES_HOME_DIR\default\conf"
- File "files\instances\default\conf\log4j.properties"
- File "files\instances\default\conf\wrapper.conf"
-
- Push "$INSTANCES_HOME_DIR\default\conf"
- Push "*.*"
- Call ConvertFiles
-
- Push "default"
- Push "$INSTANCES_HOME_DIR"
- Call RegisterInstance
-SectionEnd
-SectionGroupEnd
-
-
-;--------------------------------
-;Descriptions
-
-!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
- !insertmacro MUI_DESCRIPTION_TEXT ${SecServerFiles} $(DESC_SecServerFiles)
- !insertmacro MUI_DESCRIPTION_TEXT ${SecInstanceFiles} $(DESC_SecInstanceFiles)
-!insertmacro MUI_FUNCTION_DESCRIPTION_END
-
-;---------------------------------
-; Functions
-
-; Converts Unix to CR/LF for Windows
-Function ConvertFiles
- Pop $R0
- Pop $R1
-
- FindFirst $R2 $R3 "$R1\$R0"
- loop:
- StrCmp $R3 "" done
- Push "$R1\$R3"
- Call ConvertUnixNewLines
- FindNext $R2 $R3
- Goto loop
- done:
- FindClose $R2
-
- Pop $R3
- Pop $R2
- Pop $R1
- Pop $R0
-FunctionEnd
-
-Function CreateInstanceDirs
- Pop $0
- CreateDirectory "$INSTANCES_HOME_DIR\$0\log"
- CreateDirectory "$INSTANCES_HOME_DIR\$0\conf"
- CreateDirectory "$INSTANCES_HOME_DIR\$0\partitions"
- ; the run dir seems to be irrelevant on Windows, but the InstallationLayout.verifyInstallation() method requires it
- CreateDirectory "$INSTANCES_HOME_DIR\$0\run"
- Pop $0
-FunctionEnd
-
-Function RegisterInstance
- Pop $0
- Pop $1
- nsExec::ExecToLog '"$SERVER_HOME_DIR\bin\${ShortName}" -i "$SERVER_HOME_DIR\conf\${ShortName}.conf" set.INSTANCE_HOME="$0" "set.INSTANCE=$1" set.APACHEDS_HOME="$SERVER_HOME_DIR" '
- Pop $1
- Pop $0
-FunctionEnd
-
-Function un.RegisterInstance
- Pop $0
- nsExec::ExecToLog '"$SERVER_HOME_DIR\bin\${ShortName}" -r "$SERVER_HOME_DIR\conf\${ShortName}.conf" "set.INSTANCE=$0"'
- Pop $0
-FunctionEnd
-
-Function .onInstSuccess
- Push "$INSTANCES_HOME_DIR\conf\apacheds-default.conf"
- Call ConvertUnixNewLines
-
- StrCmp $R9 "" End
-
- ; Start the server
- MessageBox MB_YESNO|MB_ICONQUESTION "Do you want to start the default server instance?" IDYES startService IDNO End
-startService:
- nsExec::ExecToLog '"$SERVER_HOME_DIR\bin\${ShortName}" --start "$SERVER_HOME_DIR\conf\${ShortName}.conf" "set.INSTANCE_HOME=$INSTANCES_HOME_DIR" "set.INSTANCE=default" "set.APACHEDS_HOME=$SERVER_HOME_DIR"'
-
-End:
-FunctionEnd
-
-;--------------------------------
-;Installer Functions
-
-Function .onInit
- SetCurInstType 0
- SetAutoClose false
- StrCpy $SERVER_HOME_DIR "$PROGRAMFILES\ApacheDS"
- Call CheckInstalledJRE
- StrCpy $JAVA_HOME_DIR "$JREPath"
-FunctionEnd
-
-Function PreServerDir
- ;StrCpy $SERVER_HOME_DIR $INSTDIR
- ;SetAutoClose false
-FunctionEnd
-
-Function PreInstancesDir
- StrCpy $INSTANCES_HOME_DIR $SERVER_HOME_DIR\instances
-FunctionEnd
-
-Function CheckInstalledJRE
- Push "${JRE_VERSION}"
- Call DetectJRE
- Exch $0 ; Get return value from stack
-
- StrCmp $0 "0" NoFound
- StrCmp $0 "-1" FoundOld
- Goto JREAlreadyInstalled
-
-FoundOld:
- ;!insertmacro MUI_INSTALLOPTIONS_WRITE "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini" "Field 1" "Text" "${AppName} requires a more recent version of the Java Runtime Environment than the one found on your computer. The installation of JRE ${JRE_VERSION} will start."
- ;!insertmacro MUI_HEADER_TEXT "$(TEXT_JRE_TITLE)" "$(TEXT_JRE_SUBTITLE)"
- ;!insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini"
- Goto MustInstallJRE
-
-NoFound:
- ;MessageBox MB_OK "JRE not found"
- ;!insertmacro MUI_INSTALLOPTIONS_WRITE "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini" "Field 1" "Text" "No Java Runtime Environment could be found on your computer. The installation of JRE v${JRE_VERSION} will start."
- !insertmacro MUI_HEADER_TEXT "$(TEXT_JRE_TITLE)" "$(TEXT_JRE_SUBTITLE)"
- ;!insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini"
- Goto MustInstallJRE
-
-MustInstallJRE:
- Exch $0 ; $0 now has the installoptions page return value
- ; Do something with return value here
- Pop $0 ; Restore $0
- StrCpy $InstallJRE "yes"
- Return
-
-JREAlreadyInstalled:
-; MessageBox MB_OK "No download: ${TEMP2}"
-; MessageBox MB_OK "JRE already installed"
- StrCpy $InstallJRE "no"
- StrCpy $JREPath "$0"
-
- ;!insertmacro MUI_INSTALLOPTIONS_WRITE "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini" "UserDefinedSection" "JREPath" $JREPATH
- Pop $0 ; Restore $0
- Return
-
-FunctionEnd
-
-; Returns: 0 - JRE not found. -1 - JRE found but too old. Otherwise - Path to JAVA EXE
-
-; DetectJRE. Version requested is on the stack.
-; Returns (on stack) "0" on failure (java too old or not installed), otherwise path to java interpreter
-; Stack value will be overwritten!
-
-Function DetectJRE
- Exch $0 ; Get version requested
- ; Now the previous value of $0 is on the stack, and the asked for version of JDK is in $0
- Push $1 ; $1 = Java version string (ie 1.5.0)
- Push $2 ; $2 = Javahome
- Push $3 ; $3 and $4 are used for checking the major/minor version of java
- Push $4
- ;MessageBox MB_OK "Detecting JRE"
- ReadRegStr $1 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
- ;MessageBox MB_OK "Read : $1"
- StrCmp $1 "" DetectTry2
- ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$1" "JavaHome"
- ;MessageBox MB_OK "Read 3: $2"
- StrCmp $2 "" DetectTry2
- Goto GetJRE
-
-DetectTry2:
- ReadRegStr $1 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion"
- ;MessageBox MB_OK "Detect Read : $1"
- StrCmp $1 "" NoFound
- ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit\$1" "JavaHome"
- ;MessageBox MB_OK "Detect Read 3: $2"
- StrCmp $2 "" NoFound
-
-GetJRE:
-; $0 = version requested. $1 = version found. $2 = javaHome
- ;MessageBox MB_OK "Getting JRE"
- IfFileExists "$2\bin\java.exe" 0 NoFound
- StrCpy $3 $0 1 ; Get major version. Example: $1 = 1.5.0, now $3 = 1
- StrCpy $4 $1 1 ; $3 = major version requested, $4 = major version found
- ;MessageBox MB_OK "Want $3 , found $4"
- IntCmp $4 $3 0 FoundOld FoundNew
- StrCpy $3 $0 1 2
- StrCpy $4 $1 1 2 ; Same as above. $3 is minor version requested, $4 is minor version installed
- ;MessageBox MB_OK "Want $3 , found $4"
- IntCmp $4 $3 FoundNew FoundOld FoundNew
-
-NoFound:
- ;MessageBox MB_OK "JRE not found"
- Push "0"
- Goto DetectJREEnd
-
-FoundOld:
- MessageBox MB_OK "JRE too old: $3 is older than $4"
-; Push ${TEMP2}
- Push "-1"
- Goto DetectJREEnd
-FoundNew:
- ;MessageBox MB_OK "JRE is new: $3 is newer than $4"
-
- Push "$2"
-; Push "OK"
-; Return
- Goto DetectJREEnd
-DetectJREEnd:
- ; Top of stack is return value, then r4,r3,r2,r1
- Exch ; => r4,rv,r3,r2,r1,r0
- Pop $4 ; => rv,r3,r2,r1r,r0
- Exch ; => r3,rv,r2,r1,r0
- Pop $3 ; => rv,r2,r1,r0
- Exch ; => r2,rv,r1,r0
- Pop $2 ; => rv,r1,r0
- Exch ; => r1,rv,r0
- Pop $1 ; => rv,r0
- Exch ; => r0,rv
- Pop $0 ; => rv
-FunctionEnd
-
-;--------------------------------
-;Uninstaller Section
-
-Section "Uninstall"
-
- ; Need to parse a list of instances or directories somehow
- Push "default"
- Call un.RegisterInstance
-
- ; remove registry keys
- DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS"
- DeleteRegKey HKLM "SOFTWARE\${Vendor}\ApacheDS"
-
- ; remove shortcuts, if any.
- RMDir /r "$SMPROGRAMS\ApacheDS"
-
- ; remove files in root, then all dirs created by the installer.... leave user added or instance dirs.
- Delete "$INSTDIR\*"
- RMDir /r "$INSTDIR\bin"
- RMDir /r "$INSTDIR\conf"
- RMDir /r "$INSTDIR\var"
- RMDir /r "$INSTDIR\lib"
- RMDir /r "$INSTDIR\log"
-
-SectionEnd
-
-Function ConvertUnixNewLines
- ; Usage:
- ;Push "path\to\text_file.txt"
- ;Call ConvertUnixNewLines
-
- Exch $R0 ;file #1 path
- Push $R1 ;file #1 handle
- Push $R2 ;file #2 path
- Push $R3 ;file #2 handle
- Push $R4 ;data
- Push $R5
-
- FileOpen $R1 $R0 r
- GetTempFileName $R2
- FileOpen $R3 $R2 w
-
- loopRead:
- ClearErrors
- FileRead $R1 $R4
- IfErrors doneRead
-
- StrCpy $R5 $R4 1 -1
- StrCmp $R5 $\n 0 +4
- StrCpy $R5 $R4 1 -2
- StrCmp $R5 $\r +3
- StrCpy $R4 $R4 -1
- StrCpy $R4 "$R4$\r$\n"
-
- FileWrite $R3 $R4
-
- Goto loopRead
- doneRead:
-
- FileClose $R3
- FileClose $R1
-
- SetDetailsPrint none
- Delete $R0
- Rename $R2 $R0
- SetDetailsPrint both
-
- Pop $R5
- Pop $R4
- Pop $R3
- Pop $R2
- Pop $R1
- Pop $R0
-FunctionEnd
-
-Function ReplaceInFile
- ;
- Exch $R0 ;file name to search in
- Exch
- Exch $R4 ;callback function handle
- Push $R1 ;file handle
- Push $R2 ;temp file name
- Push $R3 ;temp file handle
- Push $R5 ;line read
-
- GetTempFileName $R2
- FileOpen $R1 $R0 r ;file to search in
- FileOpen $R3 $R2 w ;temp file
-
-loop_read:
- ClearErrors
- FileRead $R1 $R5 ;read line
- Push $R5 ; put line on stack
- Call $R4
- Pop $R5 ; read line from stack
- IfErrors exit
- FileWrite $R3 $R5 ;write modified line
- Goto loop_read
-exit:
- FileClose $R1
- FileClose $R3
-
- SetDetailsPrint none
- Delete $R0
- Rename $R2 $R0
- Delete $R2
- SetDetailsPrint both
-
- ; pop in reverse order
- Pop $R5
- Pop $R3
- Pop $R2
- Pop $R1
- Pop $R4
- Pop $R0
-FunctionEnd
-
-Function ReplaceConfig
- ; Example usage of ReplaceInFile
- ; Called Like this:
- ;
- ;GetFunctionAddress $R0 ReplaceInSQL ; handle to callback fn
- ;Push $R0
- ;Push "$INSTDIR\template.sql" ; file to replace in
- ;Call ReplaceInFile
- ;
- ;
- ; save R1
- Push $R1
- Exch
- ;
- ;
- ; A sequence of replacements.
- ; the string to replace in is at the top of the stack
- Push "@app.java.home@" ; string to find
- Push "$JAVA_HOME_DIR\bin\java.exe"
- Call StrReplace
-
- ; restore stack
- Exch
- Pop $R1
-FunctionEnd
-
-# Uses $0
-Function openLinkNewWindow
- Push $3
- Push $2
- Push $1
- Push $0
- ReadRegStr $0 HKCR "http\shell\open\command" ""
-# Get browser path
- DetailPrint $0
- StrCpy $2 '"'
- StrCpy $1 $0 1
- StrCmp $1 $2 +2 # if path is not enclosed in " look for space as final char
- StrCpy $2 ' '
- StrCpy $3 1
- loop:
- StrCpy $1 $0 1 $3
- DetailPrint $1
- StrCmp $1 $2 found
- StrCmp $1 "" found
- IntOp $3 $3 + 1
- Goto loop
-
- found:
- StrCpy $1 $0 $3
- StrCmp $2 " " +2
- StrCpy $1 '$1"'
-
- Pop $0
- Exec '$1 $0'
- Pop $1
- Pop $2
- Pop $3
-FunctionEnd
-
-Var STR_REPLACE_VAR_0
-Var STR_REPLACE_VAR_1
-Var STR_REPLACE_VAR_2
-Var STR_REPLACE_VAR_3
-Var STR_REPLACE_VAR_4
-Var STR_REPLACE_VAR_5
-Var STR_REPLACE_VAR_6
-Var STR_REPLACE_VAR_7
-Var STR_REPLACE_VAR_8
-
-Function StrReplace
- Exch $STR_REPLACE_VAR_2
- Exch 1
- Exch $STR_REPLACE_VAR_1
- Exch 2
- Exch $STR_REPLACE_VAR_0
- StrCpy $STR_REPLACE_VAR_3 -1
- StrLen $STR_REPLACE_VAR_4 $STR_REPLACE_VAR_1
- StrLen $STR_REPLACE_VAR_6 $STR_REPLACE_VAR_0
- loop:
- IntOp $STR_REPLACE_VAR_3 $STR_REPLACE_VAR_3 + 1
- StrCpy $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_4 $STR_REPLACE_VAR_3
- StrCmp $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_1 found
- StrCmp $STR_REPLACE_VAR_3 $STR_REPLACE_VAR_6 done
- Goto loop
- found:
- StrCpy $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_3
- IntOp $STR_REPLACE_VAR_8 $STR_REPLACE_VAR_3 + $STR_REPLACE_VAR_4
- StrCpy $STR_REPLACE_VAR_7 $STR_REPLACE_VAR_0 "" $STR_REPLACE_VAR_8
- StrCpy $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_5$STR_REPLACE_VAR_2$STR_REPLACE_VAR_7
- StrLen $STR_REPLACE_VAR_6 $STR_REPLACE_VAR_0
- Goto loop
- done:
- Pop $STR_REPLACE_VAR_1 ; Prevent "invalid opcode" errors and keep the
- Pop $STR_REPLACE_VAR_1 ; stack as it was before the function was called
- Exch $STR_REPLACE_VAR_0
-FunctionEnd
-
-!macro _strReplaceConstructor OUT NEEDLE NEEDLE2 HAYSTACK
- Push "${HAYSTACK}"
- Push "${NEEDLE}"
- Push "${NEEDLE2}"
- Call StrReplace
- Pop "${OUT}"
-!macroend
-
-!define StrReplace '!insertmacro "_strReplaceConstructor"'
-
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+#
+# Constants and variables
+#
+ !define Application "ApacheDS"
+ !define Version "${version}"
+ !define Icon "installer.ico"
+ !define WelcomeImage "welcome.bmp"
+ !define HeaderImage "header.bmp"
+ !define OutFile "${finalname}"
+ !define InstallationFiles "${installationFiles}"
+ !define InstancesFiles "${instancesFiles}"
+ !define JREVersion "1.5.0"
+ !define INSTDIR_REG_ROOT "HKLM"
+ !define INSTDIR_REG_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${Application}"
+
+#
+# Modules inclusions
+#
+ # Modern UI module
+ !include "MUI.nsh"
+
+ # Sections module
+ !include "Sections.nsh"
+
+Var InstallJRE
+Var JREPath
+
+
+
+#
+# Configuration
+#
+ # Name of the application
+ Name "${Application}"
+
+ # Output installer file
+ OutFile "../${OutFile}"
+
+ # Default install directory
+ InstallDir "$PROGRAMFILES\${Application}"
+
+ # Branding text
+ BrandingText "${Application} - ${Version}"
+
+ # Activating XPStyle
+ XPStyle on
+
+ # Installer icon
+ !define MUI_ICON "${Icon}"
+
+ # Uninstaller icon
+ !define MUI_UNICON "${Icon}"
+
+ # Welcome image
+ !define MUI_WELCOMEFINISHPAGE_BITMAP "${WelcomeImage}"
+
+ # Activating header image
+ !define MUI_HEADERIMAGE
+ !define MUI_HEADERIMAGE_BITMAP "${HeaderImage}"
+
+ # Activating small description for the components page
+ !define MUI_COMPONENTSPAGE_SMALLDESC
+
+ # Activating a confirmation when aborting the installation
+ !define MUI_ABORTWARNING
+
+#
+# Pages
+#
+ #
+ # Installer pages
+ #
+
+ # Welcome page
+ !insertmacro MUI_PAGE_WELCOME
+
+ # License page
+ !insertmacro MUI_PAGE_LICENSE "${InstallationFiles}\LICENSE"
+
+ # Components page
+ #!insertmacro MUI_PAGE_COMPONENTS
+
+
+
+!macro CreateInternetShortcut FILENAME URL ;ICONFILE ICONINDEX
+WriteINIStr "${FILENAME}.url" "InternetShortcut" "URL" "${URL}"
+!macroend
+
+;--------------------------------
+;Pages
+
+
+ ; This page checks for JRE. It displays a dialog based on JRE.ini if it needs to install JRE
+ ; Otherwise you won't see it.
+ ;Page custom CheckInstalledJRE
+
+ ; Define headers for the 'Java installation successfully' page
+ #!define MUI_INSTFILESPAGE_FINISHHEADER_TEXT "Java installation complete"
+ #!define MUI_PAGE_HEADER_TEXT "Installing Java runtime"
+ #!define MUI_PAGE_HEADER_SUBTEXT "Please wait while we install the Java runtime"
+ #!define MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT "Java runtime installed successfully."
+ #!insertmacro MUI_PAGE_INSTFILES
+ !define MUI_INSTFILESPAGE_FINISHHEADER_TEXT "Installation complete"
+ !define MUI_PAGE_HEADER_TEXT "Installing"
+ !define MUI_PAGE_HEADER_SUBTEXT "Please wait while ${Application} is being installed."
+
+ # The main installation directory
+
+ Var SERVER_HOME_DIR
+ ;!define MUI_PAGE_CUSTOMFUNCTION_PRE PreServerDir
+ !define MUI_DIRECTORYPAGE_VARIABLE $SERVER_HOME_DIR ;selected by user
+ !define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Server Home Directory" ;descriptive text
+ !define MUI_DIRECTORYPAGE_TEXT_TOP "Select the directory where you would like to install ${Application}" ; GUI page title
+ !insertmacro MUI_PAGE_DIRECTORY ; this pops-up the GUI page
+
+ Var INSTANCES_HOME_DIR
+ !define MUI_PAGE_CUSTOMFUNCTION_PRE PreInstancesDir
+ !define MUI_DIRECTORYPAGE_VARIABLE $INSTANCES_HOME_DIR ;selected by user
+ !define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Server Instances Home Directory" ;descriptive text
+ !define MUI_DIRECTORYPAGE_TEXT_TOP "Select the directory where you would like instances data to be stored.$\n$\nThis directory will be the home location for new instances." ; GUI page title
+ !insertmacro MUI_PAGE_DIRECTORY ; this pops-up the GUI page
+
+ Var JAVA_HOME_DIR
+ !define MUI_DIRECTORYPAGE_VARIABLE $JAVA_HOME_DIR ;selected by user
+ !define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Java Home Directory" ;descriptive text
+ !define MUI_DIRECTORYPAGE_TEXT_TOP "Select the Java home directory that you would like to use for running the installed applications."
+ !insertmacro MUI_PAGE_DIRECTORY ; this pops-up the GUI page
+
+
+
+ # Installation page
+ !insertmacro MUI_PAGE_INSTFILES
+
+ # Finish page
+ !insertmacro MUI_PAGE_FINISH
+
+ #
+ # Uninstaller pages
+ #
+
+ # Confirmation page
+ !insertmacro MUI_UNPAGE_CONFIRM
+
+ # Uninstallation page
+ !insertmacro MUI_UNPAGE_INSTFILES
+
+#
+# Languages (the first one is the default one)
+#
+ !insertmacro MUI_LANGUAGE "English"
+ #!insertmacro MUI_LANGUAGE "French"
+ #!insertmacro MUI_LANGUAGE "German"
+
+
+;--------------------------------
+;Language Strings
+
+ ;Description
+ LangString DESC_SecServerFiles ${LANG_ENGLISH} "Installs all required ApacheDS server files."
+ LangString DESC_SecInstanceFiles ${LANG_ENGLISH} "Creates and registers a default server instance."
+
+ ;Header
+ LangString TEXT_JRE_TITLE ${LANG_ENGLISH} "Java Runtime Environment"
+ LangString TEXT_JRE_SUBTITLE ${LANG_ENGLISH} "Installation"
+ LangString TEXT_PRODVER_TITLE ${LANG_ENGLISH} "Installed version of ${AppName}"
+ LangString TEXT_PRODVER_SUBTITLE ${LANG_ENGLISH} "Installation canceled"
+#
+# Sections
+#
+ # Installer section
+ Section
+ # Writing installation files
+ SetOutPath "$SERVER_HOME_DIR"
+
+ # Adding installation source files
+ File /r "${InstallationFiles}\*"
+
+ # Converting files line encoding
+ Push "$SERVER_HOME_DIR"
+ Push "*.txt"
+ Call ConvertFiles
+
+ # Converting files line encoding
+ Push "$SERVER_HOME_DIR\conf"
+ Push "*.*"
+ Call ConvertFiles
+
+ GetFunctionAddress $R0 ReplaceConfig ; handle to callback fn
+ Push $R0
+ Push "$SERVER_HOME_DIR\conf\apacheds.conf" ; file to replace in
+ Call ReplaceInFile
+
+ # Creating directory in the start menu
+ CreateDirectory "$SMPROGRAMS\Apache Directory Studio"
+
+ # Creating links in the start menu
+ !insertmacro CreateInternetShortcut "$SMPROGRAMS\ApacheDS\Basic Users Guide" "http://directory.apache.org/apacheds/1.5/apacheds-v15-basic-users-guide.html"
+ !insertmacro CreateInternetShortcut "$SMPROGRAMS\ApacheDS\Advanced Users Guide" "http://directory.apache.org/apacheds/1.5/apacheds-v15-advanced-users-guide.html"
+ !insertmacro CreateInternetShortcut "$SMPROGRAMS\ApacheDS\Developers Guide" "http://directory.apache.org/apacheds/1.5/apacheds-v15-developers-guide.html"
+
+ # Configuring registries for the uninstaller
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "DisplayName" "${Application} - (remove only)"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "DisplayIcon" "$SERVER_HOME_DIR\uninstall.exe"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "UninstallString" '"$SERVER_HOME_DIR\uninstall.exe"'
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "NoModify" "1"
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ApacheDS" "NoRepair" "1"
+
+ # Creating the uninstaller
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+ # Creating a shortcut to the uninstaller
+ CreateShortCut "$SMPROGRAMS\ApacheDS\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "$SERVER_HOME_DIR\Uninstall.exe" 0
+
+ # Writing instances files
+ SetOutPath "$INSTANCES_HOME_DIR"
+
+ # Adding instances source files
+ File /r "${InstanceFiles}\*"
+
+ # Converting files line encoding
+ Push "$INSTANCES_HOME_DIR\conf"
+ Push "*.*"
+ Call ConvertFiles
+
+
+ #Push "default"
+ #Call CreateInstanceDirs
+
+ #;I am hand picking the files for now, but we could simplify this by creating a template for new instances
+ #SetOutPath "$INSTANCES_HOME_DIR\default\conf"
+ #File "files\instances\default\conf\log4j.properties"
+ #File "files\instances\default\conf\wrapper.conf"
+
+# Push "$INSTANCES_HOME_DIR\default\conf"
+ # Push "*.*"
+ # Call ConvertFiles
+
+ # Push "default"
+ # Push "$INSTANCES_HOME_DIR"
+ # Call RegisterInstance
+ SectionEnd
+
+
+;--------------------------------
+;Descriptions
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecServerFiles} $(DESC_SecServerFiles)
+ !insertmacro MUI_DESCRIPTION_TEXT ${SecInstanceFiles} $(DESC_SecInstanceFiles)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;---------------------------------
+; Functions
+
+; Converts Unix to CR/LF for Windows
+Function ConvertFiles
+ Pop $R0
+ Pop $R1
+
+ FindFirst $R2 $R3 "$R1\$R0"
+ loop:
+ StrCmp $R3 "" done
+ Push "$R1\$R3"
+ Call ConvertUnixNewLines
+ FindNext $R2 $R3
+ Goto loop
+ done:
+ FindClose $R2
+
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+FunctionEnd
+
+Function CreateInstanceDirs
+ Pop $0
+ CreateDirectory "$INSTANCES_HOME_DIR\$0\log"
+ CreateDirectory "$INSTANCES_HOME_DIR\$0\conf"
+ CreateDirectory "$INSTANCES_HOME_DIR\$0\partitions"
+ ; the run dir seems to be irrelevant on Windows, but the InstallationLayout.verifyInstallation() method requires it
+ CreateDirectory "$INSTANCES_HOME_DIR\$0\run"
+ Pop $0
+FunctionEnd
+
+Function RegisterInstance
+ Pop $0
+ Pop $1
+ nsExec::ExecToLog '"$SERVER_HOME_DIR\bin\wrapper" -i "$SERVER_HOME_DIR\conf\wrapper.conf" set.INSTANCE_HOME="$0" "set.INSTANCE=$1" set.APACHEDS_HOME="$SERVER_HOME_DIR" '
+ Pop $1
+ Pop $0
+FunctionEnd
+
+Function un.RegisterInstance
+ Pop $0
+ nsExec::ExecToLog '"$SERVER_HOME_DIR\bin\wrapper" -r "$SERVER_HOME_DIR\conf\wrapper.conf" "set.INSTANCE=$0"'
+ Pop $0
+FunctionEnd
+
+Function .onInstSuccess
+ Push "$INSTANCES_HOME_DIR\conf\apacheds-default.conf"
+ Call ConvertUnixNewLines
+
+ StrCmp $R9 "" End
+
+ ; Start the server
+ MessageBox MB_YESNO|MB_ICONQUESTION "Do you want to start the default server instance?" IDYES startService IDNO End
+startService:
+ nsExec::ExecToLog '"$SERVER_HOME_DIR\bin\${ShortName}" --start "$SERVER_HOME_DIR\conf\${ShortName}.conf" "set.INSTANCE_HOME=$INSTANCES_HOME_DIR" "set.INSTANCE=default" "set.APACHEDS_HOME=$SERVER_HOME_DIR"'
+
+End:
+FunctionEnd
+
+;--------------------------------
+;Installer Functions
+
+Function .onInit
+ SetCurInstType 0
+ SetAutoClose false
+ StrCpy $SERVER_HOME_DIR "$PROGRAMFILES\ApacheDS"
+ Call CheckInstalledJRE
+ StrCpy $JAVA_HOME_DIR "$JREPath"
+FunctionEnd
+
+Function PreServerDir
+ ;StrCpy $SERVER_HOME_DIR $INSTDIR
+ ;SetAutoClose false
+FunctionEnd
+
+Function PreInstancesDir
+ StrCpy $INSTANCES_HOME_DIR $SERVER_HOME_DIR\instances
+FunctionEnd
+
+Function CheckInstalledJRE
+ Push "${JRE_VERSION}"
+ Call DetectJRE
+ Exch $0 ; Get return value from stack
+
+ StrCmp $0 "0" NoFound
+ StrCmp $0 "-1" FoundOld
+ Goto JREAlreadyInstalled
+
+FoundOld:
+ ;!insertmacro MUI_INSTALLOPTIONS_WRITE "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini" "Field 1" "Text" "${AppName} requires a more recent version of the Java Runtime Environment than the one found on your computer. The installation of JRE ${JRE_VERSION} will start."
+ ;!insertmacro MUI_HEADER_TEXT "$(TEXT_JRE_TITLE)" "$(TEXT_JRE_SUBTITLE)"
+ ;!insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini"
+ Goto MustInstallJRE
+
+NoFound:
+ ;MessageBox MB_OK "JRE not found"
+ ;!insertmacro MUI_INSTALLOPTIONS_WRITE "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini" "Field 1" "Text" "No Java Runtime Environment could be found on your computer. The installation of JRE v${JRE_VERSION} will start."
+ !insertmacro MUI_HEADER_TEXT "$(TEXT_JRE_TITLE)" "$(TEXT_JRE_SUBTITLE)"
+ ;!insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini"
+ Goto MustInstallJRE
+
+MustInstallJRE:
+ Exch $0 ; $0 now has the installoptions page return value
+ ; Do something with return value here
+ Pop $0 ; Restore $0
+ StrCpy $InstallJRE "yes"
+ Return
+
+JREAlreadyInstalled:
+; MessageBox MB_OK "No download: ${TEMP2}"
+; MessageBox MB_OK "JRE already installed"
+ StrCpy $InstallJRE "no"
+ StrCpy $JREPath "$0"
+
+ ;!insertmacro MUI_INSTALLOPTIONS_WRITE "/home/ccustine/development/projects/organicelement/libraries/apacheds_trunk/apacheds/server-installers/src/main/installers/jre.ini" "UserDefinedSection" "JREPath" $JREPATH
+ Pop $0 ; Restore $0
+ Return
+
+FunctionEnd
+
+; Returns: 0 - JRE not found. -1 - JRE found but too old. Otherwise - Path to JAVA EXE
+
+; DetectJRE. Version requested is on the stack.
+; Returns (on stack) "0" on failure (java too old or not installed), otherwise path to java interpreter
+; Stack value will be overwritten!
+
+Function DetectJRE
+ Exch $0 ; Get version requested
+ ; Now the previous value of $0 is on the stack, and the asked for version of JDK is in $0
+ Push $1 ; $1 = Java version string (ie 1.5.0)
+ Push $2 ; $2 = Javahome
+ Push $3 ; $3 and $4 are used for checking the major/minor version of java
+ Push $4
+ ;MessageBox MB_OK "Detecting JRE"
+ ReadRegStr $1 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
+ ;MessageBox MB_OK "Read : $1"
+ StrCmp $1 "" DetectTry2
+ ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$1" "JavaHome"
+ ;MessageBox MB_OK "Read 3: $2"
+ StrCmp $2 "" DetectTry2
+ Goto GetJRE
+
+DetectTry2:
+ ReadRegStr $1 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion"
+ ;MessageBox MB_OK "Detect Read : $1"
+ StrCmp $1 "" NoFound
+ ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Development Kit\$1" "JavaHome"
+ ;MessageBox MB_OK "Detect Read 3: $2"
+ StrCmp $2 "" NoFound
+
+GetJRE:
+; $0 = version requested. $1 = version found. $2 = javaHome
+ ;MessageBox MB_OK "Getting JRE"
+ IfFileExists "$2\bin\java.exe" 0 NoFound
+ StrCpy $3 $0 1 ; Get major version. Example: $1 = 1.5.0, now $3 = 1
+ StrCpy $4 $1 1 ; $3 = major version requested, $4 = major version found
+ ;MessageBox MB_OK "Want $3 , found $4"
+ IntCmp $4 $3 0 FoundOld FoundNew
+ StrCpy $3 $0 1 2
+ StrCpy $4 $1 1 2 ; Same as above. $3 is minor version requested, $4 is minor version installed
+ ;MessageBox MB_OK "Want $3 , found $4"
+ IntCmp $4 $3 FoundNew FoundOld FoundNew
+
+NoFound:
+ ;MessageBox MB_OK "JRE not found"
+ Push "0"
+ Goto DetectJREEnd
+
+FoundOld:
+ MessageBox MB_OK "JRE too old: $3 is older than $4"
+; Push ${TEMP2}
+ Push "-1"
+ Goto DetectJREEnd
+FoundNew:
+ ;MessageBox MB_OK "JRE is new: $3 is newer than $4"
+
+ Push "$2"
+; Push "OK"
+; Return
+ Goto DetectJREEnd
+DetectJREEnd:
+ ; Top of stack is return value, then r4,r3,r2,r1
+ Exch ; => r4,rv,r3,r2,r1,r0
+ Pop $4 ; => rv,r3,r2,r1r,r0
+ Exch ; => r3,rv,r2,r1,r0
+ Pop $3 ; => rv,r2,r1,r0
+ Exch ; => r2,rv,r1,r0
+ Pop $2 ; => rv,r1,r0
+ Exch ; => r1,rv,r0
+ Pop $1 ; => rv,r0
+ Exch ; => r0,rv
+ Pop $0 ; => rv
+FunctionEnd
+
+
+ # Uninstaller section
+ Section Uninstall
+
+ #Need to parse a list of instances or directories somehow
+ Push "default"
+ Call un.RegisterInstance
+
+ # Remove shortcuts and folders in the start menu
+ RMDir /r "$SMPROGRAMS\ApacheDS"
+
+ # Removing registry keys
+ DeleteRegKey "${INSTDIR_REG_ROOT}" "${INSTDIR_REG_KEY}"
+
+ # Removing files in root, then all dirs created by the installer (leave user added or instance dirs)
+ Delete "$INSTDIR\*"
+ RMDir /r "$INSTDIR\bin"
+ RMDir /r "$INSTDIR\conf"
+ RMDir /r "$INSTDIR\lib"
+
+ SectionEnd
+
+Function ConvertUnixNewLines
+ ; Usage:
+ ;Push "path\to\text_file.txt"
+ ;Call ConvertUnixNewLines
+
+ Exch $R0 ;file #1 path
+ Push $R1 ;file #1 handle
+ Push $R2 ;file #2 path
+ Push $R3 ;file #2 handle
+ Push $R4 ;data
+ Push $R5
+
+ FileOpen $R1 $R0 r
+ GetTempFileName $R2
+ FileOpen $R3 $R2 w
+
+ loopRead:
+ ClearErrors
+ FileRead $R1 $R4
+ IfErrors doneRead
+
+ StrCpy $R5 $R4 1 -1
+ StrCmp $R5 $\n 0 +4
+ StrCpy $R5 $R4 1 -2
+ StrCmp $R5 $\r +3
+ StrCpy $R4 $R4 -1
+ StrCpy $R4 "$R4$\r$\n"
+
+ FileWrite $R3 $R4
+
+ Goto loopRead
+ doneRead:
+
+ FileClose $R3
+ FileClose $R1
+
+ SetDetailsPrint none
+ Delete $R0
+ Rename $R2 $R0
+ SetDetailsPrint both
+
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+FunctionEnd
+
+Function ReplaceInFile
+ ;
+ Exch $R0 ;file name to search in
+ Exch
+ Exch $R4 ;callback function handle
+ Push $R1 ;file handle
+ Push $R2 ;temp file name
+ Push $R3 ;temp file handle
+ Push $R5 ;line read
+
+ GetTempFileName $R2
+ FileOpen $R1 $R0 r ;file to search in
+ FileOpen $R3 $R2 w ;temp file
+
+loop_read:
+ ClearErrors
+ FileRead $R1 $R5 ;read line
+ Push $R5 ; put line on stack
+ Call $R4
+ Pop $R5 ; read line from stack
+ IfErrors exit
+ FileWrite $R3 $R5 ;write modified line
+ Goto loop_read
+exit:
+ FileClose $R1
+ FileClose $R3
+
+ SetDetailsPrint none
+ Delete $R0
+ Rename $R2 $R0
+ Delete $R2
+ SetDetailsPrint both
+
+ ; pop in reverse order
+ Pop $R5
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R4
+ Pop $R0
+FunctionEnd
+
+Function ReplaceConfig
+ ; Example usage of ReplaceInFile
+ ; Called Like this:
+ ;
+ ;GetFunctionAddress $R0 ReplaceInSQL ; handle to callback fn
+ ;Push $R0
+ ;Push "$INSTDIR\template.sql" ; file to replace in
+ ;Call ReplaceInFile
+ ;
+ ;
+ ; save R1
+ Push $R1
+ Exch
+ ;
+ ;
+ ; A sequence of replacements.
+ ; the string to replace in is at the top of the stack
+ Push "@app.java.home@" ; string to find
+ Push "$JAVA_HOME_DIR\bin\java.exe"
+ Call StrReplace
+
+ ; restore stack
+ Exch
+ Pop $R1
+FunctionEnd
+
+# Uses $0
+Function openLinkNewWindow
+ Push $3
+ Push $2
+ Push $1
+ Push $0
+ ReadRegStr $0 HKCR "http\shell\open\command" ""
+# Get browser path
+ DetailPrint $0
+ StrCpy $2 '"'
+ StrCpy $1 $0 1
+ StrCmp $1 $2 +2 # if path is not enclosed in " look for space as final char
+ StrCpy $2 ' '
+ StrCpy $3 1
+ loop:
+ StrCpy $1 $0 1 $3
+ DetailPrint $1
+ StrCmp $1 $2 found
+ StrCmp $1 "" found
+ IntOp $3 $3 + 1
+ Goto loop
+
+ found:
+ StrCpy $1 $0 $3
+ StrCmp $2 " " +2
+ StrCpy $1 '$1"'
+
+ Pop $0
+ Exec '$1 $0'
+ Pop $1
+ Pop $2
+ Pop $3
+FunctionEnd
+
+Var STR_REPLACE_VAR_0
+Var STR_REPLACE_VAR_1
+Var STR_REPLACE_VAR_2
+Var STR_REPLACE_VAR_3
+Var STR_REPLACE_VAR_4
+Var STR_REPLACE_VAR_5
+Var STR_REPLACE_VAR_6
+Var STR_REPLACE_VAR_7
+Var STR_REPLACE_VAR_8
+
+Function StrReplace
+ Exch $STR_REPLACE_VAR_2
+ Exch 1
+ Exch $STR_REPLACE_VAR_1
+ Exch 2
+ Exch $STR_REPLACE_VAR_0
+ StrCpy $STR_REPLACE_VAR_3 -1
+ StrLen $STR_REPLACE_VAR_4 $STR_REPLACE_VAR_1
+ StrLen $STR_REPLACE_VAR_6 $STR_REPLACE_VAR_0
+ loop:
+ IntOp $STR_REPLACE_VAR_3 $STR_REPLACE_VAR_3 + 1
+ StrCpy $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_4 $STR_REPLACE_VAR_3
+ StrCmp $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_1 found
+ StrCmp $STR_REPLACE_VAR_3 $STR_REPLACE_VAR_6 done
+ Goto loop
+ found:
+ StrCpy $STR_REPLACE_VAR_5 $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_3
+ IntOp $STR_REPLACE_VAR_8 $STR_REPLACE_VAR_3 + $STR_REPLACE_VAR_4
+ StrCpy $STR_REPLACE_VAR_7 $STR_REPLACE_VAR_0 "" $STR_REPLACE_VAR_8
+ StrCpy $STR_REPLACE_VAR_0 $STR_REPLACE_VAR_5$STR_REPLACE_VAR_2$STR_REPLACE_VAR_7
+ StrLen $STR_REPLACE_VAR_6 $STR_REPLACE_VAR_0
+ Goto loop
+ done:
+ Pop $STR_REPLACE_VAR_1 ; Prevent "invalid opcode" errors and keep the
+ Pop $STR_REPLACE_VAR_1 ; stack as it was before the function was called
+ Exch $STR_REPLACE_VAR_0
+FunctionEnd
+
+!macro _strReplaceConstructor OUT NEEDLE NEEDLE2 HAYSTACK
+ Push "${HAYSTACK}"
+ Push "${NEEDLE}"
+ Push "${NEEDLE2}"
+ Call StrReplace
+ Pop "${OUT}"
+!macroend
+
+!define StrReplace '!insertmacro "_strReplaceConstructor"'
+
+
+
+