]> git.street.me.uk Git - andy/viking.git/blob - win32/installer/viking-installer.nsi
[WINDOWS] .vik file registration is automatic, .gpx is optional
[andy/viking.git] / win32 / installer / viking-installer.nsi
1 ; Installer script for win32 Viking
2 ; Based on Win32 Pidgin installer by Herman Bloggs <hermanator12002@yahoo.com>
3 ; and Daniel Atallah <daniel_atallah@yahoo.com>
4 ; Heavily modified for Viking by Mathieu Albinet <mathieu_a@users.sourceforge.net>
5
6 ;--------------------------------
7 ;Global Variables
8 Var name
9
10 ;--------------------------------
11 ;Configuration
12 ;Needs to be 4 numbers:  W.X.Y.Z
13 !define VIKING_VERSION  "1.5.0.0"
14
15 ;The name var is set in .onInit
16 Name $name
17
18 OutFile "viking-${VIKING_VERSION}.exe"
19
20 SetCompressor /SOLID lzma
21 ShowInstDetails show
22 ShowUninstDetails show
23 SetDateSave on
24
25 ; $name and $INSTDIR are set in .onInit function..
26
27 !include "MUI.nsh"
28 !include "Sections.nsh"
29 !include "WinVer.nsh"
30 !include "LogicLib.nsh"
31 ;; http://nsis.sourceforge.net/File_Association
32 !include "FileAssociation.nsh"
33
34 !include "FileFunc.nsh"
35 !insertmacro GetParameters
36 !insertmacro GetOptions
37 !insertmacro GetParent
38
39 !include "WordFunc.nsh"
40
41 ;--------------------------------
42 ;Defines
43
44 !define VIKING_NSIS_INCLUDE_PATH                "."
45
46 ; Remove these and the stuff that uses them at some point
47 !define VIKING_REG_KEY                          "SOFTWARE\viking"
48 !define VIKING_UNINSTALL_KEY                    "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\viking"
49
50 !define HKLM_APP_PATHS_KEY                      "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\viking.exe"
51 !define VIKING_UNINST_EXE                       "viking-uninst.exe"
52
53 ;--------------------------------
54 ;Version resource
55 VIProductVersion "${VIKING_VERSION}"
56 VIAddVersionKey "ProductName" "Viking"
57 VIAddVersionKey "FileVersion" "${VIKING_VERSION}"
58 VIAddVersionKey "ProductVersion" "${VIKING_VERSION}"
59 VIAddVersionKey "LegalCopyright" ""
60 VIAddVersionKey "FileDescription" "Viking Installer"
61
62 ;--------------------------------
63 ;Modern UI Configuration
64
65   !define MUI_ICON                              ".\pixmaps\viking_icon.ico"
66   !define MUI_UNICON                            ".\pixmaps\viking_icon.ico"
67 ;  !define MUI_WELCOMEFINISHPAGE_BITMAP         ".\pixmaps\viking-intro.bmp"
68 ;  !define MUI_HEADERIMAGE
69 ;  !define MUI_HEADERIMAGE_BITMAP               ".\pixmaps\viking-header.bmp"
70
71   ; Alter License section
72   !define MUI_LICENSEPAGE_BUTTON                $(VIKING_LICENSE_BUTTON)
73   !define MUI_LICENSEPAGE_TEXT_BOTTOM           $(VIKING_LICENSE_BOTTOM_TEXT)
74
75   !define MUI_LANGDLL_REGISTRY_ROOT "HKCU"
76   !define MUI_LANGDLL_REGISTRY_KEY ${VIKING_REG_KEY}
77   !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
78
79   !define MUI_COMPONENTSPAGE_SMALLDESC
80   !define MUI_ABORTWARNING
81
82   ;Finish Page config
83   !define MUI_FINISHPAGE_NOAUTOCLOSE
84   !define MUI_FINISHPAGE_RUN                    "$INSTDIR\viking.exe"
85   !define MUI_FINISHPAGE_RUN_NOTCHECKED
86   !define MUI_FINISHPAGE_LINK                   $(VIKING_FINISH_VISIT_WEB_SITE)
87   !define MUI_FINISHPAGE_LINK_LOCATION          "http://viking.sourceforge.net"
88
89 ;--------------------------------
90 ;Pages
91
92   !insertmacro MUI_PAGE_WELCOME
93   !insertmacro MUI_PAGE_LICENSE                 ".\bin\COPYING_GPL.txt"
94   !insertmacro MUI_PAGE_COMPONENTS
95
96   ; Viking install dir page
97   !insertmacro MUI_PAGE_DIRECTORY
98
99   !insertmacro MUI_PAGE_INSTFILES
100   !insertmacro MUI_PAGE_FINISH
101
102   !insertmacro MUI_UNPAGE_WELCOME
103   !insertmacro MUI_UNPAGE_CONFIRM
104   !insertmacro MUI_UNPAGE_INSTFILES
105   !insertmacro MUI_UNPAGE_FINISH
106
107 ;--------------------------------
108 ;Languages
109
110   ;; English goes first because its the default. The rest are
111   ;; in alphabetical order (at least the strings actually displayed
112   ;; will be).
113
114   !insertmacro MUI_LANGUAGE "English"
115   !insertmacro MUI_LANGUAGE "French"
116   !insertmacro MUI_LANGUAGE "Spanish"
117
118 ;--------------------------------
119 ;Translations
120
121   !define VIKING_DEFAULT_LANGFILE "${VIKING_NSIS_INCLUDE_PATH}\translations\english.nsh"
122
123   !include "${VIKING_NSIS_INCLUDE_PATH}\langmacros.nsh"
124
125   !insertmacro VIKING_MACRO_INCLUDE_LANGFILE "ENGLISH"          "${VIKING_NSIS_INCLUDE_PATH}\translations\english.nsh"
126   !insertmacro VIKING_MACRO_INCLUDE_LANGFILE "FRENCH"           "${VIKING_NSIS_INCLUDE_PATH}\translations\french.nsh"
127   !insertmacro VIKING_MACRO_INCLUDE_LANGFILE "SPANISH"          "${VIKING_NSIS_INCLUDE_PATH}\translations\spanish.nsh"
128
129 ;--------------------------------
130 ;Reserve Files
131   ; Only need this if using bzip2 compression
132
133   !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
134   !insertmacro MUI_RESERVEFILE_LANGDLL
135   ReserveFile "${NSISDIR}\Plugins\UserInfo.dll"
136
137
138 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
139 ;; Start Install Sections ;;
140 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
141
142 ;--------------------------------
143 ;Uninstall any old version of Viking
144
145 Section -SecUninstallOldViking
146   ; Check install rights..
147   Call CheckUserInstallRights
148   Pop $R0
149
150   ;First try to uninstall Viking
151   StrCpy $R4 ${VIKING_REG_KEY}
152   StrCpy $R5 ${VIKING_UNINSTALL_KEY}
153   StrCpy $R6 ${VIKING_UNINST_EXE}
154   StrCpy $R7 "Viking"
155
156   ;Determine user install rights
157   StrCmp $R0 "HKLM" compare_hklm
158   StrCmp $R0 "HKCU" compare_hkcu done
159
160   compare_hkcu:
161       ReadRegStr $R1 HKCU $R4 ""
162       ReadRegStr $R2 HKCU $R4 "Version"
163       ReadRegStr $R3 HKCU "$R5" "UninstallString"
164       Goto try_uninstall
165
166   compare_hklm:
167       ReadRegStr $R1 HKLM $R4 ""
168       ReadRegStr $R2 HKLM $R4 "Version"
169       ReadRegStr $R3 HKLM "$R5" "UninstallString"
170
171   ; If a previous version exists, remove it
172   try_uninstall:
173     StrCmp $R1 "" done
174       StrCmp $R2 "" uninstall_problem
175         ; Check if we have uninstall string..
176         IfFileExists $R3 0 uninstall_problem
177           ; Have uninstall string, go ahead and uninstall.
178           SetOverwrite on
179           ; Need to copy uninstaller outside of the install dir
180           ClearErrors
181           CopyFiles /SILENT $R3 "$TEMP\$R6"
182           SetOverwrite off
183           IfErrors uninstall_problem
184             ; Ready to uninstall..
185             ClearErrors
186             ExecWait '"$TEMP\$R6" /S _?=$R1'
187             IfErrors exec_error
188               Delete "$TEMP\$R6"
189             Goto done
190
191             exec_error:
192               Delete "$TEMP\$R6"
193               Goto uninstall_problem
194
195         uninstall_problem:
196           ; We can't uninstall.  Either the user must manually uninstall or we ignore and reinstall over it.
197           MessageBox MB_OKCANCEL $(VIKING_PROMPT_CONTINUE_WITHOUT_UNINSTALL) /SD IDOK IDOK done
198           Quit
199   done:
200 SectionEnd
201
202 ;--------------------------------
203 ;Viking Install Section
204
205 Section $(VIKING_SECTION_TITLE) SecViking
206   SectionIn 1 RO
207
208   ; Check install rights..
209   Call CheckUserInstallRights
210   Pop $R0
211   StrCmp $R0 "NONE" viking_none
212   StrCmp $R0 "HKLM" viking_hklm viking_hkcu
213
214   ;Install rights for Local Machine
215   viking_hklm:
216     WriteRegStr HKLM "${HKLM_APP_PATHS_KEY}" "" "$INSTDIR\viking.exe"
217     WriteRegStr HKLM "${HKLM_APP_PATHS_KEY}" "Path" "$R1\bin"
218     WriteRegStr HKLM ${VIKING_REG_KEY} "" "$INSTDIR"
219     WriteRegStr HKLM ${VIKING_REG_KEY} "Version" "${VIKING_VERSION}"
220     WriteRegStr HKLM "${VIKING_UNINSTALL_KEY}" "DisplayName" "Viking"
221     WriteRegStr HKLM "${VIKING_UNINSTALL_KEY}" "DisplayVersion" "${VIKING_VERSION}"
222     WriteRegStr HKLM "${VIKING_UNINSTALL_KEY}" "HelpLink" "http://sourceforge.net/apps/mediawiki/viking/"
223     WriteRegDWORD HKLM "${VIKING_UNINSTALL_KEY}" "NoModify" 1
224     WriteRegDWORD HKLM "${VIKING_UNINSTALL_KEY}" "NoRepair" 1
225     WriteRegStr HKLM "${VIKING_UNINSTALL_KEY}" "UninstallString" "$INSTDIR\${VIKING_UNINST_EXE}"
226     ; Sets scope of the desktop and Start Menu entries for all users.
227     SetShellVarContext "all"
228     Goto viking_install_files
229
230     ;Install rights for Current User only 
231   viking_hkcu:
232     WriteRegStr HKCU ${VIKING_REG_KEY} "" "$INSTDIR"
233     WriteRegStr HKCU ${VIKING_REG_KEY} "Version" "${VIKING_VERSION}"
234     WriteRegStr HKCU "${VIKING_UNINSTALL_KEY}" "DisplayName" "Viking"
235     WriteRegStr HKCU "${VIKING_UNINSTALL_KEY}" "DisplayVersion" "${VIKING_VERSION}"
236     WriteRegStr HKCU "${VIKING_UNINSTALL_KEY}" "HelpLink" "http://sourceforge.net/apps/mediawiki/viking/"
237     WriteRegDWORD HKCU "${VIKING_UNINSTALL_KEY}" "NoModify" 1
238     WriteRegDWORD HKCU "${VIKING_UNINSTALL_KEY}" "NoRepair" 1
239     WriteRegStr HKCU "${VIKING_UNINSTALL_KEY}" "UninstallString" "$INSTDIR\${VIKING_UNINST_EXE}"
240     Goto viking_install_files
241   
242   ;No install rights!
243   viking_none:
244
245   viking_install_files:
246     SetOutPath "$INSTDIR"
247     SetOverwrite on
248
249     File /r .\bin\*.*
250
251     ; If we don't have install rights we're done
252     StrCmp $R0 "NONE" done
253     SetOverwrite off
254
255     ; write out uninstaller
256     SetOverwrite on
257     WriteUninstaller "$INSTDIR\${VIKING_UNINST_EXE}"
258     SetOverwrite off
259
260     ; Always associate Viking file type
261     ${registerExtension} "$INSTDIR\viking.exe" ".vik" "Viking File"
262   done:
263 SectionEnd ; end of default Viking section
264
265 ;--------------------------------
266 ;Shortcuts
267
268 SectionGroup /e $(VIKING_SHORTCUTS_SECTION_TITLE) SecShortcuts
269   ;Desktop shortcuts
270   Section /o $(VIKING_DESKTOP_SHORTCUT_SECTION_TITLE) SecDesktopShortcut
271     SetOverwrite on
272     CreateShortCut "$DESKTOP\Viking.lnk" "$INSTDIR\viking.exe"
273     SetOverwrite off
274   SectionEnd
275   ;Start menu shortcuts
276   Section $(VIKING_STARTMENU_SHORTCUT_SECTION_TITLE) SecStartMenuShortcut
277     SetOverwrite on
278     CreateDirectory "$SMPROGRAMS\Viking"
279     CreateShortCut "$SMPROGRAMS\Viking\Viking.lnk" "$INSTDIR\viking.exe"
280     CreateShortCut "$SMPROGRAMS\Viking\User Manual.lnk" "$INSTDIR\viking.pdf"
281     CreateShortCut "$SMPROGRAMS\Viking\Uninstall.lnk" "$INSTDIR\viking-uninst.exe"
282     SetOverwrite off
283   SectionEnd
284 SectionGroupEnd
285
286 ;--------------------------------
287 ;File association
288
289 Section $(VIKING_FILE_ASSOCIATION_SECTION_TITLE) SecFileAssociation
290   ${registerExtension} "$INSTDIR\viking.exe" ".gpx" "GPX File"
291 SectionEnd
292
293 ;--------------------------------
294 ; GPSBabel Install Section
295 ;
296 Section $(VIKING_GPSBABEL_SECTION_TITLE) SecGPSBabel
297   File "bin\Optional\GPSBabel-1.5.1-Setup.exe"
298   ExecWait '"$INSTDIR\GPSBabel-1.5.1-Setup.exe" /SILENT'
299   Delete "$INSTDIR\GPSBabel-1.5.1-Setup.exe"
300 SectionEnd
301
302 ;--------------------------------
303 ;Uninstaller Section
304
305
306 Section Uninstall
307   Call un.CheckUserInstallRights
308   Pop $R0
309   StrCmp $R0 "NONE" no_rights
310   StrCmp $R0 "HKCU" try_hkcu try_hklm
311
312   try_hkcu:
313     ReadRegStr $R0 HKCU ${VIKING_REG_KEY} ""
314     StrCmp $R0 $INSTDIR 0 cant_uninstall
315       ; HKCU install path matches our INSTDIR so uninstall
316       DeleteRegKey HKCU ${VIKING_REG_KEY}
317       DeleteRegKey HKCU "${VIKING_UNINSTALL_KEY}"
318       Goto cont_uninstall
319
320   try_hklm:
321     ReadRegStr $R0 HKLM ${VIKING_REG_KEY} ""
322     StrCmp $R0 $INSTDIR 0 try_hkcu
323       ; HKLM install path matches our INSTDIR so uninstall
324       DeleteRegKey HKLM ${VIKING_REG_KEY}
325       DeleteRegKey HKLM "${VIKING_UNINSTALL_KEY}"
326       DeleteRegKey HKLM "${HKLM_APP_PATHS_KEY}"
327       ; Sets start menu and desktop scope to all users..
328       SetShellVarContext "all"
329
330   cont_uninstall:
331
332     ;Simply wipe the Viking install dir
333     RMDir /r "$INSTDIR"
334
335     ; Shortcuts..
336     Delete "$DESKTOP\Viking.lnk"
337
338     ; File association
339     ${unregisterExtension} ".vik" "Viking File"
340     ${unregisterExtension} ".gpx" "GPX File"
341
342     Goto done
343
344   cant_uninstall:
345     MessageBox MB_OK $(un.VIKING_UNINSTALL_ERROR_1) /SD IDOK
346     Quit
347
348   no_rights:
349     MessageBox MB_OK $(un.VIKING_UNINSTALL_ERROR_2) /SD IDOK
350     Quit
351
352   done:
353 SectionEnd ; end of uninstall section
354
355 ;--------------------------------
356 ;Descriptions
357 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
358
359   !insertmacro MUI_DESCRIPTION_TEXT ${SecViking} \
360         $(VIKING_SECTION_DESCRIPTION)
361   !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} \
362         $(VIKING_SHORTCUTS_SECTION_DESCRIPTION)
363   !insertmacro MUI_DESCRIPTION_TEXT ${SecDesktopShortcut} \
364         $(VIKING_DESKTOP_SHORTCUT_DESC)
365   !insertmacro MUI_DESCRIPTION_TEXT ${SecStartMenuShortcut} \
366         $(VIKING_STARTMENU_SHORTCUT_DESC)
367   !insertmacro MUI_DESCRIPTION_TEXT ${SecFileAssociation} \
368         $(VIKING_FILE_ASSOCIATION_DESC)
369   !insertmacro MUI_DESCRIPTION_TEXT ${SecGPSBabel} \
370         $(VIKING_INSTALL_GPSBABEL_DESC)
371
372 !insertmacro MUI_FUNCTION_DESCRIPTION_END
373
374 ;--------------------------------
375 ;Functions
376
377 ;Macro to determine user install rights
378 ;Will be used to determine where to install the program, shortcuts, ...
379 !macro CheckUserInstallRightsMacro UN
380 Function ${UN}CheckUserInstallRights
381   Push $0
382   Push $1
383   ClearErrors
384   UserInfo::GetName
385   IfErrors Win9x
386   Pop $0
387   UserInfo::GetAccountType
388   Pop $1
389
390   StrCmp $1 "Admin" 0 +3
391     StrCpy $1 "HKLM"
392     Goto done
393   StrCmp $1 "Power" 0 +3
394     StrCpy $1 "HKLM"
395     Goto done
396   StrCmp $1 "User" 0 +3
397     StrCpy $1 "HKCU"
398     Goto done
399   StrCmp $1 "Guest" 0 +3
400     StrCpy $1 "NONE"
401     Goto done
402   ; Unknown error
403   StrCpy $1 "NONE"
404   Goto done
405
406   Win9x:
407     StrCpy $1 "HKLM"
408
409   done:
410     Exch $1
411     Exch
412     Pop $0
413 FunctionEnd
414 !macroend
415 !insertmacro CheckUserInstallRightsMacro ""
416 !insertmacro CheckUserInstallRightsMacro "un."
417
418 ;Macro to determine if Viking is running before installation/unistallation
419 !macro RunCheckMacro UN
420 Function ${UN}RunCheck
421   FindProcDLL::FindProc "viking.exe"
422   IntCmp $R0 1 0 notRunning
423     MessageBox MB_OK|MB_ICONEXCLAMATION $(VIKING_IS_RUNNING) /SD IDOK
424     Abort
425   notRunning:
426 FunctionEnd
427 !macroend
428
429 !insertmacro RunCheckMacro ""
430 !insertmacro RunCheckMacro "un."
431
432 ;Installer extra configuration at execution time: language, path, ...
433 Function .onInit
434   ;Check if viking installer is already running
435   Push $R0
436   Push $R1
437   Push $R2
438
439   ;Check if viking is running
440   Call RunCheck
441   StrCpy $name "Viking ${VIKING_VERSION}"
442
443   ClearErrors
444   ;Make sure that there was a previous installation
445   ReadRegStr $R0 HKCU "${VIKING_REG_KEY}" "Installer Language"
446   
447   ;Preselect the "shortcuts" checkboxes according to the previous installation
448   !insertmacro SelectSection ${SecDesktopShortcut}
449   !insertmacro selectSection ${SecStartMenuShortcut}
450   
451   ;Read command line parameters
452   
453   ;Read language command line parameters
454   ${GetParameters} $R0
455   ClearErrors
456   ${GetOptions} "$R0" "/L=" $R1
457   IfErrors +3
458   StrCpy $LANGUAGE $R1
459   Goto skip_lang
460
461   ; Select Language
462     ; Display Language selection dialog
463     !insertmacro MUI_LANGDLL_DISPLAY
464     skip_lang:
465
466   ;Read desktop shortcut command line options
467   ClearErrors
468   ${GetOptions} "$R0" "/DS=" $R1
469   IfErrors +8
470   SectionGetFlags ${SecDesktopShortcut} $R2
471   StrCmp "1" $R1 0 +2
472   IntOp $R2 $R2 | ${SF_SELECTED}
473   StrCmp "0" $R1 0 +3
474   IntOp $R1 ${SF_SELECTED} ~
475   IntOp $R2 $R2 & $R1
476   SectionSetFlags ${SecDesktopShortcut} $R2
477
478   ;Read start menu shortcuts command line options
479   ClearErrors
480   ${GetOptions} "$R0" "/SMS=" $R1
481   IfErrors +8
482   SectionGetFlags ${SecStartMenuShortcut} $R2
483   StrCmp "1" $R1 0 +2
484   IntOp $R2 $R2 | ${SF_SELECTED}
485   StrCmp "0" $R1 0 +3
486   IntOp $R1 ${SF_SELECTED} ~
487   IntOp $R2 $R2 & $R1
488   SectionSetFlags ${SecStartMenuShortcut} $R2
489
490   ; If install path was set on the command, use it.
491   StrCmp $INSTDIR "" 0 instdir_done
492
493   ;  If viking is currently installed, we should default to where it is currently installed
494   ClearErrors
495   ReadRegStr $INSTDIR HKCU "${VIKING_REG_KEY}" ""
496   IfErrors +2
497   StrCmp $INSTDIR "" 0 instdir_done
498   ClearErrors
499   ReadRegStr $INSTDIR HKLM "${VIKING_REG_KEY}" ""
500   IfErrors +2
501   StrCmp $INSTDIR "" 0 instdir_done
502
503   Call CheckUserInstallRights
504   Pop $R0
505
506   StrCmp $R0 "HKLM" 0 user_dir
507     StrCpy $INSTDIR "$PROGRAMFILES\Viking"
508     Goto instdir_done
509   user_dir:
510     Push $SMPROGRAMS
511     ${GetParent} $SMPROGRAMS $R2
512     ${GetParent} $R2 $R2
513     StrCpy $INSTDIR "$R2\Viking"
514
515   instdir_done:
516 ;LogSet on
517   Pop $R2
518   Pop $R1
519   Pop $R0
520 FunctionEnd
521
522 Function un.onInit
523   ;Check if viking is running
524   Call un.RunCheck
525   StrCpy $name "Viking ${VIKING_VERSION}"
526
527   ; Get stored language preference
528   !insertmacro MUI_UNGETLANGUAGE
529
530 FunctionEnd