Install wrapper so that gpg can be searched via PATH.
[gpg4win.git] / src / installer.nsi
1 # installer.nsi - Installer for GnuPG 4 Windows.    -*- coding: latin-1; -*-
2 # Copyright (C) 2005 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
43
44
45 # We use the modern UI.
46 !include "MUI.nsh"
47
48 # Set the package name.  Note that this name should not be sufficed
49 #  with the version because this would get displayed in the start menu.
50 Name "${PRETTY_PACKAGE}"
51
52
53 # Set the output filename.
54 !ifdef GPG4WIN_LIGHT
55 OutFile "${PACKAGE}-light-${VERSION}.exe"
56 !else
57 OutFile "${PACKAGE}-${VERSION}.exe"
58 !endif
59
60 Icon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
61 UninstallIcon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
62
63 # Set the installation directory.
64 !ifndef INSTALL_DIR
65 !define INSTALL_DIR "${PACKAGE}"
66 !endif
67 InstallDir "$PROGRAMFILES\GNU\${INSTALL_DIR}" 
68
69
70 InstallDirRegKey HKLM "Software\GNU\${PRETTY_PACKAGE_SHORT}" \
71         "Install Directory"
72
73
74 # Add version information to the file properties.
75 VIProductVersion "${PROD_VERSION}"
76 VIAddVersionKey "ProductName" "${PRETTY_PACKAGE_SHORT} (${VERSION})"
77 !ifdef LICENSE_GPL
78 VIAddVersionKey "Comments" \
79    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
80     and/or modify it under the terms of the GNU General Public License.  \
81     You should have received a copy of the GNU General Public License  \
82     along with this software; if not, write to the Free Software  \
83     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
84     MA 02110-1301, USA"
85 !else
86 VIAddVersionKey "Comments" \
87    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
88     and/or modify it under the terms of the GNU Lesser General Public  \
89     License. You should have received a copy of the GNU Lesser General  \
90     Public License along with this software; if not, write to the Free  \
91     Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
92     MA 02110-1301, USA"
93 !endif
94 VIAddVersionKey "CompanyName" "${COMPANY}"
95 VIAddVersionKey "LegalTrademarks" ""
96 VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
97 VIAddVersionKey "FileDescription" "${DESCRIPTION}"
98 VIAddVersionKey "FileVersion" "${PROD_VERSION}"
99
100 # Set to the name of another GnupG installation if one has been detected
101 Var OtherGnuPGDetected
102
103 # Interface Settings
104
105 # !define MUI_ABORTWARNING
106 !define MUI_FINISHPAGE_NOAUTOCLOSE
107 !define MUI_UNFINISHPAGE_NOAUTOCLOSE
108
109 #!define MUI_HEADERIMAGE
110 #!define MUI_HEADERIMAGE_BITMAP \
111 #               "${TOP_SRCDIR}/doc/logo/gpg4win-logo-150x57.bmp"
112 !define MUI_WELCOMEFINISHPAGE_BITMAP \
113                "${TOP_SRCDIR}/doc/logo/gpg4win-logo-164x314.bmp"
114
115 # Remember the installer language
116
117 #!define MUI_LANGDLL_REGISTRY_ROOT "HKCU" 
118 #!define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}" 
119 #!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
120
121 # The list of wizard pages.
122
123 !define MUI_WELCOMEPAGE_TITLE "$(T_WelcomeTitle)"
124 !define MUI_WELCOMEPAGE_TEXT  "$(T_About)"
125 !insertmacro MUI_PAGE_WELCOME
126
127 !define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
128 !define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
129 !define MUI_LICENSEPAGE_TEXT_BOTTOM "$(T_GPLShort)"
130 !insertmacro MUI_PAGE_LICENSE "${TOP_SRCDIR}/COPYING"
131
132 !define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
133 !insertmacro MUI_PAGE_COMPONENTS
134
135 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckExistingVersion
136 !insertmacro MUI_PAGE_DIRECTORY
137
138 !ifdef HAVE_STARTMENU
139
140 Page custom CustomPageOptions
141
142 Var STARTMENU_FOLDER
143
144 !define MUI_PAGE_CUSTOMFUNCTION_PRE CheckIfStartMenuWanted
145 !define MUI_STARTMENUPAGE_NODISABLE
146 !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
147 !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}"
148 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
149
150 !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
151
152 !endif
153
154 !define MUI_PAGE_CUSTOMFUNCTION_PRE PrintCloseOtherApps
155 !insertmacro MUI_PAGE_INSTFILES
156
157 !define MUI_PAGE_CUSTOMFUNCTION_PRE ShowFinalWarnings
158 !define MUI_FINISHPAGE_SHOWREADME "README.$(T_LangCode).txt"
159 !define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
160 #!define MUI_FINISHPAGE_RUN
161 #!define MUI_FINISHPAGE_RUN_FUNCTION RunOnFinish
162 #!define MUI_FINISHPAGE_RUN_TEXT "$(T_RunKeyManager)"
163 #!define MUI_FINISHPAGE_RUN_NOTCHECKED
164 !define MUI_FINISHPAGE_LINK "$(T_MoreInfo)"
165 !define MUI_FINISHPAGE_LINK_LOCATION "$(T_MoreInfoURL)"
166 !insertmacro MUI_PAGE_FINISH
167
168
169 # Uninstaller pages.
170
171 !insertmacro MUI_UNPAGE_CONFIRM
172 !insertmacro MUI_UNPAGE_INSTFILES
173
174
175 #Page license
176 #Page components
177 #Page directory
178 #Page instfiles
179 #UninstPage uninstConfirm
180 #UninstPage instfiles
181
182
183 # Language support.  This has to be done after defining the pages, but
184 # before defining the translation strings.  Confusing.
185
186 !insertmacro MUI_LANGUAGE "English"
187 !insertmacro MUI_LANGUAGE "German"
188
189 #!insertmacro MUI_RESERVEFILE_LANGDLL
190 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
191 ReserveFile "${BUILD_DIR}\g4wihelp.dll"
192 !ifdef SOURCES
193 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-400px.bmp"
194 ReserveFile "${TOP_SRCDIR}\src\gpg4win-splash.wav"
195 !endif
196 ReserveFile "${TOP_SRCDIR}\COPYING"
197 ReserveFile "installer-options.ini"
198 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-164x314.bmp"
199
200 # Language support
201
202 LangString T_LangCode ${LANG_ENGLISH} "en"
203 LangString T_LangCode ${LANG_GERMAN}  "de"
204
205
206 # The WelcomeTitle is displayed on the first page.
207 LangString T_WelcomeTitle ${LANG_ENGLISH} "${WELCOME_TITLE_ENGLISH}"
208 LangString T_WelcomeTitle ${LANG_GERMAN} "${WELCOME_TITLE_GERMAN}"
209
210 # The About string as displayed on the first page.
211 LangString T_About ${LANG_ENGLISH} "${ABOUT_ENGLISH}"
212 LangString T_About ${LANG_GERMAN} "${ABOUT_GERMAN}"
213
214 # Startup page
215 LangString T_GPLHeader ${LANG_ENGLISH} \
216   "This software is licensed under the terms of the GNU General Public \
217    License (GPL) which guarantees your freedom to share and change Free \
218    Software."
219 LangString T_GPLHeader ${LANG_GERMAN}} \
220   "Diese Software ist unter der GNU General Public License \
221    (GPL) lizensiert; dies gibt Ihnen die Freiheit, sie \
222    zu ändern und weiterzugeben."
223
224 LangString T_GPLShort ${LANG_ENGLISH} \
225   "In short: You are allowed to run this software for any purpose. \
226    You may distribute it as long as you give the recipients the same \
227    rights you have received."
228 LangString T_GPLShort ${LANG_GERMAN} \
229   "In aller Kürze: Sie haben das Recht, die Software zu jedem Zweck \
230    einzusetzen.  Sie können die Software weitergeben, sofern Sie dem \
231    Empfänger dieselben Rechte einräumen, die auch Sie erhalten haben."
232
233 LangString T_RunKeyManager ${LANG_ENGLISH} \
234    "Run the key manager"
235 LangString T_RunKeyManager ${LANG_GERMAN} \
236    "Die Schlüsselverwaltung aufrufen"
237
238 LangString T_MoreInfo ${LANG_ENGLISH} \
239    "Click here for the project's homepage"
240 LangString T_MoreInfo ${LANG_GERMAN} \
241    "Hier klicken um zur Homepage des Projekts zu gelangen"
242 LangString T_MoreInfoURL ${LANG_ENGLISH} "http://www.gpg4win.org"
243 LangString T_MoreInfoURL ${LANG_GERMAN}  "http://www.gpg4win.de"
244
245 LangString T_ShowReadme ${LANG_ENGLISH} \
246    "Show the README file"
247 LangString T_ShowReadme ${LANG_GERMAN} \
248    "Die README Datei anzeigen"
249
250 LangString T_NoKeyManager ${LANG_ENGLISH} \
251    "No key manager has been installed, thus we can't run one now."
252 LangString T_NoKeyManager ${LANG_GERMAN} \
253    "Es wurde keine Schlüsselverwaltung installiert. \
254     Deswegen kann sie jetzt auch nicht ausgeführt werden."
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
285 # Display a warning if GnuPP has been detected and allow the user to abort
286 # the installation.
287 Function PrintGnuPPWarning
288    MessageBox MB_YESNO "$(T_FoundOldGnuPP)" IDYES cont
289      Abort
290  cont:
291    StrCpy $OtherGnuPGDetected "GnuPP"
292 FunctionEnd
293
294 # Display a warning if GnuPT has been detected and allow the user to abort
295 # the installation.
296 Function PrintGnuPTWarning
297    MessageBox MB_YESNO "$(T_FoundOldGnuPT)" IDYES cont
298      Abort
299  cont:
300    StrCpy $OtherGnuPGDetected "GnuPT"
301 FunctionEnd
302
303 # Display a warning if the Sourceforge WinPT has been detected and
304 # allow the user to abort the installation.
305 Function PrintWinPTSFWarning
306    MessageBox MB_YESNO "$(T_FoundOldWinPTSF)" IDYES cont
307      Abort
308  cont:
309    StrCpy $OtherGnuPGDetected "WinPT-SF"
310 FunctionEnd
311
312 # Display a warning if GnuPG Pack has been detected and abort the
313 # the installation.  This one clobbers our own Registry space.
314 Function PrintGnuPackWarning
315    MessageBox MB_OK "$(T_FoundOldGnuPack)"
316    Abort
317 FunctionEnd
318
319
320 # Check whether one of the other GnuPG systems has already been
321 # installed.  We do this by looking at the registry.
322 Function CheckOtherGnuPGApps
323   StrCpy $OtherGnuPGDetected ""
324   ClearErrors
325   ReadRegStr $0 HKLM "Software\GNU\GnuPP\Settings" "Path"
326   IfErrors +2 0
327     Call PrintGnuPPWarning
328
329   EnumRegKey $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs\GnuPT" 0
330   StrCmp $0 "" +2
331     Call PrintGnuPTWarning
332
333   ClearErrors
334   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Windows Privacy Tools" "DisplayVersion"
335   IfErrors +2 0
336     Call PrintWinPTSFWarning
337
338   ReadRegStr $0 HKLM "Software\GNU\GnuPG" "Install Directory"
339   Push $0
340   Push "GnuPG-Pack"
341   Call StrStr
342   Pop $0
343   StrCmp $0 "" +2
344     Call PrintGnuPackWarning
345
346
347 FunctionEnd
348
349 # Check whether gpg4win has already been installed.  This is called as
350 # a leave function from the directory page.  A call to abort will get
351 # back to the directory selection.
352 Function CheckExistingVersion
353   ClearErrors
354   FileOpen $0 "$INSTDIR\VERSION" r
355   IfErrors nexttest
356   FileRead $0 $R0
357   FileRead $0 $R1
358   FileClose $0
359
360   Push $R1
361   Call TrimNewLines
362   Pop $R1
363
364   MessageBox MB_YESNO "$(T_FoundExistingVersion)" IDYES leave
365   Abort
366
367  nexttest:
368   ClearErrors
369   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPG4Win" "DisplayVersion"
370   IfErrors leave 0
371      MessageBox MB_YESNO "$(T_FoundExistingVersionB)" IDYES leave
372      Abort
373      
374  leave:
375 FunctionEnd
376
377
378
379 # PrintNonAdminWarning
380
381 # Check whether the current user is in the Administrator group or an
382 # OS version without the need for an Administrator is in use.  Print a
383 # diagnostic if this is not the case and abort installation.
384 Function PrintNonAdminWarning
385   ClearErrors
386   UserInfo::GetName
387   IfErrors leave
388   Pop $0
389   UserInfo::GetAccountType
390   Pop $1
391   StrCmp $1 "Admin" leave +1
392   MessageBox MB_OK "$(T_AdminNeeded)"
393   Quit
394
395  leave:
396 FunctionEnd
397
398
399 # Check whether the start menu is actually wanted.
400
401 Function CheckIfStartMenuWanted
402   !insertmacro MUI_INSTALLOPTIONS_READ $R0 "installer-options.ini" \
403         "Field 2" "State"
404   IntCmp $R0 1 +2
405     Abort
406 FunctionEnd
407
408
409 # Check whether this is a reinstall and popup a message box to explain
410 # that it is better to close other apps before continuing
411 Function PrintCloseOtherApps
412     IfFileExists $INSTDIR\gnupg.exe print_warning
413     IfFileExists $INSTDIR\winpt.exe print_warning
414     IfFileExists $INSTDIR\gpa.exe   print_warning
415     IfFileExists $INSTDIR\gpgol.dll print_warning
416     IfFileExists $INSTDIR\gpgee.dll print_warning
417     Return
418    print_warning:
419     MessageBox MB_OK|MB_ICONEXCLAMATION "$(T_CloseOtherApps)"
420     IfFileExists $INSTDIR\winpt.exe 0 +3
421       MessageBox MB_OK "$(T_ShuttingDownWinPT)"
422       ExecWait '"$INSTDIR\winpt.exe" --stop'
423    leave:
424 FunctionEnd
425
426 # Called right before the final page to show more warnings.
427 Function ShowFinalWarnings
428    StrCmp $OtherGnupgDetected "" +2
429      MessageBox MB_OK "$(T_FoundOldSeeManual)"
430    leave:
431 FunctionEnd
432
433 #-----------------------------------------------
434 # Strings pertaining to the install options page
435 #-----------------------------------------------
436
437 # Installation options title
438 LangString T_InstallOptions ${LANG_ENGLISH} "Install Options"
439 LangString T_InstallOptions ${LANG_GERMAN}  "Installationsoptionen"
440
441 # Installation options subtitle 1
442 LangString T_InstallOptLinks ${LANG_ENGLISH} "Start links"
443 LangString T_InstallOptLinks ${LANG_GERMAN}  "Startlinks"
444
445 LangString T_InstOptLabelA  ${LANG_ENGLISH} \
446      "Please select where Gpg4win shall install links:"
447 LangString T_InstOptLabelA  ${LANG_GERMAN} \
448      "Bitte wählen Sie, welche Verknüpfungen angelegt werden sollen:"
449
450 LangString T_InstOptLabelB  ${LANG_ENGLISH} \
451      "(Only programs will be linked into the quick launch bar.)"
452 LangString T_InstOptLabelB  ${LANG_GERMAN} \
453      "(In die Schnellstartleiste werden nur Verknüpfungen für \
454       Programme angelegt.) "
455
456 LangString T_InstOptFieldA  ${LANG_ENGLISH} \
457      "Start Menu"
458 LangString T_InstOptFieldA  ${LANG_GERMAN} \
459      "Startmenü"
460
461 LangString T_InstOptFieldB  ${LANG_ENGLISH} \
462      "Desktop"
463 LangString T_InstOptFieldB  ${LANG_GERMAN} \
464      "Arbeitsfläche"
465
466 LangString T_InstOptFieldC  ${LANG_ENGLISH} \
467      "Quick Launch Bar"
468 LangString T_InstOptFieldC  ${LANG_GERMAN} \
469      "Schnellstartleiste"
470
471 #------------------------------------------------
472 # String pertaining to the existing version check
473 #------------------------------------------------
474 LangString T_FoundExistingVersion ${LANG_ENGLISH} \
475      "Version $R1 has already been installed.  $\r$\n\
476       Do you want to overwrite it with version ${VERSION}?"
477 LangString T_FoundExistingVersion ${LANG_GERMAN} \
478      "Version $R1 ist hier bereits installiert. $\r$\n\
479       Möchten Sie diese mit Version ${VERSION} überschreiben? $\r$\n\
480        $\r$\n\
481       (Sie können in jedem Fall mit JA antworten, falls es sich um \
482        eine neuere oder dieselbe Version handelt.)"
483 LangString T_FoundExistingVersionB ${LANG_ENGLISH} \
484      "A version of Gpg4Win has already been installed on the system. \
485       There will be no problem installing and thus overwriting this \
486       Version. $\r$\n\
487        $\r$\n\
488       Do you want to continue installing Gpg4win?"
489 LangString T_FoundExistingVersionB ${LANG_GERMAN} \
490      "Eine Version von Gpg4Win ist hier bereits installiert. \
491       Es ist problemlos möglich, die Installation fortzuführen.  $\r$\n\
492         $\r$\n\
493       Möchten die die Installation von Gpg4Win fortführen?"
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 LangString T_FoundOldSeeManual ${LANG_GERMAN} \
503      "Bitte sehen Sie im Gpg4win für Einsteiger Handbuch nach, wie Sie Ihre \
504       Schlüssel aus anderen - GnuPG basierten - Installationen in Gpg4win \
505       überführen.  Es wird dringend geraten Gpg4Win nicht zusammen mit \
506       diesen anderen Installation zu betreiben."
507
508 #---------
509 LangString T_FoundOldGnuPP ${LANG_ENGLISH} \
510      "An old installation of GnuPP (GNU Privacy Project) has been been \
511       detected.  That software is not maintained anymore and thus should \
512       be removed. $\r$\n\
513           $\r$\n\
514       Do you want to continue installing Gpg4win and take care of the old \
515       installation later?"
516 LangString T_FoundOldGnuPP ${LANG_GERMAN} \
517      "Eine alte Installation von GnuPP (GNU Privacy Project) wurde gefunden. \
518       Diese Software wird nicht mehr gepflegt und sollte deshalb vom \
519       System entfernt werden.  $\r$\n\
520         $\r$\n\
521       Sie können die Installation von Gpg4win jetzt weiterdurchführen und \
522       danach entscheiden, ob Sie das alte GnuPP dann entfernen.  Sie finden \
523       hierzu Hinweise im Gpg4Win Handbuch für Einsteiger.  Falls Sie die alte \
524       Installation schon jetzt entfernen möchten, so exportieren Sie dort \
525       alle vorhandenen Schlüssel in eine Datei um sie so später in Gpg4Win \
526       wieder importieren zu können. $\r$\n\
527         $\r$\n\
528       Möchten Sie die Installation von Gpg4win weiter durchführen und sich \
529       dann später um die Entfernung von GnuPP kümmern?"
530
531 #---------
532 LangString T_FoundOldGnuPT ${LANG_ENGLISH} \
533      "An installation of GnuPT has been been detected.  This may cause \
534       problems when used along with Gpg4win. $\r$\n\
535           $\r$\n\
536       Do you want to continue installing Gpg4win?"
537 LangString T_FoundOldGnuPT ${LANG_GERMAN} \
538      "Eine Installation von GnuPT wurde gefunden.  Dies kann zu Problemen \
539       führen, falls GnuPT zusammem mit Gpg4win benutzt wird.  Falls Sie GnuPT \
540       zwischenzeitlich bereits entfernt haben, so ignorieren Sie diese \
541       Warnung bitte.  Die Deinstallation von GnuPT erfolgt nicht immer \
542       spurlos und Gpg4win kann deshalb nicht sicher erkennen, ob es \
543       vollständig entfernt wurde.  $\r$\n\
544          $\r$\n\
545       Sie können die Installation von Gpg4win jetzt weiterdurchführen und \
546       danach entscheiden, ob Sie das alte GnuPT dann entfernen.  Sie finden \
547       hierzu Hinweise im Gpg4Win Handbuch für Einsteiger.  Falls Sie die alte \
548       Installation schon jetzt entfernen möchten, so exportieren Sie dort \
549       alle vorhandenen Schlüssel in eine Datei um sie so später in Gpg4Win \
550       wieder importieren zu können.  $\r$\n\
551           $\r$\n\
552       Möchten Sie die Installation von Gpg4win fortführen?"
553
554 #---------
555 LangString T_FoundOldWinPTSF ${LANG_ENGLISH} \
556      "An old installation of the Sourceforge hosted WinPT has been been \
557       detected.  That software is not maintained anymore and should \
558       be removed. $\r$\n\
559           $\r$\n\
560       Do you want to continue installing Gpg4win and take care of the old \
561       installation later?"
562 LangString T_FoundOldWinPTSF ${LANG_GERMAN} \
563      "Eine alte Installation der Windows Privacy Tools von Sourceforge \
564       wurde gefunden.  Diese Software wird nicht mehr gepflegt und verträgt \
565       sich vermutlich nicht mit Gpg4win.  Sie sollte deshalb vom System \
566       entfernt werden.  $\r$\n\
567         $\r$\n\
568       Sie können versuchen, die Installation von Gpg4win jetzt \
569       weiterdurchführen und danach entscheiden, ob Sie die alte Installation \
570       entfernen.  Sie finden hierzu Hinweise im Gpg4Win Handbuch für \
571       Einsteiger.  $\r$\n\
572         $\r$\n\
573       Wir empfehlen alerdings, diese alte Installation vorher zu entfernen. \
574       Brechen Sie hierzu die Installation von Gpg4win ab und exportieren Sie \
575       mittles dieser alten Version alle vorhandenen Schlüssel in eine Datei \
576       um sie so später in Gpg4Win wieder importieren zu können. $\r$\n\
577         $\r$\n\
578       Möchten Sie die Installation von Gpg4win trotzdem jetzt weiter \
579       durchführen?"
580
581
582 #--------
583 LangString T_FoundOldGnuPack ${LANG_ENGLISH} \
584      "An installation of GnuPG-Pack has been been detected. You need to \
585       uninstall it before you can continue with Gpg4win installation. $\r$\n\
586         $\r$\n\
587       The installation will be aborted now!"
588 LangString T_FoundOldGnuPack ${LANG_GERMAN} \
589      "Eine Installation von GnuPG-Pack wurde gefunden.  Sie müssen diese \
590       zuerst deinstallieren bevor Sie mit der Installation von Gpg4win \
591       fortfahren können. $\r$\n\
592         $\r$\n\
593       Die Installation von Gpg4win wird nun abgebrochen!"
594
595
596
597 # From Function PrintNonAdminWarning
598 LangString T_AdminNeeded ${LANG_ENGLISH} \
599    "Warning: Administrator permissions required for a successful installation"
600 LangString T_AdminNeeded ${LANG_GERMAN} \
601    "Achtung: Für eine erfolgreiche Installation werden \
602     Administratorrechte benötigt."
603
604 # From Function PrintCloseOtherApps
605 LangString T_CloseOtherApps ${LANG_ENGLISH} \
606    "Please make sure that other applications are not running. \
607     In particular you should close Outlook and all Explorer \
608     windows.  Gpg4Win will try to install anyway but a reboot \
609     will be required then."
610 LangString T_CloseOtherApps ${LANG_GERMAN} \
611    "Bitte stellen Sie sicher, daß alle anderen Anwendugen geschlossen \
612     sind.  Insbesondere sollten Sie Outlook und alle Explorer Fenster \
613     schliessen bevor Sie die Installation fortsetzen.  Gpg4Win wird auf \
614     jeden Fall versuchen, eine Installation durchzuführen; es ist dann aber \
615     u.U. notwendig, das System neu zu starten."
616 LangString T_ShuttingDownWinPT ${LANG_ENGLISH} \
617    "Trying to shutdown a possible running instance of WinPT."
618 LangString T_ShuttingDownWinPT ${LANG_GERMAN} \
619    "Ein möglicherweise laufendes WinPT wird jetzt automatisch beendet."
620
621
622 # FIXME: The GetAfterChar function comes from the NSIS wiki.
623 Function un.GetAfterChar
624   Exch $0 ; chop char
625   Exch
626   Exch $1 ; input string
627   Push $2
628   Push $3
629   StrCpy $2 0
630   loop:
631     IntOp $2 $2 - 1
632     StrCpy $3 $1 1 $2
633     StrCmp $3 "" 0 +3
634       StrCpy $0 ""
635       Goto exit2
636     StrCmp $3 $0 exit1
637     Goto loop
638   exit1:
639     IntOp $2 $2 + 1
640     StrCpy $0 $1 "" $2
641   exit2:
642     Pop $3
643     Pop $2
644     Pop $1
645     Exch $0 ; output
646 FunctionEnd
647
648
649 Function un.SourceDelete
650   Push "/"
651   Call un.GetAfterChar
652   Pop $R0
653   Delete "$INSTDIR\$R0"
654 FunctionEnd
655
656
657 # StrStr  - taken from the NSIS reference
658 # input, top of stack = string to search for
659 #        top of stack-1 = string to search in
660 # output, top of stack (replaces with the portion of the string remaining)
661 # modifies no other variables.
662 #
663 # Usage:
664 #   Push "this is a long ass string"
665 #   Push "ass"
666 #   Call StrStr
667 #   Pop $R0
668 #  ($R0 at this point is "ass string")
669 #
670 !macro StrStr un
671 Function ${un}StrStr
672    Exch $R1 # st=haystack,old$R1, $R1=needle
673    Exch     # st=old$R1,haystack
674    Exch $R2 # st=old$R1,old$R2, $R2=haystack
675    Push $R3
676    Push $R4
677    Push $R5
678    StrLen $R3 $R1
679    StrCpy $R4 0
680    # $R1=needle
681    # $R2=haystack
682    # $R3=len(needle)
683    # $R4=cnt
684    # $R5=tmp
685    loop:
686      StrCpy $R5 $R2 $R3 $R4
687      StrCmp $R5 $R1 done
688      StrCmp $R5 "" done
689      IntOp $R4 $R4 + 1
690      Goto loop
691  done:
692    StrCpy $R1 $R2 "" $R4
693    Pop $R5
694    Pop $R4
695    Pop $R3
696    Pop $R2
697    Exch $R1
698 FunctionEnd
699 !macroend
700 !insertmacro StrStr ""
701 !insertmacro StrStr "un."
702
703
704 # TrimNewlines  - taken from the NSIS reference
705 # input, top of stack  (e.g. whatever$\r$\n)
706 # output, top of stack (replaces, with e.g. whatever)
707 # modifies no other variables.
708 Function TrimNewlines
709    Exch $R0
710    Push $R1
711    Push $R2
712    StrCpy $R1 0
713  
714  loop:
715    IntOp $R1 $R1 - 1
716    StrCpy $R2 $R0 1 $R1
717    StrCmp $R2 "$\r" loop
718    StrCmp $R2 "$\n" loop
719    IntOp $R1 $R1 + 1
720    IntCmp $R1 0 no_trim_needed
721    StrCpy $R0 $R0 $R1
722  
723  no_trim_needed:
724    Pop $R2
725    Pop $R1
726    Exch $R0
727 FunctionEnd
728
729
730 #
731 # AddToPath - Adds the given dir to the search path.
732 #        Input - head of the stack
733 # (Taken from Kichik's code at the NSIS Wiki)
734 #
735 Function AddToPath
736   Exch $0
737   Push $1
738   Push $2
739   Push $3
740  
741   # Don't add if the path doesn't exist
742   IfFileExists "$0\*.*" "" AddToPath_done
743  
744   ReadEnvStr $1 PATH
745   Push "$1;"
746   Push "$0;"
747   Call StrStr
748   Pop $2
749   StrCmp $2 "" "" AddToPath_done
750   Push "$1;"
751   Push "$0\;"
752   Call StrStr
753   Pop $2
754   StrCmp $2 "" "" AddToPath_done
755   GetFullPathName /SHORT $3 $0
756   Push "$1;"
757   Push "$3;"
758   Call StrStr
759   Pop $2
760   StrCmp $2 "" "" AddToPath_done
761   Push "$1;"
762   Push "$3\;"
763   Call StrStr
764   Pop $2
765   StrCmp $2 "" "" AddToPath_done
766  
767   ReadRegStr $1 ${Regkey_for_Env} "PATH"
768   StrCmp $1 "" AddToPath_NTdoIt
769     Push $1
770     #  We do not need the follwing call
771     #  Call Trim
772     Pop $1
773     StrCpy $0 "$1;$0"
774   AddToPath_NTdoIt:
775     WriteRegExpandStr ${Regkey_for_Env} "PATH" $0
776     SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
777  
778   AddToPath_done:
779     Pop $3
780     Pop $2
781     Pop $1
782     Pop $0
783 FunctionEnd
784  
785 #
786 # RemoveFromPath - Remove a given dir from the path
787 #     Input: head of the stack
788 # (Taken from Kichik's code at the NSIS Wiki)
789
790 Function un.RemoveFromPath
791   Exch $0
792   Push $1
793   Push $2
794   Push $3
795   Push $4
796   Push $5
797   Push $6
798  
799   IntFmt $6 "%c" 26 # DOS EOF
800  
801   ReadRegStr $1 ${Regkey_for_Env} "PATH"
802   StrCpy $5 $1 1 -1 # copy last char
803   StrCmp $5 ";" +2 # if last char != ;
804     StrCpy $1 "$1;" # append ;
805   Push $1
806   Push "$0;"
807   Call un.StrStr # Find `$0;` in $1
808   Pop $2 ; pos of our dir
809   StrCmp $2 "" unRemoveFromPath_done
810     # else, it is in path
811     # $0 - path to add
812     # $1 - path var
813     StrLen $3 "$0;"
814     StrLen $4 $2
815     StrCpy $5 $1 -$4   # $5 is now the part before the path to remove
816     StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove
817     StrCpy $3 $5$6
818  
819     StrCpy $5 $3 1 -1  # copy last char
820     StrCmp $5 ";" 0 +2 # if last char == ;
821       StrCpy $3 $3 -1  # remove last char
822  
823     WriteRegExpandStr ${Regkey_for_Env} "PATH" $3
824     SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
825  
826   unRemoveFromPath_done:
827     Pop $6
828     Pop $5
829     Pop $4
830     Pop $3
831     Pop $2
832     Pop $1
833     Pop $0
834 FunctionEnd
835  
836