;Copyright 2004-2007 John T. Haller ;Website: http://PortableApps.com/SunbirdPortable ;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 LONGNAME "Mozilla Sunbird, Portable Edition" !define FULLNAME "Sunbird Portable" !define NAME "SunbirdPortable" !define APP "Sunbird" !define VER "1.4.3.0" !define WEBSITE "PortableApps.com/SunbirdPortable" !define DEFAULTEXE "sunbird.exe" !define DEFAULTAPPDIR "sunbird" ;=== Program Details Name "${LONGNAME}" OutFile "${NAME}.exe" Caption "${LONGNAME} | PortableApps.com" VIProductVersion "${VER}" VIAddVersionKey ProductName "${LONGNAME}" VIAddVersionKey Comments "Allows ${APP} to be run from a removable drive. For additional details, visit ${WEBSITE}" VIAddVersionKey CompanyName "PortableApps.com" VIAddVersionKey LegalCopyright "John T. Haller" VIAddVersionKey FileDescription "${LONGNAME}" VIAddVersionKey FileVersion "${VER}" VIAddVersionKey ProductVersion "${VER}" VIAddVersionKey InternalName "${LONGNAME}" VIAddVersionKey LegalTrademarks "Sunbird is a Trademark of The Mozilla Foundation. 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 "MUI.nsh" ;=== Program Icon Icon "${NAME}.ico" ;=== Icon & Stye === !define MUI_ICON "${NAME}.ico" BrandingText "PortableApps.com - Your Digital Life, Anywhere™" MiscButtonText "" "" "" "Continue" InstallButtonText "Continue" ;=== Pages !define MUI_LICENSEPAGE_RADIOBUTTONS !insertmacro MUI_PAGE_LICENSE "EULA.txt" !insertmacro MUI_PAGE_INSTFILES ;=== Languages !insertmacro MUI_LANGUAGE "English" Var PROGRAMDIRECTORY Var PROFILEDIRECTORY Var SETTINGSDIRECTORY Var ADDITIONALPARAMETERS Var ALLOWMULTIPLEINSTANCES Var SKIPCHROMEFIX Var SKIPCOMPREGFIX Var EXECSTRING Var PROGRAMEXECUTABLE Var INIPATH Var DISABLESPLASHSCREEN Var DISABLEINTELLIGENTSTART Var ISDEFAULTDIRECTORY Var RUNLOCALLY Var WAITFORPROGRAM Var LASTPROFILEDIRECTORY Var APPDATAPATH Var SECONDARYLAUNCH Var SHOWLICENSE Function .onInit Call GetParameters Pop $0 StrCmp "$0" "SHOWLICENSE" ShowLicense LicenseDone ShowLicense: StrCpy $SHOWLICENSE "true" Goto onInitDone LicenseDone: SetSilent silent Goto onInitDone onInitDone: FunctionEnd Section "Main" ;=== Setup variables ReadEnvStr $APPDATAPATH "APPDATA" ;=== Find the INI file, if there is one IfFileExists "$EXEDIR\${NAME}.ini" "" NoINI StrCpy "$INIPATH" "$EXEDIR" ;=== 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}" "ProfileDirectory" StrCpy $PROFILEDIRECTORY "$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}" "AllowMultipleInstances" StrCpy $ALLOWMULTIPLEINSTANCES $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "SkipChromeFix" StrCpy $SKIPCHROMEFIX $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "SkipCompregFix" StrCpy $SKIPCOMPREGFIX $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "${APP}Executable" StrCpy $PROGRAMEXECUTABLE $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "WaitFor${APP}" StrCpy $WAITFORPROGRAM $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "DisableSplashScreen" StrCpy $DISABLESPLASHSCREEN $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "DisableIntelligentStart" StrCpy $DISABLEINTELLIGENTSTART $0 ReadINIStr $0 "$INIPATH\${NAME}.ini" "${NAME}" "RunLocally" StrCpy $RUNLOCALLY $0 StrCmp $RUNLOCALLY "true" "" CleanUpAnyErrors StrCpy $WAITFORPROGRAM "true" CleanUpAnyErrors: ;=== Any missing unrequired INI entries will be an empty string, ignore associated errors ClearErrors ;=== Check if default directories StrCmp $PROGRAMDIRECTORY "$EXEDIR\App\${DEFAULTAPPDIR}" "" EndINI StrCmp $PROFILEDIRECTORY "$EXEDIR\Data\profile" "" EndINI StrCpy $SETTINGSDIRECTORY "$EXEDIR\Data\settings" "" EndINI StrCpy $ISDEFAULTDIRECTORY "true" EndINI: IfFileExists "$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" FoundProgramEXE NoProgramEXE NoINI: ;=== No INI file, so we'll use the defaults StrCpy $ADDITIONALPARAMETERS "" StrCpy $ALLOWMULTIPLEINSTANCES "false" StrCpy $SKIPCHROMEFIX "false" StrCpy $SKIPCOMPREGFIX "false" StrCpy $WAITFORPROGRAM "false" StrCpy $PROGRAMEXECUTABLE "${DEFAULTEXE}" StrCpy $DISABLESPLASHSCREEN "false" StrCpy $DISABLEINTELLIGENTSTART "false" IfFileExists "$EXEDIR\App\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" CheckPortableProgramDIR StrCpy $PROGRAMDIRECTORY "$EXEDIR\App\${DEFAULTAPPDIR}" StrCpy $PROFILEDIRECTORY "$EXEDIR\Data\profile" StrCpy $SETTINGSDIRECTORY "$EXEDIR\Data\settings" StrCpy $ISDEFAULTDIRECTORY "true" Goto FoundProgramEXE CheckPortableProgramDIR: IfFileExists "$EXEDIR\${NAME}\App\${DEFAULTAPPDIR}\${DEFAULTEXE}" "" NoProgramEXE StrCpy $PROGRAMDIRECTORY "$EXEDIR\${NAME}\App\${DEFAULTAPPDIR}" StrCpy $PROFILEDIRECTORY "$EXEDIR\${NAME}\Data\profile" StrCpy $SETTINGSDIRECTORY "$EXEDIR\${NAME}\Data\settings" Goto FoundProgramEXE NoProgramEXE: ;=== Program executable not where expected MessageBox MB_OK|MB_ICONEXCLAMATION `$PROGRAMEXECUTABLE was not found. Please check your configuration` Abort FoundProgramEXE: IfFileExists "$APPDATA\Mozilla\Sunbird\*.*" CheckIfRunning StrCpy $WAITFORPROGRAM "true" CheckIfRunning: ;=== Check if running StrCmp $ALLOWMULTIPLEINSTANCES "true" ProfileWork FindProcDLL::FindProc "sunbird.exe" StrCmp $R0 "1" "" ProfileWork ;=== Already running, check if it is using the portable profile IfFileExists "$PROFILEDIRECTORY\parent.lock" "" WarnAnotherInstance StrCpy $SECONDARYLAUNCH "true" Goto GetPassedParameters WarnAnotherInstance: MessageBox MB_OK|MB_ICONINFORMATION `Another instance of ${APP} is already running. Please close other instances of ${APP} before launching ${LONGNAME}.` Abort ProfileWork: ;=== Check for an existing profile IfFileExists "$PROFILEDIRECTORY\prefs.js" ProfileFound ;=== No profile was found StrCmp $ISDEFAULTDIRECTORY "true" CopyDefaultProfile MessageBox MB_YESNO|MB_ICONQUESTION `No profile was found. Create a new profile here? $\n$PROFILEDIRECTORY\` IDYES CreateProfile MessageBox MB_OK|MB_ICONINFORMATION `${NAME} can not run without a profile directory. Please check your configuration.` Abort CopyDefaultProfile: CreateDirectory "$EXEDIR\Data" CreateDirectory "$EXEDIR\Data\profile" CreateDirectory "$EXEDIR\Data\settings" CopyFiles /SILENT $EXEDIR\App\DefaultData\profile\*.* $EXEDIR\Data\profile GoTo ProfileFound CreateProfile: IfFileExists "$PROFILEDIRECTORY\*.*" ProfileFound CreateDirectory "$PROFILEDIRECTORY" ProfileFound: IfFileExists "$SETTINGSDIRECTORY\SunbirdPortableSettings.ini" SettingsFound CreateDirectory "$SETTINGSDIRECTORY" FileOpen $R0 "$SETTINGSDIRECTORY\SunbirdPortableSettings.ini" w FileClose $R0 WriteINIStr "$SETTINGSDIRECTORY\SunbirdPortableSettings.ini" "SunbirdPortableSettings" "LastProfileDirectory" "NONE" SettingsFound: StrCmp $SHOWLICENSE "true" "" CheckForLicense WriteINIStr "$SETTINGSDIRECTORY\SunbirdPortableSettings.ini" "SunbirdPortableSettings" "AgreedToLicense" "YES" Goto TheEnd CheckForLicense: ReadINIStr $0 "$SETTINGSDIRECTORY\SunbirdPortableSettings.ini" "SunbirdPortableSettings" "AgreedToLicense" StrCmp $0 "YES" LicenseAgreedTo RelaunchWithLicense RelaunchWithLicense: System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1' ExecWait `$R0 SHOWLICENSE` ReadINIStr $0 "$SETTINGSDIRECTORY\SunbirdPortableSettings.ini" "SunbirdPortableSettings" "AgreedToLicense" StrCmp $0 "YES" LicenseAgreedTo TheEnd LicenseAgreedTo: ;=== Check for read/write StrCmp $RUNLOCALLY "true" DisplaySplash ClearErrors FileOpen $R0 "$PROFILEDIRECTORY\writetest.temp" w IfErrors "" WriteSuccessful ;== Write failed, so we're read-only MessageBox MB_YESNO|MB_ICONQUESTION `${FULLNAME} appears to be running from a location that is read-only. Would you like to temporarily copy it to the local hard drive and run it from there?$\n$\n(Privacy Note: Any personal data within ${FULLNAME} will be copied to a local drive. Although it will be deleted on exit, it may be possible to recover this data later.)` IDYES SwitchToRunLocally MessageBox MB_OK|MB_ICONINFORMATION `${FULLNAME} can not run directly from a read-only location and will now close.` Abort SwitchToRunLocally: StrCpy $RUNLOCALLY "true" Goto DisplaySplash WriteSuccessful: FileClose $R0 Delete "$PROFILEDIRECTORY\writetest.temp" DisplaySplash: StrCmp $DISABLESPLASHSCREEN "true" SkipSplashScreen ;=== Show the splash screen before processing the files InitPluginsDir File /oname=$PLUGINSDIR\splash.jpg "${NAME}.jpg" newadvsplash::show /NOUNLOAD 2000 200 0 -1 /L $PLUGINSDIR\splash.jpg SkipSplashScreen: ;=== Run locally if needed (aka Live) StrCmp $RUNLOCALLY "true" "" CompareProfilePath RMDir /r "$TEMP\${NAME}\" CreateDirectory $TEMP\${NAME}\profile CreateDirectory $TEMP\${NAME}\plugins CreateDirectory $TEMP\${NAME}\program CopyFiles /SILENT $PROFILEDIRECTORY\*.* $TEMP\${NAME}\profile StrCpy $PROFILEDIRECTORY $TEMP\${NAME}\profile CopyFiles /SILENT $PLUGINSDIRECTORY\*.* $TEMP\${NAME}\plugins StrCpy $PROFILEDIRECTORY $TEMP\${NAME}\profile CopyFiles /SILENT $PROGRAMDIRECTORY\*.* $TEMP\${NAME}\program StrCpy $PROGRAMDIRECTORY $TEMP\${NAME}\program Push $TEMP\${NAME} Call Attrib CompareProfilePath: ReadINIStr $LASTPROFILEDIRECTORY "$SETTINGSDIRECTORY\${NAME}Settings.ini" "${NAME}Settings" "LastProfileDirectory" StrCmp $PROFILEDIRECTORY $LASTPROFILEDIRECTORY "" SaveCurrentProfileDirectory StrCmp $DISABLEINTELLIGENTSTART "true" SaveCurrentProfileDirectory StrCpy $SKIPCHROMEFIX "true" StrCpy $SKIPCOMPREGFIX "true" SaveCurrentProfileDirectory: WriteINIStr "$SETTINGSDIRECTORY\${NAME}Settings.ini" "${NAME}Settings" "LastProfileDirectory" "$PROFILEDIRECTORY" ;RunProgram: StrCmp $SKIPCOMPREGFIX "true" GetPassedParameters ;=== Delete component registry to ensure compatibility with all extensions Delete $PROFILEDIRECTORY\compreg.dat GetPassedParameters: ;=== Get any passed parameters Call GetParameters Pop $0 StrCmp "'$0'" "''" "" LaunchProgramParameters ;=== No parameters StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" -profile "$PROFILEDIRECTORY"` Goto CheckMultipleInstances LaunchProgramParameters: StrCpy $EXECSTRING `"$PROGRAMDIRECTORY\$PROGRAMEXECUTABLE" -profile "$PROFILEDIRECTORY" $0` CheckMultipleInstances: StrCmp $ALLOWMULTIPLEINSTANCES "true" "" AdditionalParameters System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("MOZ_NO_REMOTE", "1").r0' AdditionalParameters: StrCmp $ADDITIONALPARAMETERS "" LaunchNow ;=== Additional Parameters StrCpy $EXECSTRING `$EXECSTRING $ADDITIONALPARAMETERS` LaunchNow: StrCmp $SECONDARYLAUNCH "true" StartProgramAndExit StrCmp $WAITFORPROGRAM "true" "" StartProgramAndExit ExecWait $EXECSTRING CheckRunning: Sleep 2000 StrCmp $ALLOWMULTIPLEINSTANCES "true" CheckIfRemoveLocalFiles FindProcDLL::FindProc "sunbird.exe" StrCmp $R0 "1" CheckRunning CleanupRunLocally StartProgramAndExit: Exec $EXECSTRING Goto TheEnd CleanupRunLocally: StrCmp $RUNLOCALLY "true" "" CheckIfRemoveLocalFiles RMDir /r "$TEMP\${NAME}\" CheckIfRemoveLocalFiles: FindProcDLL::FindProc "sunbird.exe" Pop $R0 StrCmp $R0 "1" TheEnd RemoveLocalFiles RemoveLocalFiles: Delete "$APPDATA\Mozilla\Sunbird\pluginreg.dat" RMDir "$APPDATA\Mozilla\Sunbird\" ;=== Will only delete if empty (no /r switch) RMDir "$APPDATA\Mozilla\" ;=== Will only delete if empty (no /r switch) Goto TheEnd TheEnd: newadvsplash::wait SectionEnd