# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. !macro PostUpdate ${CreateShortcutsLog} ; Remove registry entries for non-existent apps and for apps that point to our ; install location in the Software\Zotero key and uninstall registry entries ; that point to our install location for both HKCU and HKLM. SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${RegCleanMain} "Software\Zotero" ${RegCleanUninstall} ${UpdateProtocolHandlers} ; Win7 taskbar and start menu link maintenance Call FixShortcutAppModelIDs ClearErrors WriteRegStr HKLM "Software\Zotero" "${BrandShortName}InstallerTest" "Write Test" ${If} ${Errors} StrCpy $TmpVal "HKCU" ; used primarily for logging ${Else} SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) DeleteRegValue HKLM "Software\Zotero" "${BrandShortName}InstallerTest" StrCpy $TmpVal "HKLM" ; used primarily for logging ${RegCleanMain} "Software\Zotero" ${RegCleanUninstall} ${UpdateProtocolHandlers} ${SetAppLSPCategories} ${LSP_CATEGORIES} ; Win7 taskbar and start menu link maintenance Call FixShortcutAppModelIDs ReadRegStr $0 HKLM "Software\zotero.org\Zotero" "CurrentVersion" ${If} "$0" != "${GREVersion}" WriteRegStr HKLM "Software\zotero.org\Zotero" "CurrentVersion" "${GREVersion}" ${EndIf} ${EndIf} ${SetAppKeys} ${FixClassKeys} ${SetUninstallKeys} !macroend !define PostUpdate "!insertmacro PostUpdate" ; Adds zotero:// protocol handler and makes Zotero open exported bib files !macro SetHandlers Push "$INSTDIR\${FileMainEXE}" Call GetLongPath Pop $8 ${AddHandlerValues} "Software\Classes\zotero" "$\"$8$\" -url $\"%1$\"" \ "$8,1" "Zotero Protocol" "true" "" ; Add handlers for reference formats ${AddHandlerValues} "Software\Classes\ZoteroRIS" "$\"$8$\" -file $\"%1$\"" \ "$8,1" "Research Information Systems Document" "" "" ${AddHandlerValues} "Software\Classes\ZoteroISI" "$\"$8$\" -file $\"%1$\"" \ "$8,1" "ISI Common Export Format Document" "" "" ${AddHandlerValues} "Software\Classes\ZoteroMODS" "$\"$8$\" -file $\"%1$\"" \ "$8,1" "Metadata Object Description Schema Document" "" "" ${AddHandlerValues} "Software\Classes\ZoteroRDF" "$\"$8$\" -file $\"%1$\"" \ "$8,1" "Resource Description Framework Document" "" "" ${AddHandlerValues} "Software\Classes\ZoteroBibTeX" "$\"$8$\" -file $\"%1$\"" \ "$8,1" "BibTeX Document" "" "" ${AddHandlerValues} "Software\Classes\ZoteroMARC" "$\"$8$\" -file $\"%1$\"" \ "$8,1" "MARC Document" "" "" ${AddHandlerValues} "Software\Classes\ZoteroCSL" "$\"$8$\" -file $\"%1$\"" \ "$8,1" "CSL Citation Style" "" "" ; Associate file handlers ReadRegStr $6 SHCTX "Software\Classes\.ris" "" ${If} "$6" != "ZoteroRIS" WriteRegStr SHCTX "Software\Classes\.ris" "" "ZoteroRIS" WriteRegStr SHCTX "Software\Classes\.ris" "Content Type" "application/x-research-info-systems" ${EndIf} ReadRegStr $6 SHCTX "Software\Classes\.mods" "" ${If} "$6" != "ZoteroMODS" WriteRegStr SHCTX "Software\Classes\.mods" "" "ZoteroMODS" WriteRegStr SHCTX "Software\Classes\.mods" "Content Type" "application/mods+xml" ${EndIf} ReadRegStr $6 SHCTX "Software\Classes\.isi" "" ${If} "$6" != "ZoteroMODS" WriteRegStr SHCTX "Software\Classes\.isi" "" "ZoteroISI" WriteRegStr SHCTX "Software\Classes\.isi" "Content Type" "application/x-inst-for-Scientific-info" ${EndIf} ReadRegStr $6 SHCTX "Software\Classes\.rdf" "" ${If} "$6" != "ZoteroRDF" WriteRegStr SHCTX "Software\Classes\.rdf" "" "ZoteroRDF" WriteRegStr SHCTX "Software\Classes\.rdf" "Content Type" "application/rdf+xml" ${EndIf} ReadRegStr $6 SHCTX "Software\Classes\.bib" "" ${If} "$6" != "ZoteroBibTeX" WriteRegStr SHCTX "Software\Classes\.bib" "" "ZoteroBibTeX" WriteRegStr SHCTX "Software\Classes\.bib" "Content Type" "application/x-bibtex" ${EndIf} ReadRegStr $6 SHCTX "Software\Classes\.bibtex" "" ${If} "$6" != "ZoteroMARC" WriteRegStr SHCTX "Software\Classes\.bibtex" "" "ZoteroBibTeX" WriteRegStr SHCTX "Software\Classes\.bibtex" "Content Type" "application/x-bibtex" ${EndIf} ReadRegStr $6 SHCTX "Software\Classes\.marc" "" ${If} "$6" != "ZoteroMARC" WriteRegStr SHCTX "Software\Classes\.marc" "" "ZoteroMARC" WriteRegStr SHCTX "Software\Classes\.marc" "Content Type" "application/marc" ${EndIf} ReadRegStr $6 SHCTX "Software\Classes\.csl" "" ${If} "$6" != "ZoteroCSL" WriteRegStr SHCTX "Software\Classes\.csl" "" "ZoteroCSL" WriteRegStr SHCTX "Software\Classes\.csl" "Content Type" "application/vnd.citationstyles.style+xml" ${EndIf} !macroend !define SetHandlers "!insertmacro SetHandlers" ; Add Software\Zotero\ registry entries (uses SHCTX). !macro SetAppKeys Push $INSTDIR Call GetLongPath Pop $8 StrCpy $0 "Software\Zotero\${BrandFullNameInternal}\${AppVersion} (${AB_CD})\Main" ${WriteRegStr2} $TmpVal "$0" "Install Directory" "$8" 0 ${WriteRegStr2} $TmpVal "$0" "PathToExe" "$8\${FileMainEXE}" 0 StrCpy $0 "Software\Zotero\${BrandFullNameInternal}\${AppVersion} (${AB_CD})\Uninstall" ${WriteRegStr2} $TmpVal "$0" "Description" "${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" 0 StrCpy $0 "Software\Zotero\${BrandFullNameInternal}\${AppVersion} (${AB_CD})" ${WriteRegStr2} $TmpVal "$0" "" "${AppVersion} (${AB_CD})" 0 StrCpy $0 "Software\Zotero\${BrandFullNameInternal} ${AppVersion}\bin" ${WriteRegStr2} $TmpVal "$0" "PathToExe" "$8\${FileMainEXE}" 0 StrCpy $0 "Software\Zotero\${BrandFullNameInternal} ${AppVersion}\extensions" ${WriteRegStr2} $TmpVal "$0" "Components" "$8\components" 0 ${WriteRegStr2} $TmpVal "$0" "Plugins" "$8\plugins" 0 StrCpy $0 "Software\Zotero\${BrandFullNameInternal} ${AppVersion}" ${WriteRegStr2} $TmpVal "$0" "GeckoVer" "${GREVersion}" 0 StrCpy $0 "Software\Zotero\${BrandFullNameInternal}" ${WriteRegStr2} $TmpVal "$0" "" "${GREVersion}" 0 ${WriteRegStr2} $TmpVal "$0" "CurrentVersion" "${AppVersion} (${AB_CD})" 0 !macroend !define SetAppKeys "!insertmacro SetAppKeys" ; Add uninstall registry entries. This macro tests for write access to determine ; if the uninstall keys should be added to HKLM or HKCU. !macro SetUninstallKeys StrCpy $0 "Software\Microsoft\Windows\CurrentVersion\Uninstall\${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" StrCpy $2 "" ClearErrors WriteRegStr HKLM "$0" "${BrandShortName}InstallerTest" "Write Test" ${If} ${Errors} ; If the uninstall keys already exist in HKLM don't create them in HKCU ClearErrors ReadRegStr $2 "HKLM" $0 "DisplayName" ${If} $2 == "" ; Otherwise we don't have any keys for this product in HKLM so proceeed ; to create them in HKCU. Better handling for this will be done in: ; Bug 711044 - Better handling for 2 uninstall icons StrCpy $1 "HKCU" SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${EndIf} ClearErrors ${Else} StrCpy $1 "HKLM" SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) DeleteRegValue HKLM "$0" "${BrandShortName}InstallerTest" ${EndIf} ${If} $2 == "" Push $INSTDIR Call GetLongPath Pop $8 ; Write the uninstall registry keys ${WriteRegStr2} $1 "$0" "Comments" "${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" 0 ${WriteRegStr2} $1 "$0" "DisplayIcon" "$8\${FileMainEXE},0" 0 ${WriteRegStr2} $1 "$0" "DisplayName" "${BrandFullNameInternal}" 0 ${WriteRegStr2} $1 "$0" "DisplayVersion" "${AppVersion}" 0 ${WriteRegStr2} $1 "$0" "InstallLocation" "$8" 0 ${WriteRegStr2} $1 "$0" "Publisher" "Corporation for Digital Scholarship" 0 ${WriteRegStr2} $1 "$0" "UninstallString" "$8\uninstall\helper.exe" 0 ${WriteRegStr2} $1 "$0" "URLInfoAbout" "${URLInfoAbout}" 0 ${WriteRegStr2} $1 "$0" "URLUpdateInfo" "${URLUpdateInfo}" 0 ${WriteRegDWORD2} $1 "$0" "NoModify" 1 0 ${WriteRegDWORD2} $1 "$0" "NoRepair" 1 0 ${GetSize} "$8" "/S=0K" $R2 $R3 $R4 ${WriteRegDWORD2} $1 "$0" "EstimatedSize" $R2 0 ${If} "$TmpVal" == "HKLM" SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) ${Else} SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${EndIf} ${EndIf} !macroend !define SetUninstallKeys "!insertmacro SetUninstallKeys" ; Add app specific handler registry entries under Software\Classes if they ; don't exist (does not use SHCTX). !macro FixClassKeys StrCpy $1 "SOFTWARE\Classes" ; File handler keys and name value pairs that may need to be created during ; install or upgrade. ReadRegStr $0 HKCR ".shtml" "Content Type" ${If} "$0" == "" StrCpy $0 "$1\.shtml" ${WriteRegStr2} $TmpVal "$1\.shtml" "" "shtmlfile" 0 ${WriteRegStr2} $TmpVal "$1\.shtml" "Content Type" "text/html" 0 ${WriteRegStr2} $TmpVal "$1\.shtml" "PerceivedType" "text" 0 ${EndIf} ReadRegStr $0 HKCR ".xht" "Content Type" ${If} "$0" == "" ${WriteRegStr2} $TmpVal "$1\.xht" "" "xhtfile" 0 ${WriteRegStr2} $TmpVal "$1\.xht" "Content Type" "application/xhtml+xml" 0 ${EndIf} ReadRegStr $0 HKCR ".xhtml" "Content Type" ${If} "$0" == "" ${WriteRegStr2} $TmpVal "$1\.xhtml" "" "xhtmlfile" 0 ${WriteRegStr2} $TmpVal "$1\.xhtml" "Content Type" "application/xhtml+xml" 0 ${EndIf} !macroend !define FixClassKeys "!insertmacro FixClassKeys" ; Updates protocol handlers if their registry open command value is for this ; install location (uses SHCTX). !macro UpdateProtocolHandlers ; Store the command to open the app with an url in a register for easy access. Push "$INSTDIR\${FileMainEXE}" Call GetLongPath Pop $8 ; Only set the file and protocol handlers if the existing one under HKCR is ; for this install location. ${IsHandlerForInstallDir} "zotero" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\zotero" "$\"$8$\" -url $\"%1$\"" \ "$8,1" "Zotero" "true" "" ${EndIf} !macroend !define UpdateProtocolHandlers "!insertmacro UpdateProtocolHandlers" ; Removes the application's start menu directory along with its shortcuts if ; they exist and if they exist creates a start menu shortcut in the root of the ; start menu directory (bug 598779). If the application's start menu directory ; is not empty after removing the shortucts the directory will not be removed ; since these additional items were not created by the installer (uses SHCTX). !macro RemoveStartMenuDir ${GetShortcutsLogPath} $0 ${If} ${FileExists} "$0" ; Delete Start Menu Programs shortcuts, directory if it is empty, and ; parent directories if they are empty up to but not including the start ; menu directory. Push $SMPROGRAMS Call GetLongPath Pop $1 ClearErrors ReadINIStr $2 "$0" "SMPROGRAMS" "RelativePathToDir" ${Unless} ${Errors} Push "$1\$2" Call GetLongPath Pop $2 ${If} "$2" != "" ; Delete shortucts in the Start Menu Programs directory. StrCpy $3 0 ${Do} ClearErrors ReadINIStr $4 "$0" "SMPROGRAMS" "Shortcut$3" ; Stop if there are no more entries ${If} ${Errors} ${ExitDo} ${EndIf} ${If} ${FileExists} "$2\$4" ShellLink::GetShortCutTarget "$2\$4" Pop $5 ${If} "$INSTDIR\${FileMainEXE}" == "$5" Delete "$2\$4" ${EndIf} ${EndIf} IntOp $3 $3 + 1 ; Increment the counter ${Loop} ; Delete Start Menu Programs directory and parent directories ${Do} ; Stop if the current directory is the start menu directory ${If} "$1" == "$2" ${ExitDo} ${EndIf} ClearErrors RmDir "$2" ; Stop if removing the directory failed ${If} ${Errors} ${ExitDo} ${EndIf} ${GetParent} "$2" $2 ${Loop} ${EndIf} DeleteINISec "$0" "SMPROGRAMS" ${EndUnless} ${EndIf} !macroend !define RemoveStartMenuDir "!insertmacro RemoveStartMenuDir" ; Creates the shortcuts log ini file with the appropriate entries if it doesn't ; already exist. !macro CreateShortcutsLog ${GetShortcutsLogPath} $0 ${Unless} ${FileExists} "$0" ${LogStartMenuShortcut} "${BrandFullName}.lnk" ${LogQuickLaunchShortcut} "${BrandFullName}.lnk" ${LogDesktopShortcut} "${BrandFullName}.lnk" ${EndUnless} !macroend !define CreateShortcutsLog "!insertmacro CreateShortcutsLog" ; The files to check if they are in use during (un)install so the restart is ; required message is displayed. All files must be located in the $INSTDIR ; directory. !macro PushFilesToCheck ; The first string to be pushed onto the stack MUST be "end" to indicate ; that there are no more files to check in $INSTDIR and the last string ; should be ${FileMainEXE} so if it is in use the CheckForFilesInUse macro ; returns after the first check. Push "end" Push "AccessibleMarshal.dll" Push "freebl3.dll" Push "nssckbi.dll" Push "nspr4.dll" Push "nssdbm3.dll" Push "mozsqlite3.dll" Push "xpcom.dll" Push "crashreporter.exe" Push "updater.exe" Push "${FileMainEXE}" !macroend !define PushFilesToCheck "!insertmacro PushFilesToCheck" ; Helper for updating the shortcut application model IDs. Function FixShortcutAppModelIDs ${UpdateShortcutAppModelIDs} "$INSTDIR\${FileMainEXE}" "${AppUserModelID}" $0 FunctionEnd ; The !ifdef NO_LOG prevents warnings when compiling the installer.nsi due to ; this function only being used by the uninstaller.nsi. !ifdef NO_LOG !endif