Removed Logo.
[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
33 # We use the modern UI.
34 !include "MUI.nsh"
35
36 # Set the package name.  Note that this name should not be sufficed
37 #  with the version because this would get displayed in the start menu.
38 Name "${PRETTY_PACKAGE}"
39
40
41 # Set the output filename.
42 OutFile "${PACKAGE}-${VERSION}.exe"
43
44 Icon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
45 UninstallIcon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
46
47 # Set the installation directory.
48 !ifndef INSTALL_DIR
49 !define INSTALL_DIR "${PACKAGE}"
50 !endif
51 InstallDir "$PROGRAMFILES\GNU\${INSTALL_DIR}" 
52
53
54 InstallDirRegKey HKLM "Software\GNU\${PRETTY_PACKAGE_SHORT}" \
55         "Install Directory"
56
57
58 # Add version information to the file properties.
59 VIProductVersion "${PROD_VERSION}"
60 VIAddVersionKey "ProductName" "${PRETTY_PACKAGE_SHORT} (${VERSION})"
61 !ifdef LICENSE_GPL
62 VIAddVersionKey "Comments" \
63    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
64     and/or modify it under the terms of the GNU General Public License.  \
65     You should have received a copy of the GNU General Public License  \
66     along with this software; if not, write to the Free Software  \
67     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
68     MA 02110-1301, USA"
69 !else
70 VIAddVersionKey "Comments" \
71    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
72     and/or modify it under the terms of the GNU Lesser General Public  \
73     License. You should have received a copy of the GNU Lesser General  \
74     Public License along with this software; if not, write to the Free  \
75     Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
76     MA 02110-1301, USA"
77 !endif
78 VIAddVersionKey "CompanyName" "${COMPANY}"
79 VIAddVersionKey "LegalTrademarks" ""
80 VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
81 VIAddVersionKey "FileDescription" "${DESCRIPTION}"
82 VIAddVersionKey "FileVersion" "${PROD_VERSION}"
83
84 # Set to the name of another GnupG installation if one has been detected
85 Var OtherGnuPGDetected
86
87 # Interface Settings
88
89 # !define MUI_ABORTWARNING
90 !define MUI_FINISHPAGE_NOAUTOCLOSE
91 !define MUI_UNFINISHPAGE_NOAUTOCLOSE
92
93 #!define MUI_HEADERIMAGE
94 #!define MUI_HEADERIMAGE_BITMAP \
95 #               "${TOP_SRCDIR}/doc/logo/gpg4win-logo-150x57.bmp"
96 !define MUI_WELCOMEFINISHPAGE_BITMAP \
97                "${TOP_SRCDIR}/doc/logo/gpg4win-logo-164x314.bmp"
98
99 # Remember the installer language
100
101 #!define MUI_LANGDLL_REGISTRY_ROOT "HKCU" 
102 #!define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}" 
103 #!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
104
105 # The list of wizard pages.
106
107 !define MUI_WELCOMEPAGE_TITLE "$(T_WelcomeTitle)"
108 !define MUI_WELCOMEPAGE_TEXT  "$(T_About)"
109 !insertmacro MUI_PAGE_WELCOME
110
111 !define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
112 !define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
113 !define MUI_LICENSEPAGE_TEXT_BOTTOM "$(T_GPLShort)"
114 !insertmacro MUI_PAGE_LICENSE "${TOP_SRCDIR}/COPYING"
115
116 !define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
117 !insertmacro MUI_PAGE_COMPONENTS
118
119 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckExistingVersion
120 !insertmacro MUI_PAGE_DIRECTORY
121
122 !ifdef HAVE_STARTMENU
123
124 Page custom CustomPageOptions
125
126 Var STARTMENU_FOLDER
127
128 !define MUI_PAGE_CUSTOMFUNCTION_PRE CheckIfStartMenuWanted
129 !define MUI_STARTMENUPAGE_NODISABLE
130 !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
131 !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}"
132 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
133
134 !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
135
136 !endif
137
138 !define MUI_PAGE_CUSTOMFUNCTION_PRE PrintCloseOtherApps
139 !insertmacro MUI_PAGE_INSTFILES
140
141 !define MUI_PAGE_CUSTOMFUNCTION_PRE ShowFinalWarnings
142 !define MUI_FINISHPAGE_SHOWREADME "README.$(T_LangCode).txt"
143 !define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
144 #!define MUI_FINISHPAGE_RUN
145 #!define MUI_FINISHPAGE_RUN_FUNCTION RunOnFinish
146 #!define MUI_FINISHPAGE_RUN_TEXT "$(T_RunKeyManager)"
147 #!define MUI_FINISHPAGE_RUN_NOTCHECKED
148 !define MUI_FINISHPAGE_LINK "$(T_MoreInfo)"
149 !define MUI_FINISHPAGE_LINK_LOCATION http://www.gpg4win.org
150 !insertmacro MUI_PAGE_FINISH
151
152
153 # Uninstaller pages.
154
155 !insertmacro MUI_UNPAGE_CONFIRM
156 !insertmacro MUI_UNPAGE_INSTFILES
157
158
159 #Page license
160 #Page components
161 #Page directory
162 #Page instfiles
163 #UninstPage uninstConfirm
164 #UninstPage instfiles
165
166
167 # Language support.  This has to be done after defining the pages, but
168 # before defining the translation strings.  Confusing.
169
170 !insertmacro MUI_LANGUAGE "English"
171 !insertmacro MUI_LANGUAGE "German"
172
173 #!insertmacro MUI_RESERVEFILE_LANGDLL
174 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
175 ReserveFile "${BUILD_DIR}\g4wihelp.dll"
176 !ifdef SOURCES
177 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-400px.bmp"
178 ReserveFile "${TOP_SRCDIR}\src\gpg4win-splash.wav"
179 !endif
180 ReserveFile "${TOP_SRCDIR}\COPYING"
181 ReserveFile "${TOP_SRCDIR}\src\installer-options.ini"
182 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-164x314.bmp"
183
184 # Language support
185
186 LangString T_LangCode ${LANG_ENGLISH} "en"
187 LangString T_LangCode ${LANG_GERMAN}  "de"
188
189
190 # The WelcomeTitle is displayed on the first page.
191 LangString T_WelcomeTitle ${LANG_ENGLISH} "${WELCOME_TITLE_ENGLISH}"
192 LangString T_WelcomeTitle ${LANG_GERMAN} "${WELCOME_TITLE_GERMAN}"
193
194 # The About string as displayed on the first page.
195 LangString T_About ${LANG_ENGLISH} "${ABOUT_ENGLISH}"
196 LangString T_About ${LANG_GERMAN} "${ABOUT_GERMAN}"
197
198 # Startup page
199 LangString T_GPLHeader ${LANG_ENGLISH} \
200   "This software is licensed under the terms of the GNU General Public \
201    License (GPL) which guarantees your freedom to share and change Free \
202    Software."
203 LangString T_GPLHeader ${LANG_GERMAN}} \
204   "Diese Software ist unter der GNU General Public License \
205    (GPL) lizensiert; dies gibt Ihnen die Freiheit, sie \
206    zu ändern und weiterzugeben."
207
208 LangString T_GPLShort ${LANG_ENGLISH} \
209   "In short: You are allowed to run this software for any purpose. \
210    You may distribute it as long as you give the recipients the same \
211    rights you have received."
212 LangString T_GPLShort ${LANG_GERMAN} \
213   "In aller Kürze: Sie haben das Recht, die Software zu jedem Zweck \
214    einzusetzen.  Sie können die Software weitergeben, sofern Sie dem \
215    Empfänger dieselben Rechte einräumen, die auch Sie erhalten haben."
216
217 LangString T_RunKeyManager ${LANG_ENGLISH} \
218    "Run the key manager"
219 LangString T_RunKeyManager ${LANG_GERMAN} \
220    "Die Schlüsselverwaltung aufrufen"
221
222 LangString T_MoreInfo ${LANG_ENGLISH} \
223    "Click here for the project's homepage"
224 LangString T_MoreInfo ${LANG_GERMAN} \
225    "Hier klicken um zur Homepage des Projekts zu gelangen"
226
227 LangString T_ShowReadme ${LANG_ENGLISH} \
228    "Show the README file"
229 LangString T_ShowReadme ${LANG_GERMAN} \
230    "Die README Datei anzeigen"
231
232 LangString T_NoKeyManager ${LANG_ENGLISH} \
233    "No key manager has been installed, thus we can't run one now."
234 LangString T_NoKeyManager ${LANG_GERMAN} \
235    "Es wurde keine Schlüsselverwaltung installiert. \
236     Deswegen kann sie jetzt auch nicht ausgeführt werden."
237
238
239 # Functions
240
241 # Custom functions and macros for gpg4win. 
242 !include "g4wihelp.nsi"
243
244 #
245 # Control function for the Custom page to select special
246 # install options.
247 #
248 Function CustomPageOptions  
249   !insertmacro MUI_HEADER_TEXT "$(T_InstallOptions)" "$(T_InstallOptLinks)"
250   !insertmacro MUI_INSTALLOPTIONS_DISPLAY "installer-options.ini"
251 FunctionEnd
252
253
254 # Display a warning if GnuPP has been detected and allow the user to abort
255 # the installation.
256 Function PrintGnuPPWarning
257    MessageBox MB_YESNO "$(T_FoundOldGnuPP)" IDYES cont
258      Abort
259  cont:
260    StrCpy $OtherGnuPGDetected "GnuPP"
261 FunctionEnd
262
263 # Display a warning if GnuPT has been detected and allow the user to abort
264 # the installation.
265 Function PrintGnuPTWarning
266    MessageBox MB_YESNO "$(T_FoundOldGnuPT)" IDYES cont
267      Abort
268  cont:
269    StrCpy $OtherGnuPGDetected "GnuPT"
270 FunctionEnd
271
272 # Display a warning if the Sourceforge WinPT has been detected and
273 # allow the user to abort the installation.
274 Function PrintWinPTSFWarning
275    MessageBox MB_YESNO "$(T_FoundOldWinPTSF)" IDYES cont
276      Abort
277  cont:
278    StrCpy $OtherGnuPGDetected "WinPT-SF"
279 FunctionEnd
280
281 # Display a warning if GnuPG Pack has been detected and abort the
282 # the installation.  This one clobbers our own Registry space.
283 Function PrintGnuPackWarning
284    MessageBox MB_OK "$(T_FoundOldGnuPack)"
285    Abort
286 FunctionEnd
287
288
289 # Check whether one of the other GnuPG systems has already been
290 # installed.  We do this by looking at the registry.
291 Function CheckOtherGnuPGApps
292   StrCpy $OtherGnuPGDetected ""
293   ClearErrors
294   ReadRegStr $0 HKLM "Software\GNU\GnuPP\Settings" "Path"
295   IfErrors +2 0
296     Call PrintGnuPPWarning
297
298   EnumRegKey $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs\GnuPT" 0
299   StrCmp $0 "" +2
300     Call PrintGnuPTWarning
301
302   ClearErrors
303   ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Windows Privacy Tools" "DisplayVersion"
304   IfErrors +2 0
305     Call PrintWinPTSFWarning
306
307   ReadRegStr $0 HKLM "Software\GNU\GnuPG" "Install Directory"
308   Push $0
309   Push "GnuPG-Pack"
310   Call StrStr
311   Pop $0
312   StrCmp $0 "" +2
313     Call PrintGnuPackWarning
314
315
316 FunctionEnd
317
318 # Check whether gpg4win has already been installed.  This is called as
319 # a leave function from the directory page.  A call to abort will get
320 # back to the directory selection.
321 Function CheckExistingVersion
322   ClearErrors
323   FileOpen $0 "$INSTDIR\VERSION" r
324   IfErrors leave
325   FileRead $0 $R0
326   FileRead $0 $R1
327   FileClose $0
328
329   Push $R1
330   Call TrimNewLines
331   Pop $R1
332
333   MessageBox MB_YESNO "$(T_FoundExistingVersion)" IDYES leave
334      Abort
335  leave:
336 FunctionEnd
337
338
339
340 # PrintNonAdminWarning
341
342 # Check whether the current user is in the Administrator group or an
343 # OS version without the need for an Administrator is in use.  Print a
344 # warning if this is not the case.
345 Function PrintNonAdminWarning
346   ClearErrors
347   UserInfo::GetName
348   IfErrors leave
349   Pop $0
350   UserInfo::GetAccountType
351   Pop $1
352   StrCmp $1 "Admin" leave +1
353   MessageBox MB_OK "$(T_AdminNeeded)"
354
355  leave:
356 FunctionEnd
357
358
359 # Check whether the start menu is actually wanted.
360
361 Function CheckIfStartMenuWanted
362   !insertmacro MUI_INSTALLOPTIONS_READ $R0 "installer-options.ini" \
363         "Field 1" "State"
364   IntCmp $R0 1 +2
365     Abort
366 FunctionEnd
367
368
369 # Check whether this is a reinstall and popup a message box to explain
370 # that it is better to close other apps before continuing
371 Function PrintCloseOtherApps
372     IfFileExists $INSTDIR\gnupg.exe print_warning
373     IfFileExists $INSTDIR\winpt.exe print_warning
374     IfFileExists $INSTDIR\gpa.exe   print_warning
375     IfFileExists $INSTDIR\gpgol.dll print_warning
376     IfFileExists $INSTDIR\gpgee.dll print_warning
377     Return
378    print_warning:
379     MessageBox MB_OK|MB_ICONEXCLAMATION "$(T_CloseOtherApps)"
380     IfFileExists $INSTDIR\winpt.exe 0 +2
381       ExecWait '"$INSTDIR\winpt.exe" --stop'
382    leave:
383 FunctionEnd
384
385 # Called right before the final page to show more warnings.
386 Function ShowFinalWarnings
387    StrCmp $OtherGnupgDetected "" +2
388      MessageBox MB_OK "$(T_FoundOldSeeManual)"
389    leave:
390 FunctionEnd
391
392 #-----------------------------------------------
393 # Strings pertaining to the install options page
394 #-----------------------------------------------
395
396 # Installation options title
397 LangString T_InstallOptions ${LANG_ENGLISH} "Install Options"
398 LangString T_InstallOptions ${LANG_GERMAN}  "Installationsoptionen"
399
400 # Installation options subtitle 1
401 LangString T_InstallOptLinks ${LANG_ENGLISH} "Start links"
402 LangString T_InstallOptLinks ${LANG_GERMAN}  "Startlinks"
403
404
405 #------------------------------------------------
406 # String pertaining to the existing version check
407 #------------------------------------------------
408 LangString T_FoundExistingVersion ${LANG_ENGLISH} \
409      "Version $R1 has already been installed.  $\r$\n\
410       Do you want to overwrite it with version ${VERSION}?"
411 LangString T_FoundExistingVersion ${LANG_GERMAN} \
412      "Version $R1 ist hier bereits installiert.  $\r$\n\
413       Möchte Sie diese mit Version ${VERSION} überschreiben?"
414
415
416 #---------------------------------------------
417 # From the old installation checking functions
418 #---------------------------------------------
419 LangString T_FoundOldSeeManual ${LANG_ENGLISH} \
420      "Please see the Gpg4win user manual to learn how to migrate existing \
421       keys from other GnuPG based installations to Gpg4win."
422 LangString T_FoundOldSeeManual ${LANG_GERMAN} \
423      "Bitte sehen Sie im Gpg4win für Einsteiger Handbuch nach, wie Sie Ihre \
424       Schlüssel aus anderen - GnuPG basierten - Installationen in Gpg4win \
425       überführen.  Es wird dringend geraten Gpg4Win nicht zusammen mit \
426       diesen anderen Installation zu betreiben."
427
428 #---------
429 LangString T_FoundOldGnuPP ${LANG_ENGLISH} \
430      "An old installation of GnuPP (GNU Privacy Project) has been been \
431       detected.  That software is not maintained anymore and thus should \
432       be removed. $\r$\n\
433           $\r$\n\
434       Do you want to continue installing Gpg4win and take care of the old \
435       installation later?"
436 LangString T_FoundOldGnuPP ${LANG_GERMAN} \
437      "Eine alte Installation von GnuPP (GNU Privacy Project) wurde gefunden. \
438       Diese Software wird nicht mehr gepflegt und sollte deshalb vom \
439       System entfernt werden.  $\r$\n\
440         $\r$\n\
441       Sie können die Installation von Gpg4win jetzt weiterdurchführen und \
442       danach entscheiden, ob Sie das alte GnuPP dann entfernen.  Sie finden \
443       hierzu Hinweise im Gpg4Win Handbuch für Einsteiger.  Falls Sie die alte \
444       Installation schon jetzt entfernen möchten, so exportieren Sie dort \
445       alle vorhandenen Schlüssel in eine Datei um sie so später in Gpg4Win \
446       wieder importieren zu können. $\r$\n\
447         $\r$\n\
448       Möchten Sie die Installation von Gpg4win weiter durchführen und sich \
449       dann später um die Entfernung von GnuPP kümmern?"
450
451 #---------
452 LangString T_FoundOldGnuPT ${LANG_ENGLISH} \
453      "An installation of GnuPT has been been detected.  This may cause \
454       problems when used along with Gpg4win. $\r$\n\
455           $\r$\n\
456       Do you want to continue installing Gpg4win?"
457 LangString T_FoundOldGnuPT ${LANG_GERMAN} \
458      "Eine Installation von GnuPT wurde gefunden.  Dies kann zu Problemen \
459       führen, falls GnuPT zusammem mit Gpg4win benutzt wird.  Falls Sie GnuPT \
460       zwischenzeitlich bereits entfernt haben, so ignorieren Sie diese \
461       Warnung bitte.  Die Deinstallation von GnuPT erfolgt nicht immer \
462       spurlos und Gpg4win kann deshalb nicht sicher erkennen, ob es \
463       vollständig entfernt wurde.  $\r$\n\
464          $\r$\n\
465       Sie können die Installation von Gpg4win jetzt weiterdurchführen und \
466       danach entscheiden, ob Sie das alte GnuPT dann entfernen.  Sie finden \
467       hierzu Hinweise im Gpg4Win Handbuch für Einsteiger.  Falls Sie die alte \
468       Installation schon jetzt entfernen möchten, so exportieren Sie dort \
469       alle vorhandenen Schlüssel in eine Datei um sie so später in Gpg4Win \
470       wieder importieren zu können.  $\r$\n\
471           $\r$\n\
472       Möchten Sie die Installation von Gpg4win fortführen?"
473
474 #---------
475 LangString T_FoundOldWinPTSF ${LANG_ENGLISH} \
476      "An old installation of the Sourceforge hosted WinPT has been been \
477       detected.  That software is not maintained anymore and should \
478       be removed. $\r$\n\
479           $\r$\n\
480       Do you want to continue installing Gpg4win and take care of the old \
481       installation later?"
482 LangString T_FoundOldWinPTSF ${LANG_GERMAN} \
483      "Eine alte Installation der Windows Privacy Tools von Sourceforge \
484       wurde gefunden.  Diese Software wird nicht mehr gepflegt und verträgt \
485       sich vermutlich nicht mit Gpg4win.  Sie sollte deshalb vom System \
486       entfernt werden.  $\r$\n\
487         $\r$\n\
488       Sie können versuchen, die Installation von Gpg4win jetzt \
489       weiterdurchführen und danach entscheiden, ob Sie die alte Installation \
490       entfernen.  Sie finden hierzu Hinweise im Gpg4Win Handbuch für \
491       Einsteiger.  $\r$\n\
492         $\r$\n\
493       Wir empfehlen alerdings, diese alte Installation vorher zu entfernen. \
494       Brechen Sie hierzu die Installation von Gpg4win ab und exportieren Sie \
495       mittles dieser alten Version alle vorhandenen Schlüssel in eine Datei \
496       um sie so später in Gpg4Win wieder importieren zu können. $\r$\n\
497         $\r$\n\
498       Möchten Sie die Installation von Gpg4win trotzdem jetzt weiter \
499       durchführen?"
500
501
502 #--------
503 LangString T_FoundOldGnuPack ${LANG_ENGLISH} \
504      "An installation of GnuPG-Pack has been been detected. You need to \
505       uninstall it before you can continue with Gpg4win installation. $\r$\n\
506         $\r$\n\
507       The installation will be aborted now!"
508 LangString T_FoundOldGnuPack ${LANG_GERMAN} \
509      "Eine Installation von GnuPG-Pack wurde gefunden.  Sie müssen diese \
510       zuerst deinstallieren bevor Sie mit der Installation von Gpg4win \
511       fortfahren können. $\r$\n\
512         $\r$\n\
513       Die Installation von Gpg4win wird nun abgebrochen!"
514
515
516
517 # From Function PrintNonAdminWarning
518 LangString T_AdminNeeded ${LANG_ENGLISH} \
519    "Warning: Administrator permissions required for a successful installation"
520 LangString T_AdminNeeded ${LANG_GERMAN} \
521    "Achtung: Für eine erfolgreiche Installation werden \
522     Administratorrechte benötigt."
523
524 # From Function PrintCloseOtherApps
525 LangString T_CloseOtherApps ${LANG_ENGLISH} \
526    "Please make sure that other applications are not running. \
527     In particular you should close Outlook and all Explorer \
528     windows.  Gpg4Win will try to install anyway but a reboot \
529     will be required then."
530 LangString T_CloseOtherApps ${LANG_GERMAN} \
531    "Bitte stellen Sie sicher, daß alle anderen Anwendugen geschlossen \
532     sind.  Insbesondere sollten Sie Outlook und alle Explorer Fenster \
533     schliessen bevor Sie die Installation fortsetzen.  Gpg4Win wird auf \
534     jeden Fall versuchen, eine Installation durchzuführen; es ist dann aber \
535     u.U. notwendig, das System neu zu starten."
536
537 # FIXME: The GetAfterChar function comes from the NSIS wiki.
538 Function un.GetAfterChar
539   Exch $0 ; chop char
540   Exch
541   Exch $1 ; input string
542   Push $2
543   Push $3
544   StrCpy $2 0
545   loop:
546     IntOp $2 $2 - 1
547     StrCpy $3 $1 1 $2
548     StrCmp $3 "" 0 +3
549       StrCpy $0 ""
550       Goto exit2
551     StrCmp $3 $0 exit1
552     Goto loop
553   exit1:
554     IntOp $2 $2 + 1
555     StrCpy $0 $1 "" $2
556   exit2:
557     Pop $3
558     Pop $2
559     Pop $1
560     Exch $0 ; output
561 FunctionEnd
562
563
564 Function un.SourceDelete
565   Push "/"
566   Call un.GetAfterChar
567   Pop $R0
568   Delete "$INSTDIR\$R0"
569 FunctionEnd
570
571
572 # StrStr  - taken from the NSIS reference
573 # input, top of stack = string to search for
574 #        top of stack-1 = string to search in
575 # output, top of stack (replaces with the portion of the string remaining)
576 # modifies no other variables.
577 #
578 # Usage:
579 #   Push "this is a long ass string"
580 #   Push "ass"
581 #   Call StrStr
582 #   Pop $R0
583 #  ($R0 at this point is "ass string")
584 #
585 Function StrStr
586    Exch $R1 # st=haystack,old$R1, $R1=needle
587    Exch     # st=old$R1,haystack
588    Exch $R2 # st=old$R1,old$R2, $R2=haystack
589    Push $R3
590    Push $R4
591    Push $R5
592    StrLen $R3 $R1
593    StrCpy $R4 0
594    # $R1=needle
595    # $R2=haystack
596    # $R3=len(needle)
597    # $R4=cnt
598    # $R5=tmp
599    loop:
600      StrCpy $R5 $R2 $R3 $R4
601      StrCmp $R5 $R1 done
602      StrCmp $R5 "" done
603      IntOp $R4 $R4 + 1
604      Goto loop
605  done:
606    StrCpy $R1 $R2 "" $R4
607    Pop $R5
608    Pop $R4
609    Pop $R3
610    Pop $R2
611    Exch $R1
612 FunctionEnd
613
614 # TrimNewlines  - taken from the NSIS reference
615 # input, top of stack  (e.g. whatever$\r$\n)
616 # output, top of stack (replaces, with e.g. whatever)
617 # modifies no other variables.
618 Function TrimNewlines
619    Exch $R0
620    Push $R1
621    Push $R2
622    StrCpy $R1 0
623  
624  loop:
625    IntOp $R1 $R1 - 1
626    StrCpy $R2 $R0 1 $R1
627    StrCmp $R2 "$\r" loop
628    StrCmp $R2 "$\n" loop
629    IntOp $R1 $R1 + 1
630    IntCmp $R1 0 no_trim_needed
631    StrCpy $R0 $R0 $R1
632  
633  no_trim_needed:
634    Pop $R2
635    Pop $R1
636    Exch $R0
637 FunctionEnd
638