Add Beta warning
[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 # The list of wizard pages.
126
127 !define MUI_WELCOMEPAGE_TITLE "${WELCOME_TITLE_STR}"
128 !define MUI_WELCOMEPAGE_TEXT "${ABOUT_STR}"
129
130 !insertmacro MUI_PAGE_WELCOME
131
132 !define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
133 !define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
134 !define MUI_LICENSEPAGE_TEXT_BOTTOM "$(T_GPLShort)"
135 !insertmacro MUI_PAGE_LICENSE "${TOP_SRCDIR}/COPYING"
136
137 !define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
138 !insertmacro MUI_PAGE_COMPONENTS
139
140 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckExistingVersion
141 !insertmacro MUI_PAGE_DIRECTORY
142
143 !ifdef HAVE_STARTMENU
144
145 Page custom CustomPageOptions
146
147 Var STARTMENU_FOLDER
148
149 !define MUI_PAGE_CUSTOMFUNCTION_PRE CheckIfStartMenuWanted
150 !define MUI_STARTMENUPAGE_NODISABLE
151 !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
152 !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}"
153 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
154
155 !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
156
157 !endif
158
159 !define MUI_PAGE_CUSTOMFUNCTION_PRE PrintCloseOtherApps
160 !insertmacro MUI_PAGE_INSTFILES
161
162 !define MUI_PAGE_CUSTOMFUNCTION_PRE ShowFinalWarnings
163 !define MUI_FINISHPAGE_SHOWREADME "share\gpg4win\README.$(T_LangCode).txt"
164 !define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
165 #!define MUI_FINISHPAGE_RUN
166 #!define MUI_FINISHPAGE_RUN_FUNCTION RunOnFinish
167 #!define MUI_FINISHPAGE_RUN_TEXT "$(T_RunKeyManager)"
168 #!define MUI_FINISHPAGE_RUN_NOTCHECKED
169 !define MUI_FINISHPAGE_LINK "$(T_MoreInfo)"
170 !define MUI_FINISHPAGE_LINK_LOCATION "$(T_MoreInfoURL)"
171 !insertmacro MUI_PAGE_FINISH
172
173
174 # Uninstaller pages.
175
176 !insertmacro MUI_UNPAGE_CONFIRM
177 !insertmacro MUI_UNPAGE_INSTFILES
178
179
180 #Page license
181 #Page components
182 #Page directory
183 #Page instfiles
184 #UninstPage uninstConfirm
185 #UninstPage instfiles
186
187
188 # Language support.  This has to be done after defining the pages, but
189 # before defining the translation strings.  Confusing.
190
191 # Enable this to not filter languages for the current code page.  Note
192 # that languages which are then not filtered out may not be displayed
193 # correctly in the Windows version the user is using.  Not recommended,
194 # but can be useful for testing.
195 !ifdef DEBUG
196 !define MUI_LANGDLL_ALLLANGUAGES
197 !endif
198
199 !insertmacro MUI_LANGUAGE "English"
200 !define PO_HEADER
201 !include "../po/catalogs.nsi"
202 !undef PO_HEADER
203
204 !insertmacro MUI_RESERVEFILE_LANGDLL
205 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
206 ReserveFile "${BUILD_DIR}\g4wihelp.dll"
207 !ifdef SOURCES
208 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-400px.bmp"
209 ReserveFile "${TOP_SRCDIR}\src\gpg4win-splash.wav"
210 !endif
211 ReserveFile "${TOP_SRCDIR}\COPYING"
212 ReserveFile "installer-options.ini"
213 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-164x314.bmp"
214
215 # Language support
216
217 LangString T_LangCode ${LANG_ENGLISH} "en"
218
219 # Startup page
220 LangString T_GPLHeader ${LANG_ENGLISH} \
221   "This software is licensed under the terms of the GNU General Public \
222    License (GPL) which guarantees your freedom to share and change Free \
223    Software."
224
225 LangString T_GPLShort ${LANG_ENGLISH} \
226   "In short: You are allowed to run this software for any purpose. \
227    You may distribute it as long as you give the recipients the same \
228    rights you have received."
229
230 LangString T_RunKeyManager ${LANG_ENGLISH} \
231    "Run the key manager"
232
233 LangString T_MoreInfo ${LANG_ENGLISH} \
234    "Click here for the project's homepage"
235 LangString T_MoreInfoURL ${LANG_ENGLISH} "http://www.gpg4win.org"
236
237 LangString T_ShowReadme ${LANG_ENGLISH} \
238    "Show the README file"
239
240 LangString T_NoKeyManager ${LANG_ENGLISH} \
241    "No key manager has been installed, thus we can't run one now."
242
243 # Used as subdirectory name in Start Menu.
244
245 LangString DESC_Menu_manuals ${LANG_ENGLISH} \
246    "Documentation"
247
248 # Used as subdirectory name on Desktop.
249 LangString DESC_Desktop_manuals ${LANG_ENGLISH} \
250    "Gpg4win Documentation"
251
252
253 # Functions
254
255 # Custom functions and macros for gpg4win. 
256 !include "g4wihelp.nsi"
257
258 #
259 # Control function for the Custom page to select special
260 # install options.
261 #
262 Function CustomPageOptions
263   !insertmacro MUI_HEADER_TEXT "$(T_InstallOptions)" "$(T_InstallOptLinks)"
264
265   # Note that the default selection is done in the ini file.
266   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
267         "Field 1" "Text"  "$(T_InstOptLabelA)"
268   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
269         "Field 2" "Text"  "$(T_InstOptFieldA)"
270   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
271         "Field 3" "Text"  "$(T_InstOptFieldB)"
272   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
273         "Field 4" "Text"  "$(T_InstOptFieldC)"
274   !insertmacro MUI_INSTALLOPTIONS_WRITE "installer-options.ini" \
275         "Field 5" "Text"  "$(T_InstOptLabelB)"
276
277   !insertmacro MUI_INSTALLOPTIONS_DISPLAY "installer-options.ini"
278 FunctionEnd
279
280 # Display a warning if this is a Beta version and allow the user to
281 # abort the installation.
282 Function PrintBetaWarning
283    MessageBox MB_YESNO "$(T_BetaWarning)" IDYES cont
284      Abort
285  cont:
286 FunctionEnd
287
288
289 # Display a warning if GnuPP has been detected and allow the user to abort
290 # the installation.
291 Function PrintGnuPPWarning
292    MessageBox MB_YESNO "$(T_FoundOldGnuPP)" IDYES cont
293      Abort
294  cont:
295    StrCpy $OtherGnuPGDetected "GnuPP"
296 FunctionEnd
297
298 # Display a warning if GnuPT has been detected and allow the user to abort
299 # the installation.
300 Function PrintGnuPTWarning
301    MessageBox MB_YESNO "$(T_FoundOldGnuPT)" IDYES cont
302      Abort
303  cont:
304    StrCpy $OtherGnuPGDetected "GnuPT"
305 FunctionEnd
306
307 # Display a warning if the Sourceforge WinPT has been detected and
308 # allow the user to abort the installation.
309 Function PrintWinPTSFWarning
310    MessageBox MB_YESNO "$(T_FoundOldWinPTSF)" IDYES cont
311      Abort
312  cont:
313    StrCpy $OtherGnuPGDetected "WinPT-SF"
314 FunctionEnd
315
316 # Display a warning if GnuPG Pack has been detected and abort the
317 # the installation.  This one clobbers our own Registry space.
318 Function PrintGnuPackWarning
319    MessageBox MB_OK "$(T_FoundOldGnuPack)"
320    Abort
321 FunctionEnd
322
323
324 # Check whether one of the other GnuPG systems has already been
325 # installed.  We do this by looking at the registry.
326 Function CheckOtherGnuPGApps
327   StrCpy $OtherGnuPGDetected ""
328   ClearErrors
329   ReadRegStr $0 HKLM "Software\GNU\GnuPP\Settings" "Path"
330   IfErrors +2 0
331     Call PrintGnuPPWarning
332
333   EnumRegKey $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs\GnuPT" 0
334   StrCmp $0 "" +2
335     Call PrintGnuPTWarning
336
337   ClearErrors
338   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Windows Privacy Tools" "DisplayVersion"
339   IfErrors +2 0
340     Call PrintWinPTSFWarning
341
342   ReadRegStr $0 HKLM "Software\GNU\GnuPG" "Install Directory"
343   Push $0
344   Push "GnuPG-Pack"
345   Call StrStr
346   Pop $0
347   StrCmp $0 "" +2
348     Call PrintGnuPackWarning
349
350
351 FunctionEnd
352
353 # Check whether gpg4win has already been installed.  This is called as
354 # a leave function from the directory page.  A call to abort will get
355 # back to the directory selection.
356 Function CheckExistingVersion
357   ClearErrors
358   FileOpen $0 "$INSTDIR\VERSION" r
359   IfErrors nexttest
360   FileRead $0 $R0
361   FileRead $0 $R1
362   FileClose $0
363
364   Push $R1
365   Call TrimNewLines
366   Pop $R1
367
368   MessageBox MB_YESNO "$(T_FoundExistingVersion)" IDYES leave
369   Abort
370
371  nexttest:
372   ClearErrors
373   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPG4Win" "DisplayVersion"
374   IfErrors leave 0
375      MessageBox MB_YESNO "$(T_FoundExistingVersionB)" IDYES leave
376      Abort
377      
378  leave:
379 FunctionEnd
380
381
382
383 # PrintNonAdminWarning
384
385 # Check whether the current user is in the Administrator group or an
386 # OS version without the need for an Administrator is in use.  Print a
387 # diagnostic if this is not the case and abort installation.
388 Function PrintNonAdminWarning
389
390   Call PrintBetaWarning
391
392   ClearErrors
393   UserInfo::GetName
394   IfErrors leave
395   Pop $0
396   UserInfo::GetAccountType
397   Pop $1
398   StrCmp $1 "Admin" leave +1
399   MessageBox MB_OK "$(T_AdminNeeded)"
400   Quit
401
402  leave:
403 FunctionEnd
404
405
406 # Check whether the start menu is actually wanted.
407
408 Function CheckIfStartMenuWanted
409   !insertmacro MUI_INSTALLOPTIONS_READ $R0 "installer-options.ini" \
410         "Field 2" "State"
411   IntCmp $R0 1 +2
412     Abort
413 FunctionEnd
414
415
416 # Check whether this is a reinstall and popup a message box to explain
417 # that it is better to close other apps before continuing
418 Function PrintCloseOtherApps
419     IfFileExists $INSTDIR\gnupg.exe print_warning
420     IfFileExists $INSTDIR\winpt.exe print_warning
421     IfFileExists $INSTDIR\gpa.exe   print_warning
422     IfFileExists $INSTDIR\gpgol.dll print_warning
423     IfFileExists $INSTDIR\gpgee.dll print_warning
424     IfFileExists $INSTDIR\dirmngr.exe print_warning
425     Return
426    print_warning:
427     MessageBox MB_OK|MB_ICONEXCLAMATION "$(T_CloseOtherApps)"
428     IfFileExists $INSTDIR\winpt.exe 0 +3
429       MessageBox MB_OK "$(T_ShuttingDownWinPT)"
430       ExecWait '"$INSTDIR\winpt.exe" --stop'
431     IfFileExists $INSTDIR\dirmngr.exe 0 +3
432       MessageBox MB_OK "$(T_ShuttingDownDirMngr)"
433       g4wihelp::service_stop "DirMngr"
434    leave:
435 FunctionEnd
436
437 # Called right before the final page to show more warnings.
438 Function ShowFinalWarnings
439    StrCmp $OtherGnupgDetected "" +2
440      MessageBox MB_OK "$(T_FoundOldSeeManual)"
441    leave:
442 FunctionEnd
443
444 #-----------------------------------------------
445 # Strings pertaining to the install options page
446 #-----------------------------------------------
447
448 # Installation options title
449 LangString T_InstallOptions ${LANG_ENGLISH} "Install Options"
450
451 # Installation options subtitle 1
452 LangString T_InstallOptLinks ${LANG_ENGLISH} "Start links"
453
454 LangString T_InstOptLabelA  ${LANG_ENGLISH} \
455      "Please select where Gpg4win shall install links:"
456
457 LangString T_InstOptLabelB  ${LANG_ENGLISH} \
458      "(Only programs will be linked into the quick launch bar.)"
459
460 LangString T_InstOptFieldA  ${LANG_ENGLISH} \
461      "Start Menu"
462
463 LangString T_InstOptFieldB  ${LANG_ENGLISH} \
464      "Desktop"
465
466 LangString T_InstOptFieldC  ${LANG_ENGLISH} \
467      "Quick Launch Bar"
468
469 #------------------------------------------------
470 # String pertaining to the existing version check
471 #------------------------------------------------
472 LangString T_FoundExistingVersion ${LANG_ENGLISH} \
473      "Version $R1 has already been installed.  $\r$\n\
474       Do you want to overwrite it with version ${VERSION}?"
475 LangString T_FoundExistingVersionB ${LANG_ENGLISH} \
476      "A version of Gpg4Win has already been installed on the system. \
477       There will be no problem installing and thus overwriting this \
478       Version. $\r$\n\
479        $\r$\n\
480       Do you want to continue installing Gpg4win?"
481
482
483 #---------------------------------------------
484 # From the old installation checking functions
485 #---------------------------------------------
486 LangString T_FoundOldSeeManual ${LANG_ENGLISH} \
487      "Please see the Gpg4win user manual to learn how to migrate existing \
488       keys from other GnuPG based installations to Gpg4win."
489
490 #---------
491 LangString T_FoundOldGnuPP ${LANG_ENGLISH} \
492      "An old installation of GnuPP (GNU Privacy Project) has been been \
493       detected.  That software is not maintained anymore and thus should \
494       be removed. $\r$\n\
495           $\r$\n\
496       Do you want to continue installing Gpg4win and take care of the old \
497       installation later?"
498
499 #---------
500 LangString T_FoundOldGnuPT ${LANG_ENGLISH} \
501      "An installation of GnuPT has been been detected.  This may cause \
502       problems when used along with Gpg4win. $\r$\n\
503           $\r$\n\
504       Do you want to continue installing Gpg4win?"
505
506 #---------
507 LangString T_FoundOldWinPTSF ${LANG_ENGLISH} \
508      "An old installation of the Sourceforge hosted WinPT has been been \
509       detected.  That software is not maintained anymore and should \
510       be removed. $\r$\n\
511           $\r$\n\
512       Do you want to continue installing Gpg4win and take care of the old \
513       installation later?"
514
515
516 #--------
517 LangString T_FoundOldGnuPack ${LANG_ENGLISH} \
518      "An installation of GnuPG-Pack has been been detected. You need to \
519       uninstall it before you can continue with Gpg4win installation. $\r$\n\
520         $\r$\n\
521       The installation will be aborted now!"
522
523
524
525 # From Function PrintBetaWarning
526 LangString T_BetaWarning ${LANG_ENGLISH} \
527    "Note: This is a BETA version of Gpg4win. $\r$\n\
528      $\r$\n\
529     Beta versions are only intended for testing and \
530     shall not be used in a production environment."
531
532 # From Function PrintNonAdminWarning
533 LangString T_AdminNeeded ${LANG_ENGLISH} \
534    "Warning: Administrator permissions required for a successful installation"
535
536 # From Function PrintCloseOtherApps
537 LangString T_CloseOtherApps ${LANG_ENGLISH} \
538    "Please make sure that other applications are not running. \
539     In particular you should close Outlook and all Explorer \
540     windows.  Gpg4win will try to install anyway but a reboot \
541     will be required then."
542 LangString T_ShuttingDownWinPT ${LANG_ENGLISH} \
543    "Trying to shutdown a possible running instance of WinPT."
544 LangString T_ShuttingDownDirMngr ${LANG_ENGLISH} \
545    "Trying to shutdown a possible running instance of DirMngr."
546
547
548 # FIXME: The GetAfterChar function comes from the NSIS wiki.
549 Function un.GetAfterChar
550   Exch $0 ; chop char
551   Exch
552   Exch $1 ; input string
553   Push $2
554   Push $3
555   StrCpy $2 0
556   loop:
557     IntOp $2 $2 - 1
558     StrCpy $3 $1 1 $2
559     StrCmp $3 "" 0 +3
560       StrCpy $0 ""
561       Goto exit2
562     StrCmp $3 $0 exit1
563     Goto loop
564   exit1:
565     IntOp $2 $2 + 1
566     StrCpy $0 $1 "" $2
567   exit2:
568     Pop $3
569     Pop $2
570     Pop $1
571     Exch $0 ; output
572 FunctionEnd
573
574
575 Function un.SourceDelete
576   Push "/"
577   Call un.GetAfterChar
578   Pop $R0
579   Delete "$INSTDIR\$R0"
580 FunctionEnd
581
582
583 # StrStr  - taken from the NSIS reference
584 # input, top of stack = string to search for
585 #        top of stack-1 = string to search in
586 # output, top of stack (replaces with the portion of the string remaining)
587 # modifies no other variables.
588 #
589 # Usage:
590 #   Push "this is a long ass string"
591 #   Push "ass"
592 #   Call StrStr
593 #   Pop $R0
594 #  ($R0 at this point is "ass string")
595 #
596 !macro StrStr un
597 Function ${un}StrStr
598    Exch $R1 # st=haystack,old$R1, $R1=needle
599    Exch     # st=old$R1,haystack
600    Exch $R2 # st=old$R1,old$R2, $R2=haystack
601    Push $R3
602    Push $R4
603    Push $R5
604    StrLen $R3 $R1
605    StrCpy $R4 0
606    # $R1=needle
607    # $R2=haystack
608    # $R3=len(needle)
609    # $R4=cnt
610    # $R5=tmp
611    loop:
612      StrCpy $R5 $R2 $R3 $R4
613      StrCmp $R5 $R1 done
614      StrCmp $R5 "" done
615      IntOp $R4 $R4 + 1
616      Goto loop
617  done:
618    StrCpy $R1 $R2 "" $R4
619    Pop $R5
620    Pop $R4
621    Pop $R3
622    Pop $R2
623    Exch $R1
624 FunctionEnd
625 !macroend
626 !insertmacro StrStr ""
627 !insertmacro StrStr "un."
628
629
630 # TrimNewlines  - taken from the NSIS reference
631 # input, top of stack  (e.g. whatever$\r$\n)
632 # output, top of stack (replaces, with e.g. whatever)
633 # modifies no other variables.
634 Function TrimNewlines
635    Exch $R0
636    Push $R1
637    Push $R2
638    StrCpy $R1 0
639  
640  loop:
641    IntOp $R1 $R1 - 1
642    StrCpy $R2 $R0 1 $R1
643    StrCmp $R2 "$\r" loop
644    StrCmp $R2 "$\n" loop
645    IntOp $R1 $R1 + 1
646    IntCmp $R1 0 no_trim_needed
647    StrCpy $R0 $R0 $R1
648  
649  no_trim_needed:
650    Pop $R2
651    Pop $R1
652    Exch $R0
653 FunctionEnd
654
655
656 # AddToPath - Adds the given dir to the search path.
657 #        Input - head of the stack
658 Function AddToPath
659   Exch $0
660   g4wihelp::path_add "$0"
661   StrCmp $R5 "0" add_to_path_done
662   SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
663   add_to_path_done:
664   Pop $0
665 FunctionEnd
666  
667 # RemoveFromPath - Remove a given dir from the path
668 #     Input: head of the stack
669 Function un.RemoveFromPath
670   Exch $0
671   g4wihelp::path_remove "$0"
672   StrCmp $R5 "0" remove_from_path_done
673   SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
674   remove_from_path_done:
675   Pop $0
676 FunctionEnd
677  
678