grim/guifications2

Re-releasing
org.guifications.gf2 gf_2_14
2007-05-05, Gary Kramlich
ac214298c9ad
Re-releasing
; NSIS Script For Guifications Plugin
; Author Daniel A. Atallah
; Based on the Pidgin installer by Herman Bloggs and the Pidgin-Encryption installer by Bill Tompkins
; Uses NSIS v2.0
;--------------------------------
;Include Modern UI
!include "MUI.nsh"
;--------------------------------
;General
Name "Pidgin Guifications ${GUIFICATIONS_VERSION}"
;Do A CRC Check
CRCCheck On
;Output File Name
OutFile "pidgin-guifications-${GUIFICATIONS_VERSION}.exe"
;The Default Installation Directory
InstallDir "$PROGRAMFILES\pidgin"
InstallDirRegKey HKLM SOFTWARE\pidgin ""
ShowInstDetails show
ShowUnInstDetails show
SetCompressor /SOLID lzma
!define GUIFICATIONS_UNINST_EXE "pidgin-guifications-uninst.exe"
!define GUIFICATIONS_DLL "guifications.dll"
!define GUIFICATIONS_UNINSTALL_LNK "Guifications Uninstall.lnk"
;--------------------------------
; Registry keys:
!define GUIFICATIONS_REG_KEY "SOFTWARE\pidgin-guifications"
!define GUIFICATIONS_UNINSTALL_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\pidgin-guifications"
;-------------------------------
; Pidgin Plugin installer helper stuff
!addincludedir "${PIDGIN_TREE_TOP}\pidgin\win32\nsis"
!include "pidgin-plugin.nsh"
;--------------------------------
; Modern UI Configuration
!define MUI_ICON .\nsis\install.ico
!define MUI_UNICON .\nsis\install.ico
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "nsis\header.bmp"
!define MUI_CUSTOMFUNCTION_GUIINIT gf_checkPidginVersion
!define MUI_ABORTWARNING
;--------------------------------
; Pages
;Welcome Page
!define MUI_WELCOMEPAGE_TITLE $(WELCOME_TITLE)
!define MUI_WELCOMEPAGE_TEXT $(WELCOME_TEXT)
!insertmacro MUI_PAGE_WELCOME
;License Page
!define MUI_LICENSEPAGE_RADIOBUTTONS
!insertmacro MUI_PAGE_LICENSE ".\COPYING"
;Directory Page
!define MUI_DIRECTORYPAGE_TEXT_TOP $(DIR_SUBTITLE)
!define MUI_DIRECTORYPAGE_TEXT_DESTINATION $(DIR_INNERTEXT)
!insertmacro MUI_PAGE_DIRECTORY
;Installation Page
!insertmacro MUI_PAGE_INSTFILES
;Finish Page
!define MUI_FINISHPAGE_TITLE $(FINISH_TITLE)
!define MUI_FINISHPAGE_TEXT $(FINISH_TEXT)
!insertmacro MUI_PAGE_FINISH
;--------------------------------
; Languages
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Italian"
!insertmacro MUI_LANGUAGE "Spanish"
;Translations
!include "nsis\translations\english.nsh"
!include "nsis\translations\italian.nsh"
!include "nsis\translations\spanish.nsh"
; Uninstall the previous version if it exists
Section -SecUninstallOldPlugin
; Check install rights..
Call CheckUserInstallRights
Pop $R0
StrCmp $R0 "HKLM" rights_hklm
StrCmp $R0 "HKCU" rights_hkcu done
rights_hkcu:
ReadRegStr $R1 HKCU "${GUIFICATIONS_REG_KEY}" ""
ReadRegStr $R2 HKCU "${GUIFICATIONS_REG_KEY}" "Version"
ReadRegStr $R3 HKCU "${GUIFICATIONS_UNINSTALL_KEY}" "UninstallString"
Goto try_uninstall
rights_hklm:
ReadRegStr $R1 HKLM "${GUIFICATIONS_REG_KEY}" ""
ReadRegStr $R2 HKLM "${GUIFICATIONS_REG_KEY}" "Version"
ReadRegStr $R3 HKLM "${GUIFICATIONS_UNINSTALL_KEY}" "UninstallString"
; If previous version exists .. remove
try_uninstall:
StrCmp $R1 "" done
StrCmp $R2 "" uninstall_problem
IfFileExists $R3 0 uninstall_problem
; Have uninstall string.. go ahead and uninstall.
SetOverwrite on
; Need to copy uninstaller outside of the install dir
ClearErrors
CopyFiles /SILENT $R3 "$TEMP\${GUIFICATIONS_UNINST_EXE}"
SetOverwrite off
IfErrors uninstall_problem
; Ready to uninstall..
ClearErrors
ExecWait '"$TEMP\${GUIFICATIONS_UNINST_EXE}" /S _?=$R1'
IfErrors exec_error
Delete "$TEMP\${GUIFICATIONS_UNINST_EXE}"
Goto done
exec_error:
Delete "$TEMP\${GUIFICATIONS_UNINST_EXE}"
Goto uninstall_problem
uninstall_problem:
; Just delete the plugin and uninstaller, and remove Registry key
MessageBox MB_YESNO $(GUIFICATIONS_PROMPT_WIPEOUT) IDYES do_wipeout IDNO cancel_install
cancel_install:
Quit
do_wipeout:
StrCmp $R0 "HKLM" del_lm_reg del_cu_reg
del_cu_reg:
DeleteRegKey HKCU ${GUIFICATIONS_REG_KEY}
Goto uninstall_prob_cont
del_lm_reg:
DeleteRegKey HKLM ${GUIFICATIONS_REG_KEY}
uninstall_prob_cont:
; plugin DLL
Delete "$R1\plugins\${GUIFICATIONS_DLL}"
; pixmaps
RMDir /r "$R1\pixmaps\pidgin\guifications"
Delete "$R3"
done:
SectionEnd
Section "Install"
Call CheckUserInstallRights
Pop $R0
StrCmp $R0 "NONE" instrights_none
StrCmp $R0 "HKLM" instrights_hklm instrights_hkcu
instrights_hklm:
; Write the version registry keys:
WriteRegStr HKLM ${GUIFICATIONS_REG_KEY} "" "$INSTDIR"
WriteRegStr HKLM ${GUIFICATIONS_REG_KEY} "Version" "${GUIFICATIONS_VERSION}"
; Write the uninstall keys for Windows
WriteRegStr HKLM ${GUIFICATIONS_UNINSTALL_KEY} "DisplayName" "$(GUIFICATIONS_UNINSTALL_DESC)"
WriteRegStr HKLM ${GUIFICATIONS_UNINSTALL_KEY} "UninstallString" "$INSTDIR\${GUIFICATIONS_UNINST_EXE}"
SetShellVarContext "all"
Goto install_files
instrights_hkcu:
; Write the version registry keys:
WriteRegStr HKCU ${GUIFICATIONS_REG_KEY} "" "$INSTDIR"
WriteRegStr HKCU ${GUIFICATIONS_REG_KEY} "Version" "${GUIFICATIONS_VERSION}"
; Write the uninstall keys for Windows
WriteRegStr HKCU ${GUIFICATIONS_UNINSTALL_KEY} "DisplayName" "$(GUIFICATIONS_UNINSTALL_DESC)"
WriteRegStr HKCU ${GUIFICATIONS_UNINSTALL_KEY} "UninstallString" "$INSTDIR\${GUIFICATIONS_UNINST_EXE}"
Goto install_files
instrights_none:
; No registry keys for us...
install_files:
SetOutPath "$INSTDIR\plugins"
SetCompress Auto
SetOverwrite on
File "src\${GUIFICATIONS_DLL}"
SetOutPath "$INSTDIR\pixmaps\pidgin\guifications\conf"
File "pixmaps\*.png"
SetOutPath "$INSTDIR\pixmaps\pidgin\guifications\themes\default"
File "themes\default\theme.xml"
File "themes\default\background.png"
SetOutPath "$INSTDIR\pixmaps\pidgin\guifications\themes\mini"
File "themes\mini\theme.xml"
File "themes\mini\background.png"
SetOutPath "$INSTDIR\pixmaps\pidgin\guifications\themes\Penguins"
File "themes\Penguins\theme.xml"
File "themes\Penguins\penguin.png"
; translations - if there is a way to automate this, i can't find it
SetOutPath "$INSTDIR\locale\de\LC_MESSAGES"
File /oname=guifications.mo po\de.gmo
SetOutPath "$INSTDIR\locale\en_AU\LC_MESSAGES"
File /oname=guifications.mo po\en_AU.gmo
SetOutPath "$INSTDIR\locale\en_GB\LC_MESSAGES"
File /oname=guifications.mo po\en_GB.gmo
SetOutPath "$INSTDIR\locale\es\LC_MESSAGES"
File /oname=guifications.mo po\es.gmo
SetOutPath "$INSTDIR\locale\fr\LC_MESSAGES"
File /oname=guifications.mo po\fr.gmo
SetOutPath "$INSTDIR\locale\he\LC_MESSAGES"
File /oname=guifications.mo po\he.gmo
SetOutPath "$INSTDIR\locale\it\LC_MESSAGES"
File /oname=guifications.mo po\it.gmo
SetOutPath "$INSTDIR\locale\ja\LC_MESSAGES"
File /oname=guifications.mo po\ja.gmo
SetOutPath "$INSTDIR\locale\nl\LC_MESSAGES"
File /oname=guifications.mo po\nl.gmo
SetOutPath "$INSTDIR\locale\no\LC_MESSAGES"
File /oname=guifications.mo po\no.gmo
SetOutPath "$INSTDIR\locale\pt\LC_MESSAGES"
File /oname=guifications.mo po\pt.gmo
SetOutPath "$INSTDIR\locale\sk\LC_MESSAGES"
file /oname=guifications.mo po\sk.gmo
SetOutPath "$INSTDIR\locale\sv\LC_MESSAGES"
File /oname=guifications.mo po\sv.gmo
SetOutPath "$INSTDIR\locale\zh_CN\LC_MESSAGES"
File /oname=guifications.mo po\zh_CN.gmo
SetOutPath "$INSTDIR\locale\zh_TW\LC_MESSAGES"
File /oname=guifications.mo po\zh_TW.gmo
StrCmp $R0 "NONE" done
CreateShortCut "$SMPROGRAMS\Pidgin\${GUIFICATIONS_UNINSTALL_LNK}" "$INSTDIR\${GUIFICATIONS_UNINST_EXE}"
WriteUninstaller "$INSTDIR\${GUIFICATIONS_UNINST_EXE}"
SetOverWrite off
done:
SectionEnd
Section Uninstall
Call un.CheckUserInstallRights
Pop $R0
StrCmp $R0 "NONE" no_rights
StrCmp $R0 "HKCU" try_hkcu try_hklm
try_hkcu:
ReadRegStr $R0 HKCU "${GUIFICATIONS_REG_KEY}" ""
StrCmp $R0 $INSTDIR 0 cant_uninstall
; HKCU install path matches our INSTDIR.. so uninstall
DeleteRegKey HKCU "${GUIFICATIONS_REG_KEY}"
DeleteRegKey HKCU "${GUIFICATIONS_UNINSTALL_KEY}"
Goto cont_uninstall
try_hklm:
ReadRegStr $R0 HKLM "${GUIFICATIONS_REG_KEY}" ""
StrCmp $R0 $INSTDIR 0 try_hkcu
; HKLM install path matches our INSTDIR.. so uninstall
DeleteRegKey HKLM "${GUIFICATIONS_REG_KEY}"
DeleteRegKey HKLM "${GUIFICATIONS_UNINSTALL_KEY}"
; Sets start menu and desktop scope to all users..
SetShellVarContext "all"
cont_uninstall:
; plugin
Delete "$INSTDIR\plugins\${GUIFICATIONS_DLL}"
; pixmaps
RMDir /r "$INSTDIR\pixmaps\pidgin\guifications"
; translations
; loop through locale dirs and try to delete any guifications translations
ClearErrors
FindFirst $R1 $R2 "$INSTDIR\locale\*"
IfErrors doneFindingTranslations
processCurrentTranslationDir:
;Ignore "." and ".."
StrCmp $R2 "." readNextTranslationDir
StrCmp $R2 ".." readNextTranslationDir
IfFileExists "$INSTDIR\locale\$R2\LC_MESSAGES\guifications.mo" +1 readNextTranslationDir
Delete "$INSTDIR\locale\$R2\LC_MESSAGES\guifications.mo"
RMDir "$INSTDIR\locale\$R2\LC_MESSAGES"
RMDir "$INSTDIR\locale\$R2"
ClearErrors
readNextTranslationDir:
FindNext $R1 $R2
IfErrors doneFindingTranslations processCurrentTranslationDir
doneFindingTranslations:
FindClose $R1
RMDir "$INSTDIR\locale"
; uninstaller
Delete "$INSTDIR\${GUIFICATIONS_UNINST_EXE}"
; uninstaller shortcut
Delete "$SMPROGRAMS\Pidgin\${GUIFICATIONS_UNINSTALL_LNK}"
; try to delete the Pidgin directories, in case it has already uninstalled
RMDir "$INSTDIR\plugins"
RMDir "$INSTDIR"
RMDir "$SMPROGRAMS\Pidgin"
Goto done
cant_uninstall:
MessageBox MB_OK $(un.GUIFICATIONS_UNINSTALL_ERROR_1) IDOK
Quit
no_rights:
MessageBox MB_OK $(un.GUIFICATIONS_UNINSTALL_ERROR_2) IDOK
Quit
done:
SectionEnd
; Check that the selected installation dir contains pidgin.exe
Function .onVerifyInstDir
IfFileExists $INSTDIR\pidgin.exe +2
Abort
FunctionEnd
; Check that the currently installed pidgin version is compatible with the version of guifications we are installing
Function gf_checkPidginVersion
Push $R0
Push ${PIDGIN_VERSION}
Call CheckPidginVersion
Pop $R0
StrCmp $R0 ${PIDGIN_VERSION_OK} gf_checkPidginVersion_OK
StrCmp $R0 ${PIDGIN_VERSION_INCOMPATIBLE} +1 +6
Call GetPidginVersion
IfErrors +3
Pop $R0
MessageBox MB_OK|MB_ICONSTOP "$(BAD_PIDGIN_VERSION_1) $R0 $(BAD_PIDGIN_VERSION_2)"
goto +2
MessageBox MB_OK|MB_ICONSTOP "$(NO_PIDGIN_VERSION)"
Quit
gf_checkPidginVersion_OK:
Pop $R0
FunctionEnd
Function CheckUserInstallRights
ClearErrors
UserInfo::GetName
IfErrors Win9x
Pop $0
UserInfo::GetAccountType
Pop $1
StrCmp $1 "Admin" 0 +3
StrCpy $1 "HKLM"
Goto done
StrCmp $1 "Power" 0 +3
StrCpy $1 "HKLM"
Goto done
StrCmp $1 "User" 0 +3
StrCpy $1 "HKCU"
Goto done
StrCmp $1 "Guest" 0 +3
StrCpy $1 "NONE"
Goto done
; Unknown error
StrCpy $1 "NONE"
Goto done
Win9x:
StrCpy $1 "HKLM"
done:
Push $1
FunctionEnd
; This is necessary because the uninstaller doesn't have access to installer functions
; (it is identical to CheckUserInstallRights)
Function un.CheckUserInstallRights
ClearErrors
UserInfo::GetName
IfErrors Win9x
Pop $0
UserInfo::GetAccountType
Pop $1
StrCmp $1 "Admin" 0 +3
StrCpy $1 "HKLM"
Goto done
StrCmp $1 "Power" 0 +3
StrCpy $1 "HKLM"
Goto done
StrCmp $1 "User" 0 +3
StrCpy $1 "HKCU"
Goto done
StrCmp $1 "Guest" 0 +3
StrCpy $1 "NONE"
Goto done
; Unknown error
StrCpy $1 "NONE"
Goto done
Win9x:
StrCpy $1 "HKLM"
done:
Push $1
FunctionEnd