;Copyright (C) 2004-2007 John T. Haller ;Additional Ideas from tracon and mai9 ;Website: http://PortableApps.com/OpenOfficePortable ;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. !define NAME "OpenOfficePortable" !define FRIENDLYNAME "OpenOffice.org Portable" !define APP "OpenOffice" !define VER "1.4.0.0" !define WEBSITE "PortableApps.com/OpenOfficePortable" !define DEFAULTEXE "soffice.exe" !define DEFAULTAPPDIR "openoffice" !define DEFAULTSETTINGSDIR "settings" !define DEFAULTPARAMETERS "" ;=== Program Details Name "${FRIENDLYNAME}" OutFile "${NAME}.exe" Caption "${FRIENDLYNAME} | PortableApps.com" VIProductVersion "${VER}" VIAddVersionKey ProductName "${FRIENDLYNAME}" VIAddVersionKey Comments "Allows ${APP} to be run from a removable drive. For additional details, visit ${WEBSITE}" VIAddVersionKey CompanyName "PortableApps.com (John T. Haller)" VIAddVersionKey LegalCopyright "John T. Haller" VIAddVersionKey FileDescription "${FRIENDLYNAME}" VIAddVersionKey FileVersion "${VER}" VIAddVersionKey ProductVersion "${VER}" VIAddVersionKey InternalName "${FRIENDLYNAME}" VIAddVersionKey LegalTrademarks "PortableApps.com is a Trademark of Rare Ideas, LLC." VIAddVersionKey OriginalFilename "${NAME}.exe" ;VIAddVersionKey PrivateBuild "" ;VIAddVersionKey SpecialBuild "" ;=== Runtime Switches CRCCheck On WindowIcon Off SilentInstall Silent AutoCloseWindow True RequestExecutionLevel user ;=== Include !include "Attrib.nsh" !include "GetParameters.nsh" !include "StrReplace.nsh" !include "Registry.nsh" !include "CharToASCII.nsh" !include "GetParent.nsh" ;=== Program Icon Icon "${APP}.ico" Var PROGRAMDIRECTORY Var SETTINGSDIRECTORY Var SETTINGSDIRECTORYWITHOUTSPACES Var SETTINGSDIRECTORYBOOTSTRAP Var ADDITIONALPARAMETERS Var EXECSTRING Var WAITFORPROGRAM Var PROGRAMEXECUTABLE Var INIPATH Var DISABLESPLASHSCREEN Var ISDEFAULTDIRECTORY Var RUNDATALOCALLY Var SECONDARYLAUNCH Var DOCUMENTSDIRECTORY Var JAVADIRECTORY Var JAVAVENDOR Var JAVAVERSION Var JAVAPATHCONFIG Var JAVAPATHCONFIGHEX Var PORTABLEAPPSDIRECTORY 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" "" NoINI StrCpy $INIPATH "$EXEDIR\${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}" "SettingsDirectory" StrCpy "$SETTINGSDIRECTORY" "$EXEDIR\$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 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "RunDataLocally" StrCpy "$RUNDATALOCALLY" $0 StrCmp "$RUNDATALOCALLY" "true" "" CleanUpAnyErrors StrCpy "$WAITFORPROGRAM" "true" ${registry::Read} "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Personal" $R0 $R1 StrCpy $DOCUMENTSDIRECTORY $R0 CleanUpAnyErrors: ;=== 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}" StrCpy $DISABLESPLASHSCREEN "false" IfFileExists "$EXEDIR\App\${DEFAULTAPPDIR}\program\${DEFAULTEXE}" "" CheckPortableProgramDIR StrCpy $PROGRAMDIRECTORY "$EXEDIR\App\${DEFAULTAPPDIR}" StrCpy $SETTINGSDIRECTORY "$EXEDIR\Data\${DEFAULTSETTINGSDIR}" StrCpy $ISDEFAULTDIRECTORY "true" GoTo EndINI CheckPortableProgramDIR: IfFileExists "$EXEDIR\${NAME}\App\${DEFAULTAPPDIR}\program\${DEFAULTEXE}" "" CheckPortableAppsDIR StrCpy "$PROGRAMDIRECTORY" "$EXEDIR\${NAME}\App\${DEFAULTAPPDIR}" StrCpy "$SETTINGSDIRECTORY" "$EXEDIR\${NAME}\Data\${DEFAULTSETTINGSDIR}" GoTo EndINI CheckPortableAppsDIR: IfFileExists "$EXEDIR\PortableApps\${NAME}\App\${DEFAULTAPPDIR}\program\${DEFAULTEXE}" "" CheckPortableAppsSplitDIR StrCpy "$PROGRAMDIRECTORY" "$EXEDIR\PortableApps\App\${NAME}\${DEFAULTAPPDIR}" StrCpy "$SETTINGSDIRECTORY" "$EXEDIR\PortableApps\Data\${NAME}\${DEFAULTSETTINGSDIR}" GoTo EndINI CheckPortableAppsSplitDIR: IfFileExists "$EXEDIR\Apps\${NAME}\${DEFAULTAPPDIR}\program\${DEFAULTEXE}" "" NoProgramEXE StrCpy "$PROGRAMDIRECTORY" "$EXEDIR\Apps\${NAME}\${DEFAULTAPPDIR}" StrCpy "$SETTINGSDIRECTORY" "$EXEDIR\Data\${NAME}\${DEFAULTSETTINGSDIR}" EndINI: IfFileExists "$PROGRAMDIRECTORY\program\$PROGRAMEXECUTABLE" FoundProgramEXE NoProgramEXE: ;=== Program executable not where expected MessageBox MB_OK|MB_ICONEXCLAMATION `$PROGRAMEXECUTABLE was not found. Please check your configuration` Abort FoundProgramEXE: ;=== Check path length (max 120) StrLen $0 $PROGRAMDIRECTORY IntCmp $0 120 GoodPath GoodPath "" MessageBox MB_OK|MB_ICONEXCLAMATION `The path to ${FRIENDLYNAME} is too long. Please shorten the path by eliminating some parent directories or shortening directory names.` Abort GoodPath: FindProcDLL::FindProc "soffice.bin" Pop $R0 StrCmp $R0 "1" "" ShowSplashScreen StrCmp $RUNDATALOCALLY "true" LocalRunCheckSecondary IfFileExists "$SETTINGSDIRECTORY\.lock" "" ShowSplashScreen StrCpy $SECONDARYLAUNCH "true" Goto SkipSplashScreen LocalRunCheckSecondary: IfFileExists "$DOCUMENTSDIRECTORY\${NAME}Temp\settings\.lock" "" ShowSplashScreen StrCpy $SECONDARYLAUNCH "true" Goto SkipSplashScreen ShowSplashScreen: StrCmp $DISABLESPLASHSCREEN "true" SkipSplashScreen InitPluginsDir File /oname=$PLUGINSDIR\splash.jpg "${NAME}.jpg" StrCmp $RUNDATALOCALLY "true" LongSplashScreen newadvsplash::show /NOUNLOAD 3500 200 0 -1 /L $PLUGINSDIR\splash.jpg Goto SkipSplashScreen LongSplashScreen: newadvsplash::show /NOUNLOAD 5000 200 0 -1 /L $PLUGINSDIR\splash.jpg SkipSplashScreen: ;=== Run locally if needed (aka Live) StrCmp $RUNDATALOCALLY "true" "" SetupDocumentsPath StrCmp $SECONDARYLAUNCH "true" SetLocalSettingsDirectory RMDir /r "$DOCUMENTSDIRECTORY\${NAME}Temp\" CreateDirectory "$DOCUMENTSDIRECTORY\${NAME}Temp\settings" CopyFiles /SILENT $SETTINGSDIRECTORY\*.* $DOCUMENTSDIRECTORY\${NAME}Temp\settings Push $DOCUMENTSDIRECTORY\${NAME}Temp\settings Call Attrib SetLocalSettingsDirectory: StrCpy $SETTINGSDIRECTORY $DOCUMENTSDIRECTORY\${NAME}Temp\settings SetupDocumentsPath: StrCmp $RUNDATALOCALLY "true" UseDefaultPaths StrCmp $SECONDARYLAUNCH "true" CheckForPassedParameters StrCmp $ISDEFAULTDIRECTORY "true" "" CheckForPassedParameters IfFileExists "$SETTINGSDIRECTORY\user\*.*" CheckForPassedParameters IfFileExists "$EXEDIR\..\..\Documents\*.*" "" CheckForPassedParameters CreateDirectory "$EXEDIR\Data\temp\" CreateDirectory "$SETTINGSDIRECTORY\user\registry\data\org\openoffice\Office\" CopyFiles /SILENT "$EXEDIR\App\DefaultData\settings\user\registry\data\org\openoffice\Office\*.*" "$SETTINGSDIRECTORY\user\registry\data\org\openoffice\Office\" Goto CheckForPassedParameters UseDefaultPaths: Delete "$SETTINGSDIRECTORY\user\registry\data\org\openoffice\Office\Paths.xcu" CheckForPassedParameters: ;=== Get any passed parameters Call GetParameters Pop $0 StrCmp "'$0'" "''" "" LaunchProgramParameters ;=== No parameters StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\program\$PROGRAMEXECUTABLE"` Goto AdditionalParameters LaunchProgramParameters: StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\program\$PROGRAMEXECUTABLE" $0` AdditionalParameters: StrCpy $EXECSTRING `$EXECSTRING${DEFAULTPARAMETERS}` StrCmp $ADDITIONALPARAMETERS "" SetSettingsPath ;=== Additional Parameters StrCpy $EXECSTRING `$EXECSTRING $ADDITIONALPARAMETERS` SetSettingsPath: ;=== Set the settngs directory if we have a path StrCmp $RUNDATALOCALLY "true" LocalSettingsPath IfFileExists `$PROGRAMDIRECTORY\program\bootstrap.ini` "" NoBootStrap StrCmp $SECONDARYLAUNCH "true" LaunchAndClose StrCmp $ISDEFAULTDIRECTORY "true" SettingsDefault SettingsNotDefault SettingsDefault: ReadINIStr $0 `$PROGRAMDIRECTORY\program\bootstrap.ini` "Bootstrap" "UserInstallation" StrCmp $0 "$$ORIGIN/../../../Data/settings" CheckJava WriteINIStr `$PROGRAMDIRECTORY\program\bootstrap.ini` "Bootstrap" "UserInstallation" "$$ORIGIN/../../../Data/settings" Goto CheckJava SettingsNotDefault: ${StrReplace} $SETTINGSDIRECTORYWITHOUTSPACES " " "%20" $SETTINGSDIRECTORY ${StrReplace} $SETTINGSDIRECTORYBOOTSTRAP "\" "/" $SETTINGSDIRECTORYWITHOUTSPACES ;MessageBox MB_OK|MB_ICONINFORMATION `file:///$SETTINGSDIRECTORYBOOTSTRAP` WriteINIStr `$PROGRAMDIRECTORY\program\bootstrap.ini` "Bootstrap" "UserInstallation" "file:///$SETTINGSDIRECTORYBOOTSTRAP" Goto CheckJava NoBootStrap: MessageBox MB_OK|MB_ICONEXCLAMATION `$PROGRAMDIRECTORY\program\bootstrap.ini was not found. Please check your configuration` Abort LocalSettingsPath: ReadINIStr $0 `$PROGRAMDIRECTORY\program\bootstrap.ini` "Bootstrap" "UserInstallation" StrCmp $0 "$$SYSUSERHOME/${NAME}Temp/settings" CheckJava WriteINIStr `$PROGRAMDIRECTORY\program\bootstrap.ini` "Bootstrap" "UserInstallation" "$$SYSUSERHOME/${NAME}Temp/settings" CheckJava: Delete "$SETTINGSDIRECTORY\user\config\javasettings_Windows_x86.xml" ;=== Reset the Java settings StrCmp $RUNDATALOCALLY "true" LaunchNow IfFileExists "$EXEDIR\App\Java\javaportable.ini" "" CheckJavaCommonFiles StrCpy $JAVADIRECTORY "$EXEDIR\App\Java\" ReadINIStr $JAVAVENDOR "$EXEDIR\App\Java\javaportable.ini" "JavaPortable" "Vendor" ReadINIStr $JAVAVERSION "$EXEDIR\App\Java\javaportable.ini" "JavaPortable" "Version" Goto SetupJavaPath CheckJavaCommonFiles: Push $EXEDIR Call GetParent Pop $PORTABLEAPPSDIRECTORY IfFileExists "$PORTABLEAPPSDIRECTORY\CommonFiles\Java\javaportable.ini" "" LaunchNow StrCpy $JAVADIRECTORY "$PORTABLEAPPSDIRECTORY\CommonFiles\Java\" ReadINIStr $JAVAVENDOR "$PORTABLEAPPSDIRECTORY\CommonFiles\Java\javaportable.ini" "JavaPortable" "Vendor" ReadINIStr $JAVAVERSION "$PORTABLEAPPSDIRECTORY\CommonFiles\Java\javaportable.ini" "JavaPortable" "Version" SetupJavaPath: ${StrReplace} $JAVAPATHCONFIG "\" "/" "file:\\\$JAVADIRECTORY" StrCpy $0 `$JAVAPATHCONFIG` # temp variable to hold path to process ConvertPathToHex: StrCpy $1 $0 1 # pull the first letter ${CharToASCII} $2 $1 IntFmt $3 "%X" $2 # converted to hex in variable 3 StrCpy $JAVAPATHCONFIGHEX `$JAVAPATHCONFIGHEX$300` # add it to our hex string StrCpy $0 $0 "" 1 # pop the first character off StrCmp $0 "" DoneConvertingPathToHex ConvertPathToHex # no more characters? DoneConvertingPathToHex: ;=== Create a new config CreateDirectory "$SETTINGSDIRECTORY\user\config" FileOpen $0 "$SETTINGSDIRECTORY\user\config\javasettings_Windows_x86.xml" w FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `$JAVAPATHCONFIG` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `$JAVAVENDOR` FileWriteByte $0 "10" FileWrite $0 `$JAVAPATHCONFIG` FileWriteByte $0 "10" FileWrite $0 `$JAVAVERSION` FileWriteByte $0 "10" FileWrite $0 `0` FileWriteByte $0 "10" FileWrite $0 `0` FileWriteByte $0 "10" FileWrite $0 `$JAVAPATHCONFIGHEX620069006E002F0063006C00690065006E0074002F006A0076006D002E0064006C006C00` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWrite $0 `` FileWriteByte $0 "10" FileWriteByte $0 "10" FileClose $0 LaunchNow: StrCmp $WAITFORPROGRAM "true" LaunchAndWait LaunchAndClose LaunchAndWait: StrCmp $SECONDARYLAUNCH "true" LaunchAndClose ExecWait $EXECSTRING StrCmp $RUNDATALOCALLY "true" "" TheEnd RMDir /r "$DOCUMENTSDIRECTORY\${NAME}Temp\" GoTo TheEnd LaunchAndClose: Exec $EXECSTRING TheEnd: newadvsplash::wait SectionEnd