Update KDE Frameworks to 5.55.0
[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 # Copyright (C) 2017 Intevation GmbH
4 #
5 # This file is part of GPG4Win.
6 #
7 # GPG4Win is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11 #
12 # GPG4Win is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20
21 # No servicable parts beyond this line.  Stay clear :)
22
23 !ifdef REQUIRE_W32_NSIS
24 !ifdef PACKAGE_LIBRARY
25 !include "Library.nsh"
26 !endif
27 !else
28 !macro InstallLib libtype shared install localfile destfile tempbasedir
29   File "${localfile}"
30 !macroend
31 !endif
32
33 !include "FileFunc.nsh"
34 !include "WinMessages.nsh"
35 !include "WinVer.nsh"
36
37 # We use the modern UI 2.
38 !include "MUI2.nsh"
39
40 !ifdef DEBUG
41 !undef DEBUG
42 !endif
43
44 # Set the package name.  Note that this name should not be sufficed
45 #  with the version because this would get displayed in the start menu.
46 Name "${PRETTY_PACKAGE}"
47 OutFile "${PACKAGE}-${VERSION}.exe"
48 BrandingText "${PRETTY_PACKAGE}-${VERSION}"
49
50 # Details button conflicts with splashscreen
51 ShowInstDetails nevershow
52
53 # Set the installation directory.
54 !ifndef INSTALL_DIR
55 !define INSTALL_DIR "${PACKAGE}"
56 !endif
57 InstallDir "$PROGRAMFILES\${INSTALL_DIR}"
58
59 # Add version information to the file properties.
60 VIProductVersion "${PROD_VERSION}"
61 VIAddVersionKey "ProductName" "${PRETTY_PACKAGE_SHORT} (${VERSION})"
62 !ifdef LICENSE_GPL
63 VIAddVersionKey "Comments" \
64    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
65     and/or modify it under the terms of the GNU General Public License.  \
66     You should have received a copy of the GNU General Public License  \
67     along with this software; if not, write to the Free Software  \
68     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
69     MA 02110-1301, USA"
70 !else
71 VIAddVersionKey "Comments" \
72    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
73     and/or modify it under the terms of the GNU Lesser General Public  \
74     License. You should have received a copy of the GNU Lesser General  \
75     Public License along with this software; if not, write to the Free  \
76     Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
77     MA 02110-1301, USA"
78 !endif
79 VIAddVersionKey "CompanyName" "${COMPANY}"
80 VIAddVersionKey "LegalTrademarks" ""
81 VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
82 VIAddVersionKey "FileDescription" "${DESCRIPTION}"
83 VIAddVersionKey "FileVersion" "${PROD_VERSION}"
84
85 # Set to the name of another GnuPG installation if one has been detected
86 Var OtherGnuPGDetected
87
88 # Interface Settings
89
90 # !define MUI_ABORTWARNING
91 !define MUI_FINISHPAGE_NOAUTOCLOSE
92 !define MUI_UNFINISHPAGE_NOAUTOCLOSE
93
94 !define MUI_HEADERIMAGE
95 !define MUI_HEADERIMAGE_BITMAP \
96                "${TOP_SRCDIR}/doc/logo/gpg4win-nsis-header-install-150x57.bmp"
97 !define MUI_HEADERIMAGE_UNBITMAP \
98                "${TOP_SRCDIR}/doc/logo/gpg4win-nsis-header-uninstall-150x57.bmp"
99 !define MUI_WELCOMEFINISHPAGE_BITMAP \
100                "${TOP_SRCDIR}/doc/logo/gpg4win-nsis-wizard-install-164x314.bmp"
101 !define MUI_UNWELCOMEFINISHPAGE_BITMAP \
102                "${TOP_SRCDIR}/doc/logo/gpg4win-nsis-wizard-uninstall-164x314.bmp"
103 !define MUI_ICON "${TOP_SRCDIR}/doc/logo/gpg4win-nsis-install.ico"
104 !define MUI_UNICON "${TOP_SRCDIR}/doc/logo/gpg4win-nsis-uninstall.ico"
105
106 # Remember the installer language
107
108 !define MUI_LANGDLL_REGISTRY_ROOT "SHCTX"
109 !define MUI_LANGDLL_REGISTRY_KEY "Software\${PRETTY_PACKAGE_SHORT}"
110 !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
111
112 # No Umlaute, please!
113 !define MUI_LANGDLL_INFO "Please choose a language for the setup.$\r$\n\
114 Bitte die Sprache des Installations-Vorgangs angeben."
115
116 # The list of wizard pages.
117
118 !define MUI_WELCOMEPAGE_TITLE "${WELCOME_TITLE_STR}"
119 !define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomeFunction
120 !define MUI_WELCOMEPAGE_TEXT "${ABOUT_STR}"
121
122 !insertmacro MUI_PAGE_WELCOME
123
124 Function WelcomeFunction
125   IfSilent leave
126   ClearErrors
127   ReadRegStr $0 SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\GPG4Win" "DisplayVersion"
128   IfErrors leave 0
129   StrCmp $0 "" leave
130   SendMessage $mui.WelcomePage.Text ${WM_SETTEXT} 0 "STR:${ABOUT_STR}$\r$\n$(T_UPDATE_STR) $0"
131 leave:
132 FunctionEnd
133
134 #!define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
135 #!define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
136 #!insertmacro MUI_PAGE_LICENSE "license.blurb"
137
138 !define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
139 !insertmacro MUI_PAGE_COMPONENTS
140
141 !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckExistingVersion
142 !insertmacro MUI_PAGE_DIRECTORY
143
144 !define MUI_PAGE_CUSTOMFUNCTION_PRE BeforeInstallHooks
145 !insertmacro MUI_PAGE_INSTFILES
146 # Finish page
147 !ifndef SOURCES
148 !define MUI_PAGE_CUSTOMFUNCTION_PRE ShowFinalWarnings
149
150 !define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishFunction
151 !define MUI_FINISHPAGE_RUN
152 !define MUI_FINISHPAGE_RUN_FUNCTION RunAsUser
153 !define MUI_FINISHPAGE_SHOWREADME "share\gpg4win\README.$(T_LangCode).txt"
154 !define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
155 !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
156 !define MUI_FINISHPAGE_LINK "$(T_MoreInfo)"
157 !define MUI_FINISHPAGE_LINK_LOCATION "$(T_MoreInfoURL)"
158 !insertmacro MUI_PAGE_FINISH
159
160 Function FinishFunction
161   IfSilent leave
162   !insertmacro SectionFlagIsSet ${SEC_kleopatra} \
163         ${SF_SELECTED} have_kleo check_gpa
164 check_gpa:
165   !insertmacro SectionFlagIsSet ${SEC_gpa} \
166         ${SF_SELECTED} have_gpa have_nothing
167 have_nothing:
168   ShowWindow $mui.FinishPage.Run ${SW_HIDE}
169   goto leave
170 have_kleo:
171   SendMessage $mui.FinishPage.Run.Text ${WM_SETTEXT} 0 "STR:$(T_RunKleopatra)"
172   goto leave
173 have_gpa:
174   SendMessage $mui.FinishPage.Run.Text ${WM_SETTEXT} 0 "STR:$(T_RunGPA)"
175 leave:
176 FunctionEnd
177
178 Function RunAsUser
179   !insertmacro SectionFlagIsSet ${SEC_kleopatra} \
180         ${SF_SELECTED} do_kleo skip_kleo
181 do_kleo:
182   g4wihelp::DesktopShellRun "$INSTDIR\bin\kleopatra.exe"
183   goto leave
184 skip_kleo:
185   !insertmacro SectionFlagIsSet ${SEC_gpa} \
186         ${SF_SELECTED} do_gpa leave
187 do_gpa:
188   g4wihelp::DesktopShellRun "$INSTDIR\bin\gpa.exe"
189 leave:
190 FunctionEnd
191
192 LangString T_RunKleopatra ${LANG_ENGLISH} \
193    "Run Kleopatra"
194
195 LangString T_RunGPA ${LANG_ENGLISH} \
196    "Run GPA"
197
198 # /SOURCES
199 !endif
200
201 # Uninstaller pages.
202
203 !insertmacro MUI_UNPAGE_WELCOME
204 !insertmacro MUI_UNPAGE_CONFIRM
205 !ifndef SOURCES
206 !define MUI_PAGE_CUSTOMFUNCTION_PRE un.CloseApps
207 !endif
208 !insertmacro MUI_UNPAGE_INSTFILES
209 #!insertmacro MUI_UNPAGE_FINISH
210
211 #Page license
212 #Page components
213 #Page directory
214 #Page instfiles
215 #UninstPage uninstConfirm
216 #UninstPage instfiles
217
218
219 # Language support.  This has to be done after defining the pages, but
220 # before defining the translation strings.  Confusing.
221
222 # Enable this to not filter languages for the current code page.  Note
223 # that languages which are then not filtered out may not be displayed
224 # correctly in the Windows version the user is using.  Not recommended,
225 # but can be useful for testing.
226 !ifdef DEBUG
227 !define MUI_LANGDLL_ALLLANGUAGES
228 !endif
229
230 !insertmacro MUI_LANGUAGE "English"
231 !define PO_HEADER
232 !include "../po/catalogs.nsi"
233 !undef PO_HEADER
234
235 !insertmacro MUI_RESERVEFILE_LANGDLL
236 ReserveFile "${BUILD_DIR}\g4wihelp.dll"
237 !ifdef SOURCES
238 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-400px.bmp"
239 ReserveFile "${TOP_SRCDIR}\src\gpg4win-splash.wav"
240 !endif
241 ReserveFile "${TOP_SRCDIR}\COPYING"
242 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-164x314.bmp"
243
244 # Language support
245
246 LangString T_LangCode ${LANG_ENGLISH} "en"
247
248 # Startup page
249 LangString T_GPLHeader ${LANG_ENGLISH} \
250   "This software is licensed under the terms of the GNU General Public \
251    License (GNU GPL)."
252
253 LangString T_GPLShort ${LANG_ENGLISH} \
254   "In short: You are allowed to run this software for any purpose. \
255    You may distribute it as long as you give the recipients the same \
256    rights you have received."
257
258 LangString T_MoreInfo ${LANG_ENGLISH} \
259    "Go to Gpg4win's webpage"
260 LangString T_MoreInfoURL ${LANG_ENGLISH} "https://www.gpg4win.org"
261
262 LangString T_ShowReadme ${LANG_ENGLISH} \
263    "Show the README file"
264
265 LangString T_NoKeyManager ${LANG_ENGLISH} \
266    "No key manager has been installed, thus we can't run one now."
267
268 # Used as subdirectory name in Start Menu.
269
270 LangString DESC_Menu_manuals ${LANG_ENGLISH} \
271    "Documentation"
272
273 LangString DESC_Menu_uninstall ${LANG_ENGLISH} \
274    "Uninstall"
275
276 # Used as subdirectory name on Desktop.
277 LangString DESC_Desktop_manuals ${LANG_ENGLISH} \
278    "Gpg4win Documentation"
279
280
281 # Functions
282
283 # Custom functions and macros for gpg4win.
284 !include "g4wihelp.nsi"
285
286 # Display a warning if this is a Beta version.
287 #Function PrintBetaWarning
288 #   MessageBox MB_OK "$(T_BetaWarning)"
289 #FunctionEnd
290
291
292 # Display a warning if GnuPP has been detected and allow the user to abort
293 # the installation.
294 Function PrintGnuPPWarning
295    MessageBox MB_YESNO "$(T_FoundOldGnuPP)" IDYES cont
296      Abort
297  cont:
298    StrCpy $OtherGnuPGDetected "GnuPP"
299 FunctionEnd
300
301 # Display a warning if GnuPT has been detected and allow the user to abort
302 # the installation.
303 Function PrintGnuPTWarning
304    MessageBox MB_YESNO "$(T_FoundOldGnuPT)" IDYES cont
305      Abort
306  cont:
307    StrCpy $OtherGnuPGDetected "GnuPT"
308 FunctionEnd
309
310 # Display a warning if the Sourceforge WinPT has been detected and
311 # allow the user to abort the installation.
312 Function PrintWinPTSFWarning
313    MessageBox MB_YESNO "$(T_FoundOldWinPTSF)" IDYES cont
314      Abort
315  cont:
316    StrCpy $OtherGnuPGDetected "WinPT-SF"
317 FunctionEnd
318
319 # Display a warning if GnuPG Pack has been detected and abort the
320 # the installation.  This one clobbers our own Registry space.
321 Function PrintGnuPackWarning
322    MessageBox MB_OK "$(T_FoundOldGnuPack)"
323    Abort
324 FunctionEnd
325
326
327 # Check whether one of the other GnuPG systems has already been
328 # installed.  We do this by looking at the registry.
329 !ifndef SOURCES
330 Function CheckOtherGnuPGApps
331   StrCpy $OtherGnuPGDetected ""
332   ClearErrors
333   ReadRegStr $0 SHCTX "Software\GNU\GnuPP\Settings" "Path"
334   IfErrors +2 0
335     Call PrintGnuPPWarning
336
337   EnumRegKey $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs\GnuPT" 0
338   StrCmp $0 "" +2
339     Call PrintGnuPTWarning
340
341   ClearErrors
342   ReadRegStr $0 SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\Windows Privacy Tools" "DisplayVersion"
343   IfErrors +2 0
344     Call PrintWinPTSFWarning
345
346   ReadRegStr $0 SHCTX "Software\GNU\GnuPG" "Install Directory"
347   Push $0
348   Push "GnuPG-Pack"
349   Call StrStr
350   Pop $0
351   StrCmp $0 "" +2
352     Call PrintGnuPackWarning
353
354
355 FunctionEnd
356 !endif
357
358 # Check whether gpg4win has already been installed.  This is called as
359 # a leave function from the directory page.  A call to abort will get
360 # back to the directory selection.
361 Function CheckExistingVersion
362   ClearErrors
363   FileOpen $0 "$INSTDIR\VERSION" r
364   IfErrors leave
365   FileRead $0 $R0
366   FileRead $0 $R1
367   FileClose $0
368
369   Push $R1
370   Call TrimNewLines
371   Pop $R1
372
373   # Extract major version.
374   StrCpy $0 $R1 2
375   StrCmp $0 "1." 0 leave
376     MessageBox MB_YESNO "$(T_FoundExistingOldVersion)" IDYES leave
377     Abort
378
379  leave:
380 FunctionEnd
381
382
383
384 # PrintNonAdminWarning
385
386 # Check whether the current user is in the Administrator group or an
387 # OS version without the need for an Administrator is in use.  Print a
388 # diagnostic if this is not the case and abort installation.
389 Function PrintNonAdminWarning
390
391   #Call PrintBetaWarning
392
393   ClearErrors
394   UserInfo::GetName
395   IfErrors leave
396   Pop $0
397   UserInfo::GetAccountType
398   Pop $1
399   StrCmp $1 "Admin" leave +1
400   MessageBox MB_YESNO "$(T_AdminWanted)" IDNO exit
401   goto leave
402 exit:
403   Quit
404  leave:
405 FunctionEnd
406
407
408 # Check for claws mail installation which was shipped in Gpg4win
409 # versions < 2.2.6
410 Function CheckClawsUninstall
411     IfFileExists $INSTDIR\claws-mail.exe 0 leave
412     MessageBox MB_YESNO "$(T_FoundOldClaws)" IDYES uninstall IDNO leave
413    uninstall:
414     !insertmacro SelectSection ${SecUninstClawsMail}
415    leave:
416 FunctionEnd
417
418 # Check whether this is a reinstall and popup a message box to explain
419 # that it is better to close other apps before continuing
420 Function KillOtherAppsOrWarn
421    g4wihelp::KillProc "kleopatra.exe"
422    g4wihelp::KillProc "gpa.exe"
423    g4wihelp::KillProc "gpgme-w32spawn.exe"
424    g4wihelp::KillProc "resolver.exe"
425    g4wihelp::KillProc "overlayer.exe"
426    g4wihelp::KillProc "gpg-agent.exe"
427    g4wihelp::KillProc "gpg.exe"
428    g4wihelp::KillProc "dirmngr.exe"
429    g4wihelp::KillProc "gpgsm.exe"
430 goto leave
431 # TODO check for running outlook and offer to kill it.
432    print_warning:
433     MessageBox MB_OK|MB_ICONEXCLAMATION "$(T_CloseOtherApps)"
434 leave:
435 FunctionEnd
436
437 Function un.CloseApps
438    g4wihelp::KillProc "kleopatra.exe"
439    g4wihelp::KillProc "gpa.exe"
440    g4wihelp::KillProc "gpgme-w32spawn.exe"
441    g4wihelp::KillProc "resolver.exe"
442    g4wihelp::KillProc "overlayer.exe"
443    g4wihelp::KillProc "gpg-agent.exe"
444    g4wihelp::KillProc "gpg.exe"
445    g4wihelp::KillProc "dirmngr.exe"
446    g4wihelp::KillProc "gpgsm.exe"
447 FunctionEnd
448
449 # Called right before installation
450 Function BeforeInstallHooks
451     Call CheckClawsUninstall
452 FunctionEnd
453
454 # Called right before the final page to show more warnings.
455 Function ShowFinalWarnings
456    StrCmp $OtherGnupgDetected "" +2
457      MessageBox MB_OK "$(T_FoundOldSeeManual)"
458    leave:
459 FunctionEnd
460
461 #-----------------------------------------------
462 # Strings pertaining to the install options page
463 #-----------------------------------------------
464
465 # Installation options title
466 LangString T_InstallOptions ${LANG_ENGLISH} "Install Options"
467
468 # Installation options subtitle 1
469 LangString T_InstallOptLinks ${LANG_ENGLISH} "Start links"
470
471 LangString T_InstOptLabelA  ${LANG_ENGLISH} \
472      "Please select where Gpg4win shall install links:"
473
474 LangString T_InstOptLabelB  ${LANG_ENGLISH} \
475      "(Only programs will be linked into the quick launch bar.)"
476
477 LangString T_InstOptFieldA  ${LANG_ENGLISH} \
478      "Start Menu"
479
480 LangString T_InstOptFieldB  ${LANG_ENGLISH} \
481      "Desktop"
482
483 LangString T_InstOptFieldC  ${LANG_ENGLISH} \
484      "Quick Launch Bar"
485
486 #------------------------------------------------
487 # String pertaining to the existing version check
488 #------------------------------------------------
489 LangString T_FoundExistingVersion ${LANG_ENGLISH} \
490      "Version $R1 has already been installed.  $\r$\n\
491       Do you want to overwrite it with version ${VERSION}?"
492 LangString T_FoundExistingOldVersion ${LANG_ENGLISH} \
493      "An old version $R1 has already been installed.  It is \
494       strongly recommended to deinstall previous versions on \
495       major upgrades. $\r$\n\
496       Do you want to continue installing Gpg4win ${VERSION} anyway?"
497 LangString T_UninstallingOldVersion ${LANG_ENGLISH} \
498      "Uninstalling Gpg4win-"
499
500
501 #---------------------------------------------
502 # From the old installation checking functions
503 #---------------------------------------------
504 LangString T_FoundOldSeeManual ${LANG_ENGLISH} \
505      "Please see the Gpg4win user manual to learn how to migrate existing \
506       keys from other GnuPG based installations to Gpg4win."
507
508 #---------
509 LangString T_FoundOldGnuPP ${LANG_ENGLISH} \
510      "An old installation of GnuPP (GNU Privacy Project) has 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
517 #---------
518 LangString T_FoundOldGnuPT ${LANG_ENGLISH} \
519      "An installation of GnuPT has been detected.  This may cause \
520       problems when used along with Gpg4win. $\r$\n\
521           $\r$\n\
522       Do you want to continue installing Gpg4win?"
523
524 #---------
525 LangString T_FoundOldWinPTSF ${LANG_ENGLISH} \
526      "An old installation of the Sourceforge hosted WinPT has been \
527       detected.  That software is not maintained anymore and should \
528       be removed. $\r$\n\
529           $\r$\n\
530       Do you want to continue installing Gpg4win and take care of the old \
531       installation later?"
532
533
534 #--------
535 LangString T_FoundOldGnuPack ${LANG_ENGLISH} \
536      "An installation of GnuPG-Pack has been detected. You need to \
537       uninstall it before you can continue with Gpg4win installation. $\r$\n\
538         $\r$\n\
539       The installation will be aborted now!"
540
541
542
543 # From Function PrintBetaWarning
544 LangString T_BetaWarning ${LANG_ENGLISH} \
545    "Note: This is a BETA version of Gpg4win. $\r$\n\
546      $\r$\n\
547     Beta versions are only intended for testing and \
548     shall not be used in a production environment."
549
550 # From Function PrintNonAdminWarning
551 LangString T_AdminWanted ${LANG_ENGLISH} \
552     "Warning: It is recommended to install Gpg4win system-wide with \
553         administrator rights. \
554           $\r$\n\
555           $\r$\n\
556     Do you want to continue installing Gpg4win without administrator rights?"
557
558 # From Function KillOtherAppsOrWarn
559 LangString T_CloseOtherApps ${LANG_ENGLISH} \
560    "Please make sure that other applications are not running. \
561     In particular you should close Outlook and all Explorer \
562     windows.  Gpg4win will try to install anyway but a reboot \
563     will be required then."
564 LangString T_ShuttingDownWinPT ${LANG_ENGLISH} \
565    "Trying to shutdown a possible running instance of WinPT."
566
567 # From Function CheckClawsUninstall
568 LangString T_FoundOldClaws ${LANG_ENGLISH} \
569    "An old version of Claws Mail was found in your Installation directory. \
570     $\r$\nPlease note that Claws Mail is no longer bundled with Gpg4win \
571     and is now available as a standalone package.$\r$\n\
572     You should uninstall Claws Mail now, and if you wish to \
573     continue to use it, install an up-to-date version from:$\r$\n\
574     http://www.claws-mail.org/win32 $\r$\n$\r$\n\
575     Uninstall Claws Mail from Gpg4win now?"
576
577 # From Function CheckClawsUninstall
578 LangString T_WinisDeprecated ${LANG_ENGLISH} \
579    "Windows Versions before Windows 7 are no longer maintained by Gpg4win. \
580     $\r$\nSupport for them may be removed in a future version.\
581     $\r$\n$\r$\nKleopatra is disabled."
582
583 # From Function WelcomeFunction
584 LangString T_UPDATE_STR ${LANG_ENGLISH} \
585    "Updating Version"
586
587 # FIXME: The GetAfterChar function comes from the NSIS wiki.
588 Function un.GetAfterChar
589   Exch $0 ; chop char
590   Exch
591   Exch $1 ; input string
592   Push $2
593   Push $3
594   StrCpy $2 0
595   loop:
596     IntOp $2 $2 - 1
597     StrCpy $3 $1 1 $2
598     StrCmp $3 "" 0 +3
599       StrCpy $0 ""
600       Goto exit2
601     StrCmp $3 $0 exit1
602     Goto loop
603   exit1:
604     IntOp $2 $2 + 1
605     StrCpy $0 $1 "" $2
606   exit2:
607     Pop $3
608     Pop $2
609     Pop $1
610     Exch $0 ; output
611 FunctionEnd
612
613
614 Function un.SourceDelete
615   Push "/"
616   Call un.GetAfterChar
617   Pop $R0
618   Delete "$INSTDIR\$R0"
619 FunctionEnd
620
621
622 # StrStr  - taken from the NSIS reference
623 # input, top of stack = string to search for
624 #        top of stack-1 = string to search in
625 # output, top of stack (replaces with the portion of the string remaining)
626 # modifies no other variables.
627 #
628 # Usage:
629 #   Push "this is a long ass string"
630 #   Push "ass"
631 #   Call StrStr
632 #   Pop $R0
633 #  ($R0 at this point is "ass string")
634 #
635 !macro StrStr un
636 Function ${un}StrStr
637    Exch $R1 # st=haystack,old$R1, $R1=needle
638    Exch     # st=old$R1,haystack
639    Exch $R2 # st=old$R1,old$R2, $R2=haystack
640    Push $R3
641    Push $R4
642    Push $R5
643    StrLen $R3 $R1
644    StrCpy $R4 0
645    # $R1=needle
646    # $R2=haystack
647    # $R3=len(needle)
648    # $R4=cnt
649    # $R5=tmp
650    loop:
651      StrCpy $R5 $R2 $R3 $R4
652      StrCmp $R5 $R1 done
653      StrCmp $R5 "" done
654      IntOp $R4 $R4 + 1
655      Goto loop
656  done:
657    StrCpy $R1 $R2 "" $R4
658    Pop $R5
659    Pop $R4
660    Pop $R3
661    Pop $R2
662    Exch $R1
663 FunctionEnd
664 !macroend
665
666
667 # TrimNewlines  - taken from the NSIS reference
668 # input, top of stack  (e.g. whatever$\r$\n)
669 # output, top of stack (replaces, with e.g. whatever)
670 # modifies no other variables.
671 Function TrimNewlines
672    Exch $R0
673    Push $R1
674    Push $R2
675    StrCpy $R1 0
676
677  loop:
678    IntOp $R1 $R1 - 1
679    StrCpy $R2 $R0 1 $R1
680    StrCmp $R2 "$\r" loop
681    StrCmp $R2 "$\n" loop
682    IntOp $R1 $R1 + 1
683    IntCmp $R1 0 no_trim_needed
684    StrCpy $R0 $R0 $R1
685
686  no_trim_needed:
687    Pop $R2
688    Pop $R1
689    Exch $R0
690 FunctionEnd
691
692
693 Function .onInit
694   Call G4wRunOnce
695
696   SetOutPath $TEMP
697 !ifdef SOURCES
698   File /oname=gpgspltmp.bmp "${TOP_SRCDIR}/doc/logo/gpg4win-logo-400px.bmp"
699   # We play the tune only for the source installer
700   File /oname=gpgspltmp.wav "${TOP_SRCDIR}/src/gpg4win-splash.wav"
701   g4wihelp::playsound $TEMP\gpgspltmp.wav
702   g4wihelp::showsplash 2500 $TEMP\gpgspltmp.bmp
703
704   Delete $TEMP\gpgspltmp.bmp
705   # Note that we delete gpgspltmp.wav in .onInst{Failed,Success}
706 !else
707   ${GetParameters} $R0
708   ClearErrors
709   ${GetOptions} $R0 /MINIMAL= $is_minimal
710   ${GetOptions} $R0 /WITH_BROWSER= $with_browser
711
712   Var /GLOBAL changed_dir
713   # Check if the install directory was modified on the command line
714   StrCmp "$INSTDIR" "$PROGRAMFILES\${INSTALL_DIR}" unmodified 0
715   # It is modified. Save that value.
716   StrCpy $changed_dir "$INSTDIR"
717
718   # MULITUSER_INIT overwrites directory setting from command line
719   !insertmacro MULTIUSER_INIT
720   StrCpy $INSTDIR "$changed_dir"
721   goto initDone
722 unmodified:
723   !insertmacro MULTIUSER_INIT
724 !endif
725 initDone:
726   # Enable this to force a language selection dialog on every run (the
727   # preferred language is the default).  Otherwise, the preferred
728   # language is stored in the registry, and the installer does not ask
729   # on upgrades.
730 !ifdef DEBUG
731 !define MUI_LANGDLL_ALWAYSSHOW
732 !endif
733   !insertmacro MUI_LANGDLL_DISPLAY
734
735 ${IfNot} ${AtLeastWin7}
736     MessageBox MB_OK "$(T_WinisDeprecated)"
737 ${Endif}
738
739   ${MementoSectionRestore}
740   Call CalcDefaults
741   Call CalcDepends
742 !ifndef SOURCES
743   Call CheckOtherGnuPGApps
744 !endif
745 FunctionEnd
746
747
748 Function un.onInit
749 !ifndef SOURCES
750   !insertmacro MULTIUSER_UNINIT
751 !endif
752   # Remove the language preference.
753   !insertmacro MUI_UNGETLANGUAGE
754 !ifndef SOURCES
755   StrCpy $is_update "0"
756   ${un.GetParameters} $R0
757   ClearErrors
758   ${un.GetOptions} $R0 /UPDATE= $R1
759   IfErrors +2
760   StrCpy $is_update "1"
761 !endif
762 FunctionEnd
763
764 # This must be in a central place.  Urgs.
765
766 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
767 !ifdef HAVE_PKG_GNUPG_W32
768   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_gnupg_w32} $(DESC_SEC_gnupg_w32)
769 !endif
770 !ifdef HAVE_PKG_GPGOL
771   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_gpgol} $(DESC_SEC_gpgol)
772 !endif
773 !ifdef HAVE_PKG_GPGEX
774   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_gpgex} $(DESC_SEC_gpgex)
775 !endif
776 !ifdef HAVE_PKG_PAPERKEY
777   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_paperkey} $(DESC_SEC_paperkey)
778 !endif
779 !ifdef HAVE_PKG_GPA
780   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_gpa} $(DESC_SEC_gpa)
781 !endif
782 !ifdef HAVE_PKG_KLEOPATRA
783   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_kleopatra} $(DESC_SEC_kleopatra)
784 !endif
785 !ifdef HAVE_PKG_MAN_NOVICE_EN
786   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_man_novice_en} $(DESC_SEC_man_novice_en)
787 !endif
788 !ifdef HAVE_PKG_MAN_ADVANCED_EN
789   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_man_advanced_en} $(DESC_SEC_man_advanced_en)
790 !endif
791 !ifdef HAVE_PKG_COMPENDIUM
792   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_compendium} $(DESC_SEC_compendium)
793 !endif
794 !ifdef HAVE_PKG_MAN_NOVICE_DE
795   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_man_novice_de} $(DESC_SEC_man_novice_de)
796 !endif
797 !ifdef HAVE_PKG_MAN_ADVANCED_DE
798   !insertmacro MUI_DESCRIPTION_TEXT ${SEC_man_advanced_de} $(DESC_SEC_man_advanced_de)
799 !endif
800
801 !insertmacro MUI_DESCRIPTION_TEXT ${SEC_gpgme_browser} $(DESC_SEC_gpgme_browser)
802 !insertmacro MUI_FUNCTION_DESCRIPTION_END
803