Add option --enable-fast-makensis.
[gpg4win.git] / src / installer.nsi
1 # installer.nsi - Installer for GnuPG 4 Windows.    -*- coding: latin-1; -*-
2 # Copyright (C) 2005, 2007 g10 Code GmbH
3
4 # This file is part of GPG4Win.
5
6 # GPG4Win is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10
11 # GPG4Win is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19
20 # No servicable parts beyond this line.  Stay clear :)
21
22 !ifdef REQUIRE_W32_NSIS
23 !ifdef PACKAGE_LIBRARY
24 !include "Library.nsh"
25 !endif
26 !else
27 !macro InstallLib libtype shared install localfile destfile tempbasedir
28   File "${localfile}"
29 !macroend
30 !endif
31
32 !include "WinMessages.nsh"
33
34 # Define for the registry key to change the environment.  The
35 # commented one may be used if the setting should affect only the
36 # current user.
37 !define Regkey_for_Env \
38     'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
39 # !define Regkey_for_Env 'HKCU "Environment"'
40
41
42 # We use Memento to remember past installation choices.
43 !include Memento.nsh
44 !define MEMENTO_REGISTRY_ROOT HKLM
45 !define MEMENTO_REGISTRY_KEY \
46   Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRETTY_PACKAGE_SHORT}
47
48
49 # We use the modern UI.
50 !include "MUI.nsh"
51
52 # Set the package name.  Note that this name should not be sufficed
53 #  with the version because this would get displayed in the start menu.
54 Name "${PRETTY_PACKAGE}"
55
56
57 # Set the output filename.
58 !ifdef GPG4WIN_LIGHT
59 OutFile "${PACKAGE}-light-${VERSION}.exe"
60 !else
61 OutFile "${PACKAGE}-${VERSION}.exe"
62 !endif
63
64 Icon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
65 UninstallIcon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
66
67 # Set the installation directory.
68 !ifndef INSTALL_DIR
69 !define INSTALL_DIR "${PACKAGE}"
70 !endif
71 InstallDir "$PROGRAMFILES\GNU\${INSTALL_DIR}" 
72
73
74 InstallDirRegKey HKLM "Software\GNU\${PRETTY_PACKAGE_SHORT}" \
75         "Install Directory"
76
77
78 # Add version information to the file properties.
79 VIProductVersion "${PROD_VERSION}"
80 VIAddVersionKey "ProductName" "${PRETTY_PACKAGE_SHORT} (${VERSION})"
81 !ifdef LICENSE_GPL
82 VIAddVersionKey "Comments" \
83    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
84     and/or modify it under the terms of the GNU General Public License.  \
85     You should have received a copy of the GNU General Public License  \
86     along with this software; if not, write to the Free Software  \
87     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
88     MA 02110-1301, USA"
89 !else
90 VIAddVersionKey "Comments" \
91    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
92     and/or modify it under the terms of the GNU Lesser General Public  \
93     License. You should have received a copy of the GNU Lesser General  \
94     Public License along with this software; if not, write to the Free  \
95     Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
96     MA 02110-1301, USA"
97 !endif
98 VIAddVersionKey "CompanyName" "${COMPANY}"
99 VIAddVersionKey "LegalTrademarks" ""
100 VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
101 VIAddVersionKey "FileDescription" "${DESCRIPTION}"
102 VIAddVersionKey "FileVersion" "${PROD_VERSION}"
103
104 # Set to the name of another GnuPG installation if one has been detected
105 Var OtherGnuPGDetected
106
107 # Interface Settings
108
109 # !define MUI_ABORTWARNING
110 !define MUI_FINISHPAGE_NOAUTOCLOSE
111 !define MUI_UNFINISHPAGE_NOAUTOCLOSE
112
113 #!define MUI_HEADERIMAGE
114 #!define MUI_HEADERIMAGE_BITMAP \
115 #               "${TOP_SRCDIR}/doc/logo/gpg4win-logo-150x57.bmp"
116 !define MUI_WELCOMEFINISHPAGE_BITMAP \
117                "${TOP_SRCDIR}/doc/logo/gpg4win-logo-164x314.bmp"
118
119 # Remember the installer language
120
121 !define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
122 !define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}" 
123 !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
124
125 # No Umlaute, please!
126 !define MUI_LANGDLL_INFO "Please choose a language for the setup.$\r$\n\
127 Bitte Sprache des Setups angeben."
128
129 # The list of wizard pages.
130
131 !define MUI_WELCOMEPAGE_TITLE "${WELCOME_TITLE_STR}"
132 !define MUI_WELCOMEPAGE_TEXT "${ABOUT_STR}"
133
134 !insertmacro MUI_PAGE_WELCOME
135
136 !define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
137 !define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
138 !define MUI_LICENSEPAGE_TEXT_BOTTOM "$(T_GPLShort)"
139 !insertmacro MUI_PAGE_LICENSE "${TOP_SRCDIR}/COPYING"
140
141 !define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
142 !insertmacro MUI_PAGE_COMPONENTS
143
144 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckExistingVersion
145 !insertmacro MUI_PAGE_DIRECTORY
146
147 !ifdef HAVE_STARTMENU
148
149 Page custom CustomPageOptions
150
151 Var STARTMENU_FOLDER
152
153 !define MUI_PAGE_CUSTOMFUNCTION_PRE CheckIfStartMenuWanted
154 !define MUI_STARTMENUPAGE_NODISABLE
155 !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM"
156 !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}"
157 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
158
159 !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
160
161 !endif
162
163 !define MUI_PAGE_CUSTOMFUNCTION_PRE PrintCloseOtherApps
164 !insertmacro MUI_PAGE_INSTFILES
165
166 !define MUI_PAGE_CUSTOMFUNCTION_PRE ShowFinalWarnings
167 !define MUI_FINISHPAGE_SHOWREADME "share\gpg4win\README.$(T_LangCode).txt"
168 !define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
169 #!define MUI_FINISHPAGE_RUN
170 #!define MUI_FINISHPAGE_RUN_FUNCTION RunOnFinish
171 #!define MUI_FINISHPAGE_RUN_TEXT "$(T_RunKeyManager)"
172 #!define MUI_FINISHPAGE_RUN_NOTCHECKED
173 !define MUI_FINISHPAGE_LINK "$(T_MoreInfo)"
174 !define MUI_FINISHPAGE_LINK_LOCATION "$(T_MoreInfoURL)"
175 !insertmacro MUI_PAGE_FINISH
176
177
178 # Uninstaller pages.
179
180 !insertmacro MUI_UNPAGE_CONFIRM
181 !insertmacro MUI_UNPAGE_INSTFILES
182
183
184 #Page license
185 #Page components
186 #Page directory
187 #Page instfiles
188 #UninstPage uninstConfirm
189 #UninstPage instfiles
190
191
192 # Language support.  This has to be done after defining the pages, but
193 # before defining the translation strings.  Confusing.
194
195 # Enable this to not filter languages for the current code page.  Note
196 # that languages which are then not filtered out may not be displayed
197 # correctly in the Windows version the user is using.  Not recommended,
198 # but can be useful for testing.
199 !ifdef DEBUG
200 !define MUI_LANGDLL_ALLLANGUAGES
201 !endif
202
203 !insertmacro MUI_LANGUAGE "English"
204 !define PO_HEADER
205 !include "../po/catalogs.nsi"
206 !undef PO_HEADER
207
208 !insertmacro MUI_RESERVEFILE_LANGDLL
209 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
210 ReserveFile "${BUILD_DIR}\g4wihelp.dll"
211 !ifdef SOURCES
212 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-400px.bmp"
213 ReserveFile "${TOP_SRCDIR}\src\gpg4win-splash.wav"
214 !endif
215 ReserveFile "${TOP_SRCDIR}\COPYING"
216 ReserveFile "installer-options.ini"
217 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-164x314.bmp"
218
219 # Language support
220
221 LangString T_LangCode ${LANG_ENGLISH} "en"
222
223 # Startup page
224 LangString T_GPLHeader ${LANG_ENGLISH} \
225   "This software is licensed under the terms of the GNU General Public \
226    License (GPL) which guarantees your freedom to share and change Free \
227    Software."
228
229 LangString T_GPLShort ${LANG_ENGLISH} \
230   "In short: You are allowed to run this software for any purpose. \
231    You may distribute it as long as you give the recipients the same \
232    rights you have received."
233
234 LangString T_RunKeyManager ${LANG_ENGLISH} \
235    "Run the key manager"
236
237 LangString T_MoreInfo ${LANG_ENGLISH} \
238    "Click here for the project's homepage"
239 LangString T_MoreInfoURL ${LANG_ENGLISH} "http://www.gpg4win.org"
240
241 LangString T_ShowReadme ${LANG_ENGLISH} \
242    "Show the README file"
243
244 LangString T_NoKeyManager ${LANG_ENGLISH} \
245    "No key manager has been installed, thus we can't run one now."
246
247 # Used as subdirectory name in Start Menu.
248
249 LangString DESC_Menu_manuals ${LANG_ENGLISH} \
250    "Documentation"
251
252 # Used as subdirectory name on Desktop.
253 LangString DESC_Desktop_manuals ${LANG_ENGLISH} \
254    "Gpg4win Documentation"
255
256
257 # Functions
258
259 # Custom functions and macros for gpg4win. 
260 !include "g4wihelp.nsi"
261
262 #
263 # Control function for the Custom page to select special
264 # install options.
265 #
266 Function CustomPageOptions
267   !insertmacro MUI_HEADER_TEXT "$(T_InstallOptions)" "$(T_InstallOptLinks)"
268
269   # Note that the default selection is done in the ini file.
270   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
271         "Field 1" "Text"  "$(T_InstOptLabelA)"
272   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
273         "Field 2" "Text"  "$(T_InstOptFieldA)"
274   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
275         "Field 3" "Text"  "$(T_InstOptFieldB)"
276   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
277         "Field 4" "Text"  "$(T_InstOptFieldC)"
278   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
279         "Field 5" "Text"  "$(T_InstOptLabelB)"
280
281   !insertmacro MUI_INSTALLOPTIONS_DISPLAY "installer-options.ini"
282 FunctionEnd
283
284 # Display a warning if this is a Beta version.
285 Function PrintBetaWarning
286    MessageBox MB_OK "$(T_BetaWarning)"
287 FunctionEnd
288
289
290 # Display a warning if GnuPP has been detected and allow the user to abort
291 # the installation.
292 Function PrintGnuPPWarning
293    MessageBox MB_YESNO "$(T_FoundOldGnuPP)" IDYES cont
294      Abort
295  cont:
296    StrCpy $OtherGnuPGDetected "GnuPP"
297 FunctionEnd
298
299 # Display a warning if GnuPT has been detected and allow the user to abort
300 # the installation.
301 Function PrintGnuPTWarning
302    MessageBox MB_YESNO "$(T_FoundOldGnuPT)" IDYES cont
303      Abort
304  cont:
305    StrCpy $OtherGnuPGDetected "GnuPT"
306 FunctionEnd
307
308 # Display a warning if the Sourceforge WinPT has been detected and
309 # allow the user to abort the installation.
310 Function PrintWinPTSFWarning
311    MessageBox MB_YESNO "$(T_FoundOldWinPTSF)" IDYES cont
312      Abort
313  cont:
314    StrCpy $OtherGnuPGDetected "WinPT-SF"
315 FunctionEnd
316
317 # Display a warning if GnuPG Pack has been detected and abort the
318 # the installation.  This one clobbers our own Registry space.
319 Function PrintGnuPackWarning
320    MessageBox MB_OK "$(T_FoundOldGnuPack)"
321    Abort
322 FunctionEnd
323
324
325 # Check whether one of the other GnuPG systems has already been
326 # installed.  We do this by looking at the registry.
327 Function CheckOtherGnuPGApps
328   StrCpy $OtherGnuPGDetected ""
329   ClearErrors
330   ReadRegStr $0 HKLM "Software\GNU\GnuPP\Settings" "Path"
331   IfErrors +2 0
332     Call PrintGnuPPWarning
333
334   EnumRegKey $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs\GnuPT" 0
335   StrCmp $0 "" +2
336     Call PrintGnuPTWarning
337
338   ClearErrors
339   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Windows Privacy Tools" "DisplayVersion"
340   IfErrors +2 0
341     Call PrintWinPTSFWarning
342
343   ReadRegStr $0 HKLM "Software\GNU\GnuPG" "Install Directory"
344   Push $0
345   Push "GnuPG-Pack"
346   Call StrStr
347   Pop $0
348   StrCmp $0 "" +2
349     Call PrintGnuPackWarning
350
351
352 FunctionEnd
353
354 # Check whether gpg4win has already been installed.  This is called as
355 # a leave function from the directory page.  A call to abort will get
356 # back to the directory selection.
357 Function CheckExistingVersion
358   ClearErrors
359   FileOpen $0 "$INSTDIR\VERSION" r
360   IfErrors nexttest
361   FileRead $0 $R0
362   FileRead $0 $R1
363   FileClose $0
364
365   Push $R1
366   Call TrimNewLines
367   Pop $R1
368
369   # Extract major version.
370   StrCpy $0 $R1 2
371   StrCmp $0 "1." 0 secondtest
372     MessageBox MB_YESNO "$(T_FoundExistingOldVersion)" IDYES leave
373     Abort
374
375  secondtest:
376   MessageBox MB_YESNO "$(T_FoundExistingVersion)" IDYES leave
377   Abort
378
379  nexttest:
380   ClearErrors
381   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPG4Win" "DisplayVersion"
382   IfErrors leave 0
383      MessageBox MB_YESNO "$(T_FoundExistingVersionB)" IDYES leave
384      Abort
385      
386  leave:
387 FunctionEnd
388
389
390
391 # PrintNonAdminWarning
392
393 # Check whether the current user is in the Administrator group or an
394 # OS version without the need for an Administrator is in use.  Print a
395 # diagnostic if this is not the case and abort installation.
396 Function PrintNonAdminWarning
397
398   Call PrintBetaWarning
399
400   ClearErrors
401   UserInfo::GetName
402   IfErrors leave
403   Pop $0
404   UserInfo::GetAccountType
405   Pop $1
406   StrCmp $1 "Admin" leave +1
407   MessageBox MB_OK "$(T_AdminNeeded)"
408   Quit
409
410  leave:
411 FunctionEnd
412
413
414 # Check whether the start menu is actually wanted.
415
416 Function CheckIfStartMenuWanted
417   !insertmacro MUI_INSTALLOPTIONS_READ $R0 "installer-options.ini" \
418         "Field 2" "State"
419   IntCmp $R0 1 +2
420     Abort
421 FunctionEnd
422
423
424 # Check whether this is a reinstall and popup a message box to explain
425 # that it is better to close other apps before continuing
426 Function PrintCloseOtherApps
427     IfFileExists $INSTDIR\gnupg.exe print_warning
428     IfFileExists $INSTDIR\winpt.exe print_warning
429     IfFileExists $INSTDIR\gpa.exe   print_warning
430     IfFileExists $INSTDIR\gpgol.dll print_warning
431     IfFileExists $INSTDIR\gpgee.dll print_warning
432     IfFileExists $INSTDIR\dirmngr.exe print_warning
433     Return
434    print_warning:
435     MessageBox MB_OK|MB_ICONEXCLAMATION "$(T_CloseOtherApps)"
436     IfFileExists $INSTDIR\winpt.exe 0 +3
437       MessageBox MB_OK "$(T_ShuttingDownWinPT)"
438       ExecWait '"$INSTDIR\winpt.exe" --stop'
439     IfFileExists $INSTDIR\dirmngr.exe 0 +3
440       MessageBox MB_OK "$(T_ShuttingDownDirMngr)"
441       g4wihelp::service_stop "DirMngr"
442    leave:
443 FunctionEnd
444
445 # Called right before the final page to show more warnings.
446 Function ShowFinalWarnings
447    StrCmp $OtherGnupgDetected "" +2
448      MessageBox MB_OK "$(T_FoundOldSeeManual)"
449    leave:
450 FunctionEnd
451
452 #-----------------------------------------------
453 # Strings pertaining to the install options page
454 #-----------------------------------------------
455
456 # Installation options title
457 LangString T_InstallOptions ${LANG_ENGLISH} "Install Options"
458
459 # Installation options subtitle 1
460 LangString T_InstallOptLinks ${LANG_ENGLISH} "Start links"
461
462 LangString T_InstOptLabelA  ${LANG_ENGLISH} \
463      "Please select where Gpg4win shall install links:"
464
465 LangString T_InstOptLabelB  ${LANG_ENGLISH} \
466      "(Only programs will be linked into the quick launch bar.)"
467
468 LangString T_InstOptFieldA  ${LANG_ENGLISH} \
469      "Start Menu"
470
471 LangString T_InstOptFieldB  ${LANG_ENGLISH} \
472      "Desktop"
473
474 LangString T_InstOptFieldC  ${LANG_ENGLISH} \
475      "Quick Launch Bar"
476
477 #------------------------------------------------
478 # String pertaining to the existing version check
479 #------------------------------------------------
480 LangString T_FoundExistingVersion ${LANG_ENGLISH} \
481      "Version $R1 has already been installed.  $\r$\n\
482       Do you want to overwrite it with version ${VERSION}?"
483 LangString T_FoundExistingOldVersion ${LANG_ENGLISH} \
484      "An old version $R1 has already been installed.  It is \
485       strongly recommended to deinstall previous versions on \
486       major upgrades. $\r$\n\
487       Do you want to continue installing Gpg4win ${VERSION} anyway?"
488 LangString T_FoundExistingVersionB ${LANG_ENGLISH} \
489      "A version of Gpg4Win has already been installed on the system. \
490       There will be no problem installing and thus overwriting this \
491       Version. $\r$\n\
492        $\r$\n\
493       Do you want to continue installing Gpg4win?"
494
495
496 #---------------------------------------------
497 # From the old installation checking functions
498 #---------------------------------------------
499 LangString T_FoundOldSeeManual ${LANG_ENGLISH} \
500      "Please see the Gpg4win user manual to learn how to migrate existing \
501       keys from other GnuPG based installations to Gpg4win."
502
503 #---------
504 LangString T_FoundOldGnuPP ${LANG_ENGLISH} \
505      "An old installation of GnuPP (GNU Privacy Project) has been been \
506       detected.  That software is not maintained anymore and thus should \
507       be removed. $\r$\n\
508           $\r$\n\
509       Do you want to continue installing Gpg4win and take care of the old \
510       installation later?"
511
512 #---------
513 LangString T_FoundOldGnuPT ${LANG_ENGLISH} \
514      "An installation of GnuPT has been been detected.  This may cause \
515       problems when used along with Gpg4win. $\r$\n\
516           $\r$\n\
517       Do you want to continue installing Gpg4win?"
518
519 #---------
520 LangString T_FoundOldWinPTSF ${LANG_ENGLISH} \
521      "An old installation of the Sourceforge hosted WinPT has been been \
522       detected.  That software is not maintained anymore and should \
523       be removed. $\r$\n\
524           $\r$\n\
525       Do you want to continue installing Gpg4win and take care of the old \
526       installation later?"
527
528
529 #--------
530 LangString T_FoundOldGnuPack ${LANG_ENGLISH} \
531      "An installation of GnuPG-Pack has been been detected. You need to \
532       uninstall it before you can continue with Gpg4win installation. $\r$\n\
533         $\r$\n\
534       The installation will be aborted now!"
535
536
537
538 # From Function PrintBetaWarning
539 LangString T_BetaWarning ${LANG_ENGLISH} \
540    "Note: This is a BETA version of Gpg4win. $\r$\n\
541      $\r$\n\
542     Beta versions are only intended for testing and \
543     shall not be used in a production environment."
544
545 # From Function PrintNonAdminWarning
546 LangString T_AdminNeeded ${LANG_ENGLISH} \
547    "Warning: Administrator permissions required for a successful installation"
548
549 # From Function PrintCloseOtherApps
550 LangString T_CloseOtherApps ${LANG_ENGLISH} \
551    "Please make sure that other applications are not running. \
552     In particular you should close Outlook and all Explorer \
553     windows.  Gpg4win will try to install anyway but a reboot \
554     will be required then."
555 LangString T_ShuttingDownWinPT ${LANG_ENGLISH} \
556    "Trying to shutdown a possible running instance of WinPT."
557 LangString T_ShuttingDownDirMngr ${LANG_ENGLISH} \
558    "Trying to shutdown a possible running instance of DirMngr."
559
560
561 # FIXME: The GetAfterChar function comes from the NSIS wiki.
562 Function un.GetAfterChar
563   Exch $0 ; chop char
564   Exch
565   Exch $1 ; input string
566   Push $2
567   Push $3
568   StrCpy $2 0
569   loop:
570     IntOp $2 $2 - 1
571     StrCpy $3 $1 1 $2
572     StrCmp $3 "" 0 +3
573       StrCpy $0 ""
574       Goto exit2
575     StrCmp $3 $0 exit1
576     Goto loop
577   exit1:
578     IntOp $2 $2 + 1
579     StrCpy $0 $1 "" $2
580   exit2:
581     Pop $3
582     Pop $2
583     Pop $1
584     Exch $0 ; output
585 FunctionEnd
586
587
588 Function un.SourceDelete
589   Push "/"
590   Call un.GetAfterChar
591   Pop $R0
592   Delete "$INSTDIR\$R0"
593 FunctionEnd
594
595
596 # StrStr  - taken from the NSIS reference
597 # input, top of stack = string to search for
598 #        top of stack-1 = string to search in
599 # output, top of stack (replaces with the portion of the string remaining)
600 # modifies no other variables.
601 #
602 # Usage:
603 #   Push "this is a long ass string"
604 #   Push "ass"
605 #   Call StrStr
606 #   Pop $R0
607 #  ($R0 at this point is "ass string")
608 #
609 !macro StrStr un
610 Function ${un}StrStr
611    Exch $R1 # st=haystack,old$R1, $R1=needle
612    Exch     # st=old$R1,haystack
613    Exch $R2 # st=old$R1,old$R2, $R2=haystack
614    Push $R3
615    Push $R4
616    Push $R5
617    StrLen $R3 $R1
618    StrCpy $R4 0
619    # $R1=needle
620    # $R2=haystack
621    # $R3=len(needle)
622    # $R4=cnt
623    # $R5=tmp
624    loop:
625      StrCpy $R5 $R2 $R3 $R4
626      StrCmp $R5 $R1 done
627      StrCmp $R5 "" done
628      IntOp $R4 $R4 + 1
629      Goto loop
630  done:
631    StrCpy $R1 $R2 "" $R4
632    Pop $R5
633    Pop $R4
634    Pop $R3
635    Pop $R2
636    Exch $R1
637 FunctionEnd
638 !macroend
639 !insertmacro StrStr ""
640 !insertmacro StrStr "un."
641
642
643 # TrimNewlines  - taken from the NSIS reference
644 # input, top of stack  (e.g. whatever$\r$\n)
645 # output, top of stack (replaces, with e.g. whatever)
646 # modifies no other variables.
647 Function TrimNewlines
648    Exch $R0
649    Push $R1
650    Push $R2
651    StrCpy $R1 0
652  
653  loop:
654    IntOp $R1 $R1 - 1
655    StrCpy $R2 $R0 1 $R1
656    StrCmp $R2 "$\r" loop
657    StrCmp $R2 "$\n" loop
658    IntOp $R1 $R1 + 1
659    IntCmp $R1 0 no_trim_needed
660    StrCpy $R0 $R0 $R1
661  
662  no_trim_needed:
663    Pop $R2
664    Pop $R1
665    Exch $R0
666 FunctionEnd
667
668
669 # AddToPath - Adds the given dir to the search path.
670 #        Input - head of the stack
671 Function AddToPath
672   Exch $0
673   g4wihelp::path_add "$0"
674   StrCmp $R5 "0" add_to_path_done
675   SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
676   add_to_path_done:
677   Pop $0
678 FunctionEnd
679  
680 # RemoveFromPath - Remove a given dir from the path
681 #     Input: head of the stack
682 Function un.RemoveFromPath
683   Exch $0
684   g4wihelp::path_remove "$0"
685   StrCmp $R5 "0" remove_from_path_done
686   SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
687   remove_from_path_done:
688   Pop $0
689 FunctionEnd
690  
691