]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - win/NSIS.template.in
Use IsCTCP in blockcolor for ignoring CTCPs.
[user/henk/code/inspircd.git] / win / NSIS.template.in
1 ; CPack install script designed for a nmake build\r
2 \r
3 ;--------------------------------\r
4 ; You must define these values\r
5 \r
6   !define VERSION "@CPACK_PACKAGE_VERSION@"\r
7   !define PATCH  "@CPACK_PACKAGE_VERSION_PATCH@"\r
8   !define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@"\r
9 \r
10 ;--------------------------------\r
11 ;Variables\r
12 \r
13   Var MUI_TEMP\r
14   Var STARTMENU_FOLDER\r
15   Var SV_ALLUSERS\r
16   Var START_MENU\r
17   Var DO_NOT_ADD_TO_PATH\r
18   Var ADD_TO_PATH_ALL_USERS\r
19   Var ADD_TO_PATH_CURRENT_USER\r
20   Var INSTALL_DESKTOP\r
21   Var IS_DEFAULT_INSTALLDIR\r
22 ;--------------------------------\r
23 ;Include Modern UI\r
24 \r
25   !include "MUI.nsh"\r
26 \r
27   ;Default installation folder\r
28   InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"\r
29 \r
30 ;--------------------------------\r
31 ;General\r
32 \r
33   ;Name and file\r
34   Name "@CPACK_NSIS_PACKAGE_NAME@"\r
35   OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"\r
36 \r
37   ;Set compression\r
38   SetCompressor @CPACK_NSIS_COMPRESSOR@\r
39 \r
40 @CPACK_NSIS_DEFINES@   \r
41 \r
42   !include Sections.nsh\r
43 \r
44 ;--- Component support macros: ---\r
45 ; The code for the add/remove functionality is from:\r
46 ;   https://nsis.sourceforge.io/Add/Remove_Functionality\r
47 ; It has been modified slightly and extended to provide\r
48 ; inter-component dependencies.\r
49 Var AR_SecFlags\r
50 Var AR_RegFlags\r
51 @CPACK_NSIS_SECTION_SELECTED_VARS@\r
52 \r
53 ; Loads the "selected" flag for the section named SecName into the\r
54 ; variable VarName.\r
55 !macro LoadSectionSelectedIntoVar SecName VarName\r
56  SectionGetFlags ${${SecName}} $${VarName}\r
57  IntOp $${VarName} $${VarName} & ${SF_SELECTED}  ;Turn off all other bits\r
58 !macroend\r
59 \r
60 ; Loads the value of a variable... can we get around this?\r
61 !macro LoadVar VarName\r
62   IntOp $R0 0 + $${VarName}\r
63 !macroend\r
64 \r
65 ; Sets the value of a variable\r
66 !macro StoreVar VarName IntValue\r
67   IntOp $${VarName} 0 + ${IntValue}\r
68 !macroend\r
69 \r
70 !macro InitSection SecName\r
71   ;  This macro reads component installed flag from the registry and\r
72   ;changes checked state of the section on the components page.\r
73   ;Input: section index constant name specified in Section command.\r
74    \r
75   ClearErrors\r
76   ;Reading component status from registry\r
77   ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed"\r
78   IfErrors "default_${SecName}"\r
79     ;Status will stay default if registry value not found\r
80     ;(component was never installed)\r
81   IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits\r
82   SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading default section flags\r
83   IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE  ;Turn lowest (enabled) bit off\r
84   IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags      ;Change lowest bit\r
85 \r
86   ; Note whether this component was installed before\r
87   !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags\r
88   IntOp $R0 $AR_RegFlags & $AR_RegFlags\r
89   \r
90   ;Writing modified flags\r
91   SectionSetFlags ${${SecName}} $AR_SecFlags\r
92   \r
93  "default_${SecName}:"\r
94  !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected\r
95 !macroend\r
96  \r
97 !macro FinishSection SecName\r
98   ;  This macro reads section flag set by user and removes the section\r
99   ;if it is not selected.\r
100   ;Then it writes component installed flag to registry\r
101   ;Input: section index constant name specified in Section command.\r
102  \r
103   SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading section flags\r
104   ;Checking lowest bit:\r
105   IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED}\r
106   IntCmp $AR_SecFlags 1 "leave_${SecName}"\r
107     ;Section is not selected:\r
108     ;Calling Section uninstall macro and writing zero installed flag\r
109     !insertmacro "Remove_${${SecName}}"\r
110     WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \\r
111   "Installed" 0\r
112     Goto "exit_${SecName}"\r
113  \r
114  "leave_${SecName}:"\r
115     ;Section is selected:\r
116     WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \\r
117   "Installed" 1\r
118  \r
119  "exit_${SecName}:"\r
120 !macroend\r
121  \r
122 !macro RemoveSection SecName\r
123   ;  This macro is used to call section's Remove_... macro\r
124   ;from the uninstaller.\r
125   ;Input: section index constant name specified in Section command.\r
126  \r
127   !insertmacro "Remove_${${SecName}}"\r
128 !macroend\r
129 \r
130 ; Determine whether the selection of SecName changed\r
131 !macro MaybeSelectionChanged SecName\r
132   !insertmacro LoadVar ${SecName}_selected\r
133   SectionGetFlags ${${SecName}} $R1\r
134   IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits\r
135   \r
136   ; See if the status has changed:\r
137   IntCmp $R0 $R1 "${SecName}_unchanged"\r
138   !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected\r
139   \r
140   IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected"\r
141   !insertmacro "Deselect_required_by_${SecName}"\r
142   goto "${SecName}_unchanged"\r
143   \r
144   "${SecName}_was_selected:"\r
145   !insertmacro "Select_${SecName}_depends"\r
146   \r
147   "${SecName}_unchanged:"\r
148 !macroend\r
149 ;--- End of Add/Remove macros ---\r
150 \r
151 ;--------------------------------\r
152 ;Interface Settings\r
153 \r
154   !define MUI_HEADERIMAGE\r
155   !define MUI_ABORTWARNING\r
156     \r
157 ;--------------------------------\r
158 ; path functions\r
159 \r
160 !verbose 3\r
161 !include "WinMessages.NSH"\r
162 !verbose 4\r
163 \r
164 ;----------------------------------------\r
165 ; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02"\r
166 ;----------------------------------------\r
167 !verbose 3\r
168 !include "WinMessages.NSH"\r
169 !verbose 4\r
170 ;====================================================\r
171 ; get_NT_environment \r
172 ;     Returns: the selected environment\r
173 ;     Output : head of the stack\r
174 ;====================================================\r
175 !macro select_NT_profile UN\r
176 Function ${UN}select_NT_profile\r
177    StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single\r
178       DetailPrint "Selected environment for all users"\r
179       Push "all"\r
180       Return\r
181    environment_single:\r
182       DetailPrint "Selected environment for current user only."\r
183       Push "current"\r
184       Return\r
185 FunctionEnd\r
186 !macroend\r
187 !insertmacro select_NT_profile ""\r
188 !insertmacro select_NT_profile "un."\r
189 ;----------------------------------------------------\r
190 !define NT_current_env 'HKCU "Environment"'\r
191 !define NT_all_env     'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'\r
192 \r
193 !ifndef WriteEnvStr_RegKey\r
194   !ifdef ALL_USERS\r
195     !define WriteEnvStr_RegKey \\r
196        'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'\r
197   !else\r
198     !define WriteEnvStr_RegKey 'HKCU "Environment"'\r
199   !endif\r
200 !endif\r
201  \r
202 ; AddToPath - Adds the given dir to the search path.\r
203 ;        Input - head of the stack\r
204 ;        Note - Win9x systems requires reboot\r
205  \r
206 Function AddToPath\r
207   Exch $0\r
208   Push $1\r
209   Push $2\r
210   Push $3\r
211  \r
212   # don't add if the path doesn't exist\r
213   IfFileExists "$0\*.*" "" AddToPath_done\r
214  \r
215   ReadEnvStr $1 PATH\r
216   ; if the path is too long for a NSIS variable NSIS will return a 0 \r
217   ; length string.  If we find that, then warn and skip any path\r
218   ; modification as it will trash the existing path.\r
219   StrLen $2 $1\r
220   IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done\r
221     CheckPathLength_ShowPathWarning:\r
222     Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!"\r
223     Goto AddToPath_done\r
224   CheckPathLength_Done:\r
225   Push "$1;"\r
226   Push "$0;"\r
227   Call StrStr\r
228   Pop $2\r
229   StrCmp $2 "" "" AddToPath_done\r
230   Push "$1;"\r
231   Push "$0\;"\r
232   Call StrStr\r
233   Pop $2\r
234   StrCmp $2 "" "" AddToPath_done\r
235   GetFullPathName /SHORT $3 $0\r
236   Push "$1;"\r
237   Push "$3;"\r
238   Call StrStr\r
239   Pop $2\r
240   StrCmp $2 "" "" AddToPath_done\r
241   Push "$1;"\r
242   Push "$3\;"\r
243   Call StrStr\r
244   Pop $2\r
245   StrCmp $2 "" "" AddToPath_done\r
246  \r
247   Call IsNT\r
248   Pop $1\r
249   StrCmp $1 1 AddToPath_NT\r
250     ; Not on NT\r
251     StrCpy $1 $WINDIR 2\r
252     FileOpen $1 "$1\autoexec.bat" a\r
253     FileSeek $1 -1 END\r
254     FileReadByte $1 $2\r
255     IntCmp $2 26 0 +2 +2 # DOS EOF\r
256       FileSeek $1 -1 END # write over EOF\r
257     FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n"\r
258     FileClose $1\r
259     SetRebootFlag true\r
260     Goto AddToPath_done\r
261  \r
262   AddToPath_NT:\r
263     StrCmp $ADD_TO_PATH_ALL_USERS "1" ReadAllKey\r
264       ReadRegStr $1 ${NT_current_env} "PATH"\r
265       Goto DoTrim\r
266     ReadAllKey:\r
267       ReadRegStr $1 ${NT_all_env} "PATH"\r
268     DoTrim:\r
269     StrCmp $1 "" AddToPath_NTdoIt\r
270       Push $1\r
271       Call Trim\r
272       Pop $1\r
273       StrCpy $0 "$1;$0"\r
274     AddToPath_NTdoIt:\r
275       StrCmp $ADD_TO_PATH_ALL_USERS "1" WriteAllKey\r
276         WriteRegExpandStr ${NT_current_env} "PATH" $0\r
277         Goto DoSend\r
278       WriteAllKey:\r
279         WriteRegExpandStr ${NT_all_env} "PATH" $0\r
280       DoSend:\r
281       SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000\r
282  \r
283   AddToPath_done:\r
284     Pop $3\r
285     Pop $2\r
286     Pop $1\r
287     Pop $0\r
288 FunctionEnd\r
289 \r
290  \r
291 ; RemoveFromPath - Remove a given dir from the path\r
292 ;     Input: head of the stack\r
293  \r
294 Function un.RemoveFromPath\r
295   Exch $0\r
296   Push $1\r
297   Push $2\r
298   Push $3\r
299   Push $4\r
300   Push $5\r
301   Push $6\r
302  \r
303   IntFmt $6 "%c" 26 # DOS EOF\r
304  \r
305   Call un.IsNT\r
306   Pop $1\r
307   StrCmp $1 1 unRemoveFromPath_NT\r
308     ; Not on NT\r
309     StrCpy $1 $WINDIR 2\r
310     FileOpen $1 "$1\autoexec.bat" r\r
311     GetTempFileName $4\r
312     FileOpen $2 $4 w\r
313     GetFullPathName /SHORT $0 $0\r
314     StrCpy $0 "SET PATH=%PATH%;$0"\r
315     Goto unRemoveFromPath_dosLoop\r
316  \r
317     unRemoveFromPath_dosLoop:\r
318       FileRead $1 $3\r
319       StrCpy $5 $3 1 -1 # read last char\r
320       StrCmp $5 $6 0 +2 # if DOS EOF\r
321         StrCpy $3 $3 -1 # remove DOS EOF so we can compare\r
322       StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine\r
323       StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine\r
324       StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine\r
325       StrCmp $3 "" unRemoveFromPath_dosLoopEnd\r
326       FileWrite $2 $3\r
327       Goto unRemoveFromPath_dosLoop\r
328       unRemoveFromPath_dosLoopRemoveLine:\r
329         SetRebootFlag true\r
330         Goto unRemoveFromPath_dosLoop\r
331  \r
332     unRemoveFromPath_dosLoopEnd:\r
333       FileClose $2\r
334       FileClose $1\r
335       StrCpy $1 $WINDIR 2\r
336       Delete "$1\autoexec.bat"\r
337       CopyFiles /SILENT $4 "$1\autoexec.bat"\r
338       Delete $4\r
339       Goto unRemoveFromPath_done\r
340  \r
341   unRemoveFromPath_NT:\r
342     StrCmp $ADD_TO_PATH_ALL_USERS "1" unReadAllKey\r
343       ReadRegStr $1 ${NT_current_env} "PATH"\r
344       Goto unDoTrim\r
345     unReadAllKey:\r
346       ReadRegStr $1 ${NT_all_env} "PATH"\r
347     unDoTrim:\r
348     StrCpy $5 $1 1 -1 # copy last char\r
349     StrCmp $5 ";" +2 # if last char != ;\r
350       StrCpy $1 "$1;" # append ;\r
351     Push $1\r
352     Push "$0;"\r
353     Call un.StrStr ; Find `$0;` in $1\r
354     Pop $2 ; pos of our dir\r
355     StrCmp $2 "" unRemoveFromPath_done\r
356       ; else, it is in path\r
357       # $0 - path to add\r
358       # $1 - path var\r
359       StrLen $3 "$0;"\r
360       StrLen $4 $2\r
361       StrCpy $5 $1 -$4 # $5 is now the part before the path to remove\r
362       StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove\r
363       StrCpy $3 $5$6\r
364  \r
365       StrCpy $5 $3 1 -1 # copy last char\r
366       StrCmp $5 ";" 0 +2 # if last char == ;\r
367         StrCpy $3 $3 -1 # remove last char\r
368  \r
369       StrCmp $ADD_TO_PATH_ALL_USERS "1" unWriteAllKey\r
370         WriteRegExpandStr ${NT_current_env} "PATH" $3\r
371         Goto unDoSend\r
372       unWriteAllKey:\r
373         WriteRegExpandStr ${NT_all_env} "PATH" $3\r
374       unDoSend:\r
375       SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000\r
376  \r
377   unRemoveFromPath_done:\r
378     Pop $6\r
379     Pop $5\r
380     Pop $4\r
381     Pop $3\r
382     Pop $2\r
383     Pop $1\r
384     Pop $0\r
385 FunctionEnd\r
386  \r
387 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
388 ; Uninstall sutff\r
389 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
390 \r
391 ###########################################\r
392 #            Utility Functions            #\r
393 ###########################################\r
394  \r
395 ;====================================================\r
396 ; IsNT - Returns 1 if the current system is NT, 0\r
397 ;        otherwise.\r
398 ;     Output: head of the stack\r
399 ;====================================================\r
400 ; IsNT\r
401 ; no input\r
402 ; output, top of the stack = 1 if NT or 0 if not\r
403 ;\r
404 ; Usage:\r
405 ;   Call IsNT\r
406 ;   Pop $R0\r
407 ;  ($R0 at this point is 1 or 0)\r
408  \r
409 !macro IsNT un\r
410 Function ${un}IsNT\r
411   Push $0\r
412   ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion\r
413   StrCmp $0 "" 0 IsNT_yes\r
414   ; we are not NT.\r
415   Pop $0\r
416   Push 0\r
417   Return\r
418  \r
419   IsNT_yes:\r
420     ; NT!!!\r
421     Pop $0\r
422     Push 1\r
423 FunctionEnd\r
424 !macroend\r
425 !insertmacro IsNT ""\r
426 !insertmacro IsNT "un."\r
427  \r
428 ; StrStr\r
429 ; input, top of stack = string to search for\r
430 ;        top of stack-1 = string to search in\r
431 ; output, top of stack (replaces with the portion of the string remaining)\r
432 ; modifies no other variables.\r
433 ;\r
434 ; Usage:\r
435 ;   Push "this is a long ass string"\r
436 ;   Push "ass"\r
437 ;   Call StrStr\r
438 ;   Pop $R0\r
439 ;  ($R0 at this point is "ass string")\r
440  \r
441 !macro StrStr un\r
442 Function ${un}StrStr\r
443 Exch $R1 ; st=haystack,old$R1, $R1=needle\r
444   Exch    ; st=old$R1,haystack\r
445   Exch $R2 ; st=old$R1,old$R2, $R2=haystack\r
446   Push $R3\r
447   Push $R4\r
448   Push $R5\r
449   StrLen $R3 $R1\r
450   StrCpy $R4 0\r
451   ; $R1=needle\r
452   ; $R2=haystack\r
453   ; $R3=len(needle)\r
454   ; $R4=cnt\r
455   ; $R5=tmp\r
456   loop:\r
457     StrCpy $R5 $R2 $R3 $R4\r
458     StrCmp $R5 $R1 done\r
459     StrCmp $R5 "" done\r
460     IntOp $R4 $R4 + 1\r
461     Goto loop\r
462 done:\r
463   StrCpy $R1 $R2 "" $R4\r
464   Pop $R5\r
465   Pop $R4\r
466   Pop $R3\r
467   Pop $R2\r
468   Exch $R1\r
469 FunctionEnd\r
470 !macroend\r
471 !insertmacro StrStr ""\r
472 !insertmacro StrStr "un."\r
473 \r
474 Function Trim ; Added by Pelaca\r
475         Exch $R1\r
476         Push $R2\r
477 Loop:\r
478         StrCpy $R2 "$R1" 1 -1\r
479         StrCmp "$R2" " " RTrim\r
480         StrCmp "$R2" "$\n" RTrim\r
481         StrCmp "$R2" "$\r" RTrim\r
482         StrCmp "$R2" ";" RTrim\r
483         GoTo Done\r
484 RTrim:  \r
485         StrCpy $R1 "$R1" -1\r
486         Goto Loop\r
487 Done:\r
488         Pop $R2\r
489         Exch $R1\r
490 FunctionEnd\r
491 \r
492 Function ConditionalAddToRegisty\r
493   Pop $0\r
494   Pop $1\r
495   StrCmp "$0" "" ConditionalAddToRegisty_EmptyString\r
496     WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \\r
497     "$1" "$0"\r
498     ;MessageBox MB_OK "Set Registry: '$1' to '$0'"\r
499     DetailPrint "Set install registry entry: '$1' to '$0'"\r
500   ConditionalAddToRegisty_EmptyString:\r
501 FunctionEnd\r
502 \r
503 ;--------------------------------\r
504 \r
505 !ifdef CPACK_USES_DOWNLOAD\r
506 Function DownloadFile\r
507     IfFileExists $INSTDIR\* +2\r
508     CreateDirectory $INSTDIR\r
509     Pop $0\r
510 \r
511     ; Skip if already downloaded\r
512     IfFileExists $INSTDIR\$0 0 +2\r
513     Return\r
514 \r
515     StrCpy $1 "@CPACK_DOWNLOAD_SITE@"\r
516 \r
517   try_again:\r
518     NSISdl::download "$1/$0" "$INSTDIR\$0"\r
519     \r
520     Pop $1\r
521     StrCmp $1 "success" success\r
522     StrCmp $1 "Cancelled" cancel\r
523     MessageBox MB_OK "Download failed: $1"\r
524   cancel:\r
525     Return\r
526   success:\r
527 FunctionEnd\r
528 !endif\r
529 \r
530 ;--------------------------------\r
531 ; Installation types\r
532 @CPACK_NSIS_INSTALLATION_TYPES@\r
533 \r
534 ;--------------------------------\r
535 ; Component sections\r
536 @CPACK_NSIS_COMPONENT_SECTIONS@\r
537 \r
538 ;--------------------------------\r
539 ; Define some macro setting for the gui\r
540 @CPACK_NSIS_INSTALLER_MUI_ICON_CODE@\r
541 @CPACK_NSIS_INSTALLER_ICON_CODE@\r
542 @CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@\r
543 @CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@\r
544 \r
545 ;--------------------------------\r
546 ;Pages\r
547   !insertmacro MUI_PAGE_WELCOME\r
548 \r
549   !insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@"\r
550   Page custom InstallOptionsPage\r
551   !insertmacro MUI_PAGE_DIRECTORY\r
552   \r
553   ;Start Menu Folder Page Configuration\r
554   !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" \r
555   !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \r
556   !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"\r
557   !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER\r
558 \r
559   @CPACK_NSIS_PAGE_COMPONENTS@\r
560 \r
561   !insertmacro MUI_PAGE_INSTFILES\r
562   !insertmacro MUI_PAGE_FINISH\r
563 \r
564   !insertmacro MUI_UNPAGE_CONFIRM\r
565   !insertmacro MUI_UNPAGE_INSTFILES\r
566 \r
567 ;--------------------------------\r
568 ;Languages\r
569 \r
570   !insertmacro MUI_LANGUAGE "English" ;first language is the default language\r
571   !insertmacro MUI_LANGUAGE "Albanian"\r
572   !insertmacro MUI_LANGUAGE "Arabic"\r
573   !insertmacro MUI_LANGUAGE "Basque"\r
574   !insertmacro MUI_LANGUAGE "Belarusian"\r
575   !insertmacro MUI_LANGUAGE "Bosnian"\r
576   !insertmacro MUI_LANGUAGE "Breton"\r
577   !insertmacro MUI_LANGUAGE "Bulgarian"\r
578   !insertmacro MUI_LANGUAGE "Croatian"\r
579   !insertmacro MUI_LANGUAGE "Czech"\r
580   !insertmacro MUI_LANGUAGE "Danish"\r
581   !insertmacro MUI_LANGUAGE "Dutch"\r
582   !insertmacro MUI_LANGUAGE "Estonian"\r
583   !insertmacro MUI_LANGUAGE "Farsi"\r
584   !insertmacro MUI_LANGUAGE "Finnish"\r
585   !insertmacro MUI_LANGUAGE "French"\r
586   !insertmacro MUI_LANGUAGE "German"\r
587   !insertmacro MUI_LANGUAGE "Greek"\r
588   !insertmacro MUI_LANGUAGE "Hebrew"\r
589   !insertmacro MUI_LANGUAGE "Hungarian"\r
590   !insertmacro MUI_LANGUAGE "Icelandic"\r
591   !insertmacro MUI_LANGUAGE "Indonesian"\r
592   !insertmacro MUI_LANGUAGE "Irish"\r
593   !insertmacro MUI_LANGUAGE "Italian"\r
594   !insertmacro MUI_LANGUAGE "Japanese"\r
595   !insertmacro MUI_LANGUAGE "Korean"\r
596   !insertmacro MUI_LANGUAGE "Kurdish"\r
597   !insertmacro MUI_LANGUAGE "Latvian"\r
598   !insertmacro MUI_LANGUAGE "Lithuanian"\r
599   !insertmacro MUI_LANGUAGE "Luxembourgish"\r
600   !insertmacro MUI_LANGUAGE "Macedonian"\r
601   !insertmacro MUI_LANGUAGE "Malay"\r
602   !insertmacro MUI_LANGUAGE "Mongolian"\r
603   !insertmacro MUI_LANGUAGE "Norwegian"\r
604   !insertmacro MUI_LANGUAGE "Polish"\r
605   !insertmacro MUI_LANGUAGE "Portuguese"\r
606   !insertmacro MUI_LANGUAGE "PortugueseBR"\r
607   !insertmacro MUI_LANGUAGE "Romanian"\r
608   !insertmacro MUI_LANGUAGE "Russian"\r
609   !insertmacro MUI_LANGUAGE "Serbian"\r
610   !insertmacro MUI_LANGUAGE "SerbianLatin"\r
611   !insertmacro MUI_LANGUAGE "SimpChinese"\r
612   !insertmacro MUI_LANGUAGE "Slovak"\r
613   !insertmacro MUI_LANGUAGE "Slovenian"\r
614   !insertmacro MUI_LANGUAGE "Spanish"\r
615   !insertmacro MUI_LANGUAGE "Swedish"\r
616   !insertmacro MUI_LANGUAGE "Thai"\r
617   !insertmacro MUI_LANGUAGE "TradChinese"\r
618   !insertmacro MUI_LANGUAGE "Turkish"\r
619   !insertmacro MUI_LANGUAGE "Ukrainian"\r
620   !insertmacro MUI_LANGUAGE "Welsh"\r
621 \r
622 \r
623 ;--------------------------------\r
624 ;Reserve Files\r
625 \r
626   ;These files should be inserted before other files in the data block\r
627   ;Keep these lines before any File command\r
628   ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA)\r
629 \r
630   ReserveFile "NSIS.InstallOptions.ini"\r
631   !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS\r
632 \r
633 ;--------------------------------\r
634 ;Installer Sections\r
635 \r
636 Section "-Core installation"\r
637   ;Use the entire tree produced by the INSTALL target.  Keep the\r
638   ;list of directories here in sync with the RMDir commands below.\r
639   SetOutPath "$INSTDIR"\r
640   @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@\r
641   @CPACK_NSIS_FULL_INSTALL@\r
642   \r
643   ;Store installation folder\r
644   WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR\r
645   \r
646   ;Create uninstaller\r
647   WriteUninstaller "$INSTDIR\Uninstall.exe"\r
648   Push "DisplayName"\r
649   Push "@CPACK_NSIS_DISPLAY_NAME@"\r
650   Call ConditionalAddToRegisty\r
651   Push "DisplayVersion"\r
652   Push "@CPACK_PACKAGE_VERSION@"\r
653   Call ConditionalAddToRegisty\r
654   Push "Publisher"\r
655   Push "@CPACK_PACKAGE_VENDOR@"\r
656   Call ConditionalAddToRegisty\r
657   Push "UninstallString"\r
658   Push "$INSTDIR\Uninstall.exe"\r
659   Call ConditionalAddToRegisty\r
660   Push "NoRepair"\r
661   Push "1"\r
662   Call ConditionalAddToRegisty\r
663   \r
664   !ifdef CPACK_NSIS_ADD_REMOVE\r
665   ;Create add/remove functionality\r
666   Push "ModifyPath"\r
667   Push "$INSTDIR\AddRemove.exe"\r
668   Call ConditionalAddToRegisty\r
669   !else\r
670   Push "NoModify"\r
671   Push "1"\r
672   Call ConditionalAddToRegisty\r
673   !endif\r
674   \r
675   ; Optional registration\r
676   Push "DisplayIcon"\r
677   Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@"\r
678   Call ConditionalAddToRegisty\r
679   Push "HelpLink"\r
680   Push "@CPACK_NSIS_HELP_LINK@"\r
681   Call ConditionalAddToRegisty\r
682   Push "URLInfoAbout"\r
683   Push "@CPACK_NSIS_URL_INFO_ABOUT@"\r
684   Call ConditionalAddToRegisty\r
685   Push "Contact"\r
686   Push "@CPACK_NSIS_CONTACT@"\r
687   Call ConditionalAddToRegisty\r
688   !insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP "NSIS.InstallOptions.ini" "Field 5" "State"\r
689   !insertmacro MUI_STARTMENU_WRITE_BEGIN Application\r
690   \r
691   ;Create shortcuts\r
692   CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"\r
693 @CPACK_NSIS_CREATE_ICONS@\r
694 @CPACK_NSIS_CREATE_ICONS_EXTRA@\r
695   CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"\r
696 \r
697   ;Read a value from an InstallOptions INI file\r
698   !insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH "NSIS.InstallOptions.ini" "Field 2" "State"\r
699   !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS "NSIS.InstallOptions.ini" "Field 3" "State"\r
700   !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER "NSIS.InstallOptions.ini" "Field 4" "State"\r
701 \r
702   ; Write special uninstall registry entries\r
703   Push "StartMenu"\r
704   Push "$STARTMENU_FOLDER"\r
705   Call ConditionalAddToRegisty\r
706   Push "DoNotAddToPath"\r
707   Push "$DO_NOT_ADD_TO_PATH"\r
708   Call ConditionalAddToRegisty\r
709   Push "AddToPathAllUsers"\r
710   Push "$ADD_TO_PATH_ALL_USERS"\r
711   Call ConditionalAddToRegisty\r
712   Push "AddToPathCurrentUser"\r
713   Push "$ADD_TO_PATH_CURRENT_USER"\r
714   Call ConditionalAddToRegisty\r
715   Push "InstallToDesktop"\r
716   Push "$INSTALL_DESKTOP"\r
717   Call ConditionalAddToRegisty\r
718 \r
719   !insertmacro MUI_STARTMENU_WRITE_END\r
720   \r
721   detailPrint "Installing InspIRCd service..."\r
722   nsExec::Exec /TIMEOUT=30000 '"$INSTDIR\inspircd.exe" --installservice'\r
723 \r
724 @CPACK_NSIS_EXTRA_INSTALL_COMMANDS@\r
725 \r
726 SectionEnd\r
727 \r
728 Section "-Add to path"\r
729   Push $INSTDIR\bin\r
730   StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 doNotAddToPath\r
731   StrCmp $DO_NOT_ADD_TO_PATH "1" doNotAddToPath 0  \r
732     Call AddToPath\r
733   doNotAddToPath:\r
734 SectionEnd\r
735 \r
736 ;--------------------------------\r
737 ; Create custom pages\r
738 Function InstallOptionsPage\r
739   !insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing @CPACK_NSIS_PACKAGE_NAME@"\r
740   !insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini"\r
741 \r
742 FunctionEnd\r
743 \r
744 ;--------------------------------\r
745 ; determine admin versus local install\r
746 Function un.onInit\r
747 \r
748   ClearErrors\r
749   UserInfo::GetName\r
750   IfErrors noLM\r
751   Pop $0\r
752   UserInfo::GetAccountType\r
753   Pop $1\r
754   StrCmp $1 "Admin" 0 +3\r
755     SetShellVarContext all\r
756     ;MessageBox MB_OK 'User "$0" is in the Admin group'\r
757     Goto done\r
758   StrCmp $1 "Power" 0 +3\r
759     SetShellVarContext all\r
760     ;MessageBox MB_OK 'User "$0" is in the Power Users group'\r
761     Goto done\r
762     \r
763   noLM:\r
764     ;Get installation folder from registry if available\r
765 \r
766   done:\r
767     \r
768 FunctionEnd\r
769 \r
770 ;--- Add/Remove callback functions: ---\r
771 !macro SectionList MacroName\r
772   ;This macro used to perform operation on multiple sections.\r
773   ;List all of your components in following manner here.\r
774 @CPACK_NSIS_COMPONENT_SECTION_LIST@\r
775 !macroend\r
776  \r
777 Section -FinishComponents\r
778   ;Removes unselected components and writes component status to registry\r
779   !insertmacro SectionList "FinishSection"\r
780   \r
781 !ifdef CPACK_NSIS_ADD_REMOVE  \r
782   ; Get the name of the installer executable\r
783   System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'\r
784   StrCpy $R3 $R0\r
785   \r
786   ; Strip off the last 13 characters, to see if we have AddRemove.exe\r
787   StrLen $R1 $R0\r
788   IntOp $R1 $R0 - 13\r
789   StrCpy $R2 $R0 13 $R1\r
790   StrCmp $R2 "AddRemove.exe" addremove_installed\r
791   \r
792   ; We're not running AddRemove.exe, so install it\r
793   CopyFiles $R3 $INSTDIR\AddRemove.exe\r
794   \r
795   addremove_installed:\r
796 !endif\r
797 SectionEnd\r
798 ;--- End of Add/Remove callback functions ---\r
799 \r
800 ;--------------------------------\r
801 ; Component dependencies\r
802 Function .onSelChange\r
803   !insertmacro SectionList MaybeSelectionChanged\r
804 FunctionEnd\r
805 \r
806 ;--------------------------------\r
807 ;Uninstaller Section\r
808 \r
809 Section "Uninstall"\r
810   DetailPrint "Uninstalling InspIRCd service..."\r
811   nsExec::Exec /TIMEOUT=30000 '"$INSTDIR\inspircd.exe" --removeservice'\r
812 \r
813   ReadRegStr $START_MENU SHCTX \\r
814    "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu"\r
815   ;MessageBox MB_OK "Start menu is in: $START_MENU"\r
816   ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \\r
817     "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath"\r
818   ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \\r
819     "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers"\r
820   ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \\r
821     "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser"\r
822   ;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS"\r
823   ReadRegStr $INSTALL_DESKTOP SHCTX \\r
824     "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop"\r
825   ;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP "\r
826 \r
827 @CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@\r
828 \r
829   ;Remove files we installed.\r
830   ;Keep the list of directories here in sync with the File commands above.\r
831 @CPACK_NSIS_DELETE_FILES@\r
832 @CPACK_NSIS_DELETE_DIRECTORIES@\r
833 \r
834 !ifdef CPACK_NSIS_ADD_REMOVE  \r
835   ;Remove the add/remove program\r
836   Delete "$INSTDIR\AddRemove.exe"\r
837 !endif\r
838 \r
839   ;Remove the uninstaller itself.\r
840   Delete "$INSTDIR\Uninstall.exe"\r
841   DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"\r
842 \r
843   ;Remove the installation directory if it is empty.\r
844   RMDir "$INSTDIR"\r
845 \r
846   ; Remove the registry entries.\r
847   DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"\r
848 \r
849   ; Removes all optional components\r
850   !insertmacro SectionList "RemoveSection"\r
851   \r
852   !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP\r
853     \r
854   Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"\r
855 @CPACK_NSIS_DELETE_ICONS@\r
856 @CPACK_NSIS_DELETE_ICONS_EXTRA@\r
857   \r
858   ;Delete empty start menu parent diretories\r
859   StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"\r
860  \r
861   startMenuDeleteLoop:\r
862     ClearErrors\r
863     RMDir $MUI_TEMP\r
864     GetFullPathName $MUI_TEMP "$MUI_TEMP\.."\r
865     \r
866     IfErrors startMenuDeleteLoopDone\r
867   \r
868     StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop\r
869   startMenuDeleteLoopDone:\r
870 \r
871   ; If the user changed the shortcut, then untinstall may not work. This should\r
872   ; try to fix it.\r
873   StrCpy $MUI_TEMP "$START_MENU"\r
874   Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"\r
875 @CPACK_NSIS_DELETE_ICONS_EXTRA@\r
876   \r
877   ;Delete empty start menu parent diretories\r
878   StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"\r
879  \r
880   secondStartMenuDeleteLoop:\r
881     ClearErrors\r
882     RMDir $MUI_TEMP\r
883     GetFullPathName $MUI_TEMP "$MUI_TEMP\.."\r
884     \r
885     IfErrors secondStartMenuDeleteLoopDone\r
886   \r
887     StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop\r
888   secondStartMenuDeleteLoopDone:\r
889 \r
890   DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"\r
891 \r
892   Push $INSTDIR\bin\r
893   StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0\r
894     Call un.RemoveFromPath\r
895   doNotRemoveFromPath:\r
896 SectionEnd\r
897 \r
898 ;--------------------------------\r
899 ; determine admin versus local install\r
900 ; Is install for "AllUsers" or "JustMe"?\r
901 ; Default to "JustMe" - set to "AllUsers" if admin or on Win9x\r
902 ; This function is used for the very first "custom page" of the installer.\r
903 ; This custom page does not show up visibly, but it executes prior to the\r
904 ; first visible page and sets up $INSTDIR properly...\r
905 ; Choose different default installation folder based on SV_ALLUSERS...\r
906 ; "Program Files" for AllUsers, "My Documents" for JustMe...\r
907 \r
908 Function .onInit\r
909   StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst\r
910 \r
911   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@" "UninstallString"\r
912   StrCmp $0 "" inst\r
913 \r
914   MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \\r
915   "@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \\r
916   IDYES uninst IDNO inst\r
917   Abort\r
918 \r
919 ;Run the uninstaller\r
920 uninst:\r
921   ClearErrors\r
922   ExecWait '$0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file\r
923 \r
924   IfErrors uninst_failed inst\r
925 uninst_failed:\r
926   MessageBox MB_OK|MB_ICONSTOP "Uninstall failed."\r
927   Abort\r
928 \r
929 \r
930 inst:\r
931   ; Reads components status for registry\r
932   !insertmacro SectionList "InitSection"\r
933 \r
934   ; check to see if /D has been used to change \r
935   ; the install directory by comparing it to the \r
936   ; install directory that is expected to be the\r
937   ; default\r
938   StrCpy $IS_DEFAULT_INSTALLDIR 0\r
939   StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2\r
940     StrCpy $IS_DEFAULT_INSTALLDIR 1\r
941   \r
942   StrCpy $SV_ALLUSERS "JustMe"\r
943   ; if default install dir then change the default\r
944   ; if it is installed for JustMe\r
945   StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2\r
946     StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@"\r
947 \r
948   ClearErrors\r
949   UserInfo::GetName\r
950   IfErrors noLM\r
951   Pop $0\r
952   UserInfo::GetAccountType\r
953   Pop $1\r
954   StrCmp $1 "Admin" 0 +4\r
955     SetShellVarContext all\r
956     ;MessageBox MB_OK 'User "$0" is in the Admin group'\r
957     StrCpy $SV_ALLUSERS "AllUsers"\r
958     Goto done\r
959   StrCmp $1 "Power" 0 +4\r
960     SetShellVarContext all\r
961     ;MessageBox MB_OK 'User "$0" is in the Power Users group'\r
962     StrCpy $SV_ALLUSERS "AllUsers"\r
963     Goto done\r
964     \r
965   noLM:\r
966     StrCpy $SV_ALLUSERS "AllUsers"\r
967     ;Get installation folder from registry if available\r
968 \r
969   done:\r
970   StrCmp $SV_ALLUSERS "AllUsers" 0 +3\r
971     StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2\r
972       StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@"\r
973 \r
974   StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 noOptionsPage\r
975     !insertmacro MUI_INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini"\r
976 \r
977   noOptionsPage:\r
978 FunctionEnd\r