Bug 470455 - test_database_sync_embed_visits.js leaks, r=sdwilsh
[wine-gecko.git] / toolkit / mozapps / installer / windows / nsis / common.nsh
blobdd44451f7ae670148066fd9420f092ac61fe12c5
1 # ***** BEGIN LICENSE BLOCK *****
2 # Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 # The contents of this file are subject to the Mozilla Public License Version
5 # 1.1 (the "License"); you may not use this file except in compliance with
6 # the License. You may obtain a copy of the License at
7 # http://www.mozilla.org/MPL/
9 # Software distributed under the License is distributed on an "AS IS" basis,
10 # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 # for the specific language governing rights and limitations under the
12 # License.
14 # The Original Code is the Mozilla Installer code.
16 # The Initial Developer of the Original Code is Mozilla Foundation
17 # Portions created by the Initial Developer are Copyright (C) 2006
18 # the Initial Developer. All Rights Reserved.
20 # Contributor(s):
21 #  Robert Strong <robert.bugzilla@gmail.com>
23 # Alternatively, the contents of this file may be used under the terms of
24 # either the GNU General Public License Version 2 or later (the "GPL"), or
25 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 # in which case the provisions of the GPL or the LGPL are applicable instead
27 # of those above. If you wish to allow use of your version of this file only
28 # under the terms of either the GPL or the LGPL, and not to allow others to
29 # use your version of this file under the terms of the MPL, indicate your
30 # decision by deleting the provisions above and replace them with the notice
31 # and other provisions required by the GPL or the LGPL. If you do not delete
32 # the provisions above, a recipient may use your version of this file under
33 # the terms of any one of the MPL, the GPL or the LGPL.
35 # ***** END LICENSE BLOCK *****
37 ################################################################################
38 # Helper defines and macros for toolkit applications
40 /**
41  * Avoid creating macros / functions that overwrite registers (see the
42  * GetLongPath macro for one way to avoid this)!
43  *
44  * Before using the registers exchange the passed in params and save existing
45  * register values to the stack.
46  *
47  * Exch $R9 ; exhange the original $R9 with the top of the stack
48  * Exch 1   ; exchange the top of the stack with 1 below the top of the stack
49  * Exch $R8 ; exchange the original $R8 with the top of the stack
50  * Exch 2   ; exchange the top of the stack with 2 below the top of the stack
51  * Exch $R7 ; exchange the original $R7 with the top of the stack
52  * Push $R6 ; push the original $R6 onto the top of the stack
53  * Push $R5 ; push the original $R5 onto the top of the stack
54  * Push $R4 ; push the original $R4 onto the top of the stack
55  *
56  * <do stuff>
57  *
58  * ; Restore the values.
59  * Pop $R4  ; restore the value for $R4 from the top of the stack
60  * Pop $R5  ; restore the value for $R5 from the top of the stack
61  * Pop $R6  ; restore the value for $R6 from the top of the stack
62  * Exch $R7 ; exchange the new $R7 value with the top of the stack
63  * Exch 2   ; exchange the top of the stack with 2 below the top of the stack
64  * Exch $R8 ; exchange the new $R8 value with the top of the stack
65  * Exch 1   ; exchange the top of the stack with 2 below the top of the stack
66  * Exch $R9 ; exchange the new $R9 value with the top of the stack
67  *
68  *
69  * When inserting macros in common.nsh from another macro in common.nsh that
70  * can be used from the uninstaller _MOZFUNC_UN will be undefined when it is
71  * inserted. Use the following to redefine _MOZFUNC_UN with its original value
72  * (see the RegCleanMain macro for an example).
73  *
74  * !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
75  * !insertmacro ${_MOZFUNC_UN_TMP}FileJoin
76  * !insertmacro ${_MOZFUNC_UN_TMP}LineFind
77  * !insertmacro ${_MOZFUNC_UN_TMP}TextCompareNoDetails
78  * !insertmacro ${_MOZFUNC_UN_TMP}TrimNewLines
79  * !undef _MOZFUNC_UN
80  * !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
81  * !undef _MOZFUNC_UN_TMP
82  */
84 ; When including a file provided by NSIS check if its verbose macro is defined
85 ; to prevent loading the file a second time.
86 !ifmacrondef TEXTFUNC_VERBOSE
87   !include TextFunc.nsh
88 !endif
90 !ifmacrondef FILEFUNC_VERBOSE
91   !include FileFunc.nsh
92 !endif
94 !ifmacrondef LOGICLIB_VERBOSITY
95   !include LogicLib.nsh
96 !endif
98 !ifndef WINMESSAGES_INCLUDED
99   !include WinMessages.nsh
100 !endif
102 !ifndef MUI_VERBOSE
103   !include MUI.nsh
104 !endif
106 ; When including WinVer.nsh check if ___WINVER__NSH___ is defined to prevent
107 ; loading the file a second time. NSIS versions prior to 2.21 didn't include
108 ; WinVer.nsh so include it with the /NOFATAL option.
109 !ifndef ___WINVER__NSH___
110   !include /NONFATAL WinVer.nsh
111 !endif
113 ; NSIS provided macros that we have overridden.
114 !include overrides.nsh
116 ################################################################################
117 # Macros for debugging
120  * The following two macros assist with verifying that a macro doesn't
121  * overwrite any registers.
123  * Usage:
124  * ${debugSetRegisters}
125  * <do stuff>
126  * ${debugDisplayRegisters}
127  */
130  * Sets all register values to their name to assist with verifying that a macro
131  * doesn't overwrite any registers.
132  */
133 !macro debugSetRegisters
134   StrCpy $0 "$$0"
135   StrCpy $1 "$$1"
136   StrCpy $2 "$$2"
137   StrCpy $3 "$$3"
138   StrCpy $4 "$$4"
139   StrCpy $5 "$$5"
140   StrCpy $6 "$$6"
141   StrCpy $7 "$$7"
142   StrCpy $8 "$$8"
143   StrCpy $9 "$$9"
144   StrCpy $R0 "$$R0"
145   StrCpy $R1 "$$R1"
146   StrCpy $R2 "$$R2"
147   StrCpy $R3 "$$R3"
148   StrCpy $R4 "$$R4"
149   StrCpy $R5 "$$R5"
150   StrCpy $R6 "$$R6"
151   StrCpy $R7 "$$R7"
152   StrCpy $R8 "$$R8"
153   StrCpy $R9 "$$R9"
154 !macroend
155 !define debugSetRegisters "!insertmacro debugSetRegisters"
158  * Displays all register values to assist with verifying that a macro doesn't
159  * overwrite any registers.
160  */
161 !macro debugDisplayRegisters
162   MessageBox MB_OK \
163       "Register Values:$\n\
164        $$0 = $0$\n$$1 = $1$\n$$2 = $2$\n$$3 = $3$\n$$4 = $4$\n\
165        $$5 = $5$\n$$6 = $6$\n$$7 = $7$\n$$8 = $8$\n$$9 = $9$\n\
166        $$R0 = $R0$\n$$R1 = $R1$\n$$R2 = $R2$\n$$R3 = $R3$\n$$R4 = $R4$\n\
167        $$R5 = $R5$\n$$R6 = $R6$\n$$R7 = $R7$\n$$R8 = $R8$\n$$R9 = $R9"
168 !macroend
169 !define debugDisplayRegisters "!insertmacro debugDisplayRegisters"
172 ################################################################################
173 # Modern User Interface (MUI) override macros
175 ; Modified version of the following MUI macros to support Mozilla localization.
176 ; MUI_LANGUAGE
177 ; MUI_LANGUAGEFILE_BEGIN
178 ; MOZ_MUI_LANGUAGEFILE_END
179 ; See <NSIS App Dir>/Contrib/Modern UI/System.nsh for more information
180 !define MUI_INSTALLOPTIONS_READ "!insertmacro MUI_INSTALLOPTIONS_READ"
182 !macro MOZ_MUI_LANGUAGE LANGUAGE
183   !verbose push
184   !verbose ${MUI_VERBOSE}
185   !include "${LANGUAGE}.nsh"
186   !verbose pop
187 !macroend
189 !macro MOZ_MUI_LANGUAGEFILE_BEGIN LANGUAGE
190   !ifndef MUI_INSERT
191     !define MUI_INSERT
192     !insertmacro MUI_INSERT
193   !endif
194   !ifndef "MUI_LANGUAGEFILE_${LANGUAGE}_USED"
195     !define "MUI_LANGUAGEFILE_${LANGUAGE}_USED"
196     LoadLanguageFile "${LANGUAGE}.nlf"
197   !else
198     !error "Modern UI language file ${LANGUAGE} included twice!"
199   !endif
200 !macroend
202 ; Custom version of MUI_LANGUAGEFILE_END. The macro to add the default MUI
203 ; strings and the macros for several strings that are part of the NSIS MUI and
204 ; not in our locale files have been commented out.
205 !macro MOZ_MUI_LANGUAGEFILE_END
207 #  !include "${NSISDIR}\Contrib\Modern UI\Language files\Default.nsh"
208   !ifdef MUI_LANGUAGEFILE_DEFAULT_USED
209     !undef MUI_LANGUAGEFILE_DEFAULT_USED
210     !warning "${LANGUAGE} Modern UI language file version doesn't match. Using default English texts for missing strings."
211   !endif
213   !insertmacro MUI_LANGUAGEFILE_DEFINE "MUI_${LANGUAGE}_LANGNAME" "MUI_LANGNAME"
215   !ifndef MUI_LANGDLL_PUSHLIST
216     !define MUI_LANGDLL_PUSHLIST "'${MUI_${LANGUAGE}_LANGNAME}' ${LANG_${LANGUAGE}} "
217   !else
218     !ifdef MUI_LANGDLL_PUSHLIST_TEMP
219       !undef MUI_LANGDLL_PUSHLIST_TEMP
220     !endif
221     !define MUI_LANGDLL_PUSHLIST_TEMP "${MUI_LANGDLL_PUSHLIST}"
222     !undef MUI_LANGDLL_PUSHLIST
223     !define MUI_LANGDLL_PUSHLIST "'${MUI_${LANGUAGE}_LANGNAME}' ${LANG_${LANGUAGE}} ${MUI_LANGDLL_PUSHLIST_TEMP}"
224   !endif
226   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE WELCOME "MUI_TEXT_WELCOME_INFO_TITLE"
227   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE WELCOME "MUI_TEXT_WELCOME_INFO_TEXT"
229 !ifdef MUI_TEXT_LICENSE_TITLE
230   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE LICENSE "MUI_TEXT_LICENSE_TITLE"
231 !endif
232 !ifdef MUI_TEXT_LICENSE_SUBTITLE
233   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE LICENSE "MUI_TEXT_LICENSE_SUBTITLE"
234 !endif
235 !ifdef MUI_INNERTEXT_LICENSE_TOP
236   !insertmacro MUI_LANGUAGEFILE_MULTILANGSTRING_PAGE LICENSE "MUI_INNERTEXT_LICENSE_TOP"
237 !endif
239 #  !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE LICENSE "MUI_INNERTEXT_LICENSE_BOTTOM"
241 !ifdef MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX
242   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE LICENSE "MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX"
243 !endif
245 !ifdef MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS
246   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE LICENSE "MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS"
247 !endif
249   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE COMPONENTS "MUI_TEXT_COMPONENTS_TITLE"
250   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE COMPONENTS "MUI_TEXT_COMPONENTS_SUBTITLE"
251   !insertmacro MUI_LANGUAGEFILE_MULTILANGSTRING_PAGE COMPONENTS "MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE"
252   !insertmacro MUI_LANGUAGEFILE_MULTILANGSTRING_PAGE COMPONENTS "MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO"
254   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE DIRECTORY "MUI_TEXT_DIRECTORY_TITLE"
255   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE DIRECTORY "MUI_TEXT_DIRECTORY_SUBTITLE"
257   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE STARTMENU "MUI_TEXT_STARTMENU_TITLE"
258   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE STARTMENU "MUI_TEXT_STARTMENU_SUBTITLE"
259   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE STARTMENU "MUI_INNERTEXT_STARTMENU_TOP"
260 #  !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE STARTMENU "MUI_INNERTEXT_STARTMENU_CHECKBOX"
262   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE INSTFILES "MUI_TEXT_INSTALLING_TITLE"
263   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE INSTFILES "MUI_TEXT_INSTALLING_SUBTITLE"
265   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE INSTFILES "MUI_TEXT_FINISH_TITLE"
266   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE INSTFILES "MUI_TEXT_FINISH_SUBTITLE"
268   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE INSTFILES "MUI_TEXT_ABORT_TITLE"
269   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE INSTFILES "MUI_TEXT_ABORT_SUBTITLE"
271   !insertmacro MUI_LANGUAGEFILE_MULTILANGSTRING_PAGE FINISH "MUI_BUTTONTEXT_FINISH"
272   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE FINISH "MUI_TEXT_FINISH_INFO_TITLE"
273   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE FINISH "MUI_TEXT_FINISH_INFO_TEXT"
274   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_PAGE FINISH "MUI_TEXT_FINISH_INFO_REBOOT"
275   !insertmacro MUI_LANGUAGEFILE_MULTILANGSTRING_PAGE FINISH "MUI_TEXT_FINISH_REBOOTNOW"
276   !insertmacro MUI_LANGUAGEFILE_MULTILANGSTRING_PAGE FINISH "MUI_TEXT_FINISH_REBOOTLATER"
277 #  !insertmacro MUI_LANGUAGEFILE_MULTILANGSTRING_PAGE FINISH "MUI_TEXT_FINISH_RUN"
278 #  !insertmacro MUI_LANGUAGEFILE_MULTILANGSTRING_PAGE FINISH "MUI_TEXT_FINISH_SHOWREADME"
280   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_DEFINE MUI_ABORTWARNING "MUI_TEXT_ABORTWARNING"
283   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE WELCOME "MUI_UNTEXT_WELCOME_INFO_TITLE"
284   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE WELCOME "MUI_UNTEXT_WELCOME_INFO_TEXT"
286   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE CONFIRM "MUI_UNTEXT_CONFIRM_TITLE"
287   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE CONFIRM "MUI_UNTEXT_CONFIRM_SUBTITLE"
289 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE LICENSE "MUI_UNTEXT_LICENSE_TITLE"
290 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE LICENSE "MUI_UNTEXT_LICENSE_SUBTITLE"
292 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE LICENSE "MUI_UNINNERTEXT_LICENSE_BOTTOM"
293 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE LICENSE "MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX"
294 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE LICENSE "MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS"
296 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE COMPONENTS "MUI_UNTEXT_COMPONENTS_TITLE"
297 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE COMPONENTS "MUI_UNTEXT_COMPONENTS_SUBTITLE"
299 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE DIRECTORY "MUI_UNTEXT_DIRECTORY_TITLE"
300 #  !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE DIRECTORY  "MUI_UNTEXT_DIRECTORY_SUBTITLE"
302   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE INSTFILES "MUI_UNTEXT_UNINSTALLING_TITLE"
303   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE INSTFILES "MUI_UNTEXT_UNINSTALLING_SUBTITLE"
305   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE INSTFILES "MUI_UNTEXT_FINISH_TITLE"
306   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE INSTFILES "MUI_UNTEXT_FINISH_SUBTITLE"
308   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE INSTFILES "MUI_UNTEXT_ABORT_TITLE"
309   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE INSTFILES "MUI_UNTEXT_ABORT_SUBTITLE"
311   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE FINISH "MUI_UNTEXT_FINISH_INFO_TITLE"
312   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE FINISH "MUI_UNTEXT_FINISH_INFO_TEXT"
313   !insertmacro MUI_LANGUAGEFILE_UNLANGSTRING_PAGE FINISH "MUI_UNTEXT_FINISH_INFO_REBOOT"
315   !insertmacro MUI_LANGUAGEFILE_LANGSTRING_DEFINE MUI_UNABORTWARNING "MUI_UNTEXT_ABORTWARNING"
317 !macroend
320 ################################################################################
321 # Macros for creating Install Options ini files
323 # DEPRECATED - all ini creation code should be added to the application's
324 # installer and uninstaller files.
326 !macro createComponentsINI
327   WriteINIStr "$PLUGINSDIR\components.ini" "Settings" NumFields "5"
329   WriteINIStr "$PLUGINSDIR\components.ini" "Field 1" Type   "label"
330   WriteINIStr "$PLUGINSDIR\components.ini" "Field 1" Text   "$(OPTIONAL_COMPONENTS_LABEL)"
331   WriteINIStr "$PLUGINSDIR\components.ini" "Field 1" Left   "0"
332   WriteINIStr "$PLUGINSDIR\components.ini" "Field 1" Right  "-1"
333   WriteINIStr "$PLUGINSDIR\components.ini" "Field 1" Top    "5"
334   WriteINIStr "$PLUGINSDIR\components.ini" "Field 1" Bottom "15"
336   ${If} ${FileExists} "$EXEDIR\optional\extensions\inspector@mozilla.org"
337     WriteINIStr "$PLUGINSDIR\components.ini" "Field 2" Type   "checkbox"
338     WriteINIStr "$PLUGINSDIR\components.ini" "Field 2" Text   "$(DOMI_TITLE)"
339     WriteINIStr "$PLUGINSDIR\components.ini" "Field 2" Left   "15"
340     WriteINIStr "$PLUGINSDIR\components.ini" "Field 2" Right  "-1"
341     WriteINIStr "$PLUGINSDIR\components.ini" "Field 2" Top    "20"
342     WriteINIStr "$PLUGINSDIR\components.ini" "Field 2" Bottom "30"
343     WriteINIStr "$PLUGINSDIR\components.ini" "Field 2" State  "1"
344     WriteINIStr "$PLUGINSDIR\components.ini" "Field 2" Flags  "GROUP"
345   ${EndIf}
347   ${If} ${FileExists} "$EXEDIR\optional\extensions\inspector@mozilla.org"
348     WriteINIStr "$PLUGINSDIR\components.ini" "Field 3" Type   "label"
349     WriteINIStr "$PLUGINSDIR\components.ini" "Field 3" Text   "$(DOMI_TEXT)"
350     WriteINIStr "$PLUGINSDIR\components.ini" "Field 3" Left   "30"
351     WriteINIStr "$PLUGINSDIR\components.ini" "Field 3" Right  "-1"
352     WriteINIStr "$PLUGINSDIR\components.ini" "Field 3" Top    "32"
353     WriteINIStr "$PLUGINSDIR\components.ini" "Field 3" Bottom "52"
354   ${EndIf}
355 !macroend
357 !macro createShortcutsINI
358   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Settings" NumFields "4"
360   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Type   "label"
361   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Text   "$(CREATE_ICONS_DESC)"
362   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Left   "0"
363   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Right  "-1"
364   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Top    "5"
365   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 1" Bottom "15"
367   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Type   "checkbox"
368   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Text   "$(ICONS_DESKTOP)"
369   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Left   "15"
370   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Right  "-1"
371   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Top    "20"
372   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Bottom "30"
373   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" State  "1"
374   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 2" Flags  "GROUP"
376   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Type   "checkbox"
377   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Text   "$(ICONS_STARTMENU)"
378   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Left   "15"
379   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Right  "-1"
380   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Top    "40"
381   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" Bottom "50"
382   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 3" State  "1"
384   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Type   "checkbox"
385   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Text   "$(ICONS_QUICKLAUNCH)"
386   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Left   "15"
387   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Right  "-1"
388   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Top    "60"
389   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" Bottom "70"
390   WriteINIStr "$PLUGINSDIR\shortcuts.ini" "Field 4" State  "1"
391 !macroend
393 !macro createBasicCustomOptionsINI
394   WriteINIStr "$PLUGINSDIR\options.ini" "Settings" NumFields "5"
396   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Type   "label"
397   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Text   "$(OPTIONS_SUMMARY)"
398   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Left   "0"
399   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Right  "-1"
400   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Top    "0"
401   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Bottom "10"
403   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Type   "RadioButton"
404   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Text   "$(OPTION_STANDARD_RADIO)"
405   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Left   "15"
406   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Right  "-1"
407   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Top    "25"
408   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Bottom "35"
409   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" State  "1"
410   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Flags  "GROUP"
412   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Type   "RadioButton"
413   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Text   "$(OPTION_CUSTOM_RADIO)"
414   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Left   "15"
415   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Right  "-1"
416   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Top    "55"
417   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Bottom "65"
418   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" State  "0"
420   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Type   "label"
421   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Text   "$(OPTION_STANDARD_DESC)"
422   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Left   "30"
423   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Right  "-1"
424   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Top    "37"
425   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Bottom "57"
427   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Type   "label"
428   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Text   "$(OPTION_CUSTOM_DESC)"
429   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Left   "30"
430   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Right  "-1"
431   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Top    "67"
432   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Bottom "87"
433 !macroend
435 !macro createBasicCompleteCustomOptionsINI
436   WriteINIStr "$PLUGINSDIR\options.ini" "Settings" NumFields "7"
438   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Type   "label"
439   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Text   "$(OPTIONS_DESC)"
440   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Left   "0"
441   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Right  "-1"
442   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Top    "0"
443   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Bottom "10"
445   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Type   "RadioButton"
446   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Text   "$(OPTION_STANDARD_RADIO)"
447   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Left   "15"
448   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Right  "-1"
449   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Top    "25"
450   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Bottom "35"
451   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" State  "1"
452   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Flags  "GROUP"
454   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Type   "RadioButton"
455   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Text   "$(OPTION_COMPLETE_RADIO)"
456   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Left   "15"
457   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Right  "-1"
458   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Top    "55"
459   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Bottom "65"
460   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" State  "0"
462   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Type   "RadioButton"
463   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Text   "$(OPTION_CUSTOM_RADIO)"
464   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Left   "15"
465   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Right  "-1"
466   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Top    "85"
467   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Bottom "95"
468   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" State  "0"
470   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Type   "label"
471   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Text   "$(OPTION_STANDARD_DESC)"
472   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Left   "30"
473   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Right  "-1"
474   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Top    "37"
475   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Bottom "57"
477   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Type   "label"
478   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Text   "$(OPTION_COMPLETE_DESC)"
479   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Left   "30"
480   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Right  "-1"
481   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Top    "67"
482   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Bottom "87"
484   WriteINIStr "$PLUGINSDIR\options.ini" "Field 7" Type   "label"
485   WriteINIStr "$PLUGINSDIR\options.ini" "Field 7" Text   "$(OPTION_CUSTOM_DESC)"
486   WriteINIStr "$PLUGINSDIR\options.ini" "Field 7" Left   "30"
487   WriteINIStr "$PLUGINSDIR\options.ini" "Field 7" Right  "-1"
488   WriteINIStr "$PLUGINSDIR\options.ini" "Field 7" Top    "97"
489   WriteINIStr "$PLUGINSDIR\options.ini" "Field 7" Bottom "117"
490 !macroend
492 !macro createBasicCustomSetAsDefaultOptionsINI
493   WriteINIStr "$PLUGINSDIR\options.ini" "Settings" NumFields "6"
495   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Type   "label"
496   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Text   "$(OPTIONS_SUMMARY)"
497   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Left   "0"
498   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Right  "-1"
499   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Top    "0"
500   WriteINIStr "$PLUGINSDIR\options.ini" "Field 1" Bottom "10"
502   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Type   "RadioButton"
503   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Text   "$(OPTION_STANDARD_RADIO)"
504   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Left   "15"
505   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Right  "-1"
506   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Top    "25"
507   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Bottom "35"
508   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" State  "1"
509   WriteINIStr "$PLUGINSDIR\options.ini" "Field 2" Flags  "GROUP"
511   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Type   "RadioButton"
512   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Text   "$(OPTION_CUSTOM_RADIO)"
513   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Left   "15"
514   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Right  "-1"
515   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Top    "55"
516   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" Bottom "65"
517   WriteINIStr "$PLUGINSDIR\options.ini" "Field 3" State  "0"
519   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Type   "label"
520   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Text   "$(OPTION_STANDARD_DESC)"
521   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Left   "30"
522   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Right  "-1"
523   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Top    "37"
524   WriteINIStr "$PLUGINSDIR\options.ini" "Field 4" Bottom "57"
526   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Type   "label"
527   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Text   "$(OPTION_CUSTOM_DESC)"
528   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Left   "30"
529   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Right  "-1"
530   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Top    "67"
531   WriteINIStr "$PLUGINSDIR\options.ini" "Field 5" Bottom "87"
533   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Type   "checkbox"
534   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Text   "$(OPTIONS_MAKE_DEFAULT)"
535   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Left   "0"
536   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Right  "-1"
537   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Top    "124"
538   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" Bottom "145"
539   WriteINIStr "$PLUGINSDIR\options.ini" "Field 6" State  "1"
540 !macroend
542 !macro createSummaryINI
543   WriteINIStr "$PLUGINSDIR\summary.ini" "Settings" NumFields "3"
545   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Type   "label"
546   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Text   "$(SUMMARY_INSTALLED_TO)"
547   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Left   "0"
548   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Right  "-1"
549   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Top    "5"
550   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 1" Bottom "15"
552   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Type   "text"
553   ; The contents of this control must be set as follows in the pre function
554   ; ${MUI_INSTALLOPTIONS_READ} $1 "summary.ini" "Field 2" "HWND"
555   ; SendMessage $1 ${WM_SETTEXT} 0 "STR:$INSTDIR"
556   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" state  ""
557   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Left   "0"
558   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Right  "-1"
559   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Top    "17"
560   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" Bottom "30"
561   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 2" flags  "READONLY"
563   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Type   "label"
564   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Text   "$(SUMMARY_CLICK)"
565   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Left   "0"
566   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Right  "-1"
567   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Top    "130"
568   WriteINIStr "$PLUGINSDIR\summary.ini" "Field 3" Bottom "150"
570   ${If} "$TmpVal" == "true"
571     WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Type   "label"
572     WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Text   "$(SUMMARY_REBOOT_REQUIRED_INSTALL)"
573     WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Left   "0"
574     WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Right  "-1"
575     WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Top    "35"
576     WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Bottom "45"
578     WriteINIStr "$PLUGINSDIR\summary.ini" "Settings" NumFields "4"
579   ${EndIf}
581   ReadINIStr $0 "$PLUGINSDIR\options.ini" "Field 6" "State"
582   ${If} "$0" == "1"
583     ${If} "$TmpVal" == "true"
584       ; To insert this control reset Top / Bottom for controls below this one
585       WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Top    "50"
586       WriteINIStr "$PLUGINSDIR\summary.ini" "Field 4" Bottom "60"
587       StrCpy $0 "5"
588     ${Else}
589       StrCpy $0 "4"
590     ${EndIf}
592     WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Type   "label"
593     WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Text   "$(SUMMARY_MAKE_DEFAULT)"
594     WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Left   "0"
595     WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Right  "-1"
596     WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Top    "35"
597     WriteINIStr "$PLUGINSDIR\summary.ini" "Field $0" Bottom "45"
599     WriteINIStr "$PLUGINSDIR\summary.ini" "Settings" NumFields "$0"
600   ${EndIf}
601 !macroend
603 !macro un.createUnConfirmINI
604   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Settings" NumFields "5"
606   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Type   "label"
607   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Text   "$(UN_CONFIRM_UNINSTALLED_FROM)"
608   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Left   "0"
609   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Right  "-1"
610   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Top    "5"
611   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 1" Bottom "15"
613   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Type   "text"
614   ; The contents of this control must be set as follows in the pre function
615   ; ${MUI_INSTALLOPTIONS_READ} $1 "unconfirm.ini" "Field 2" "HWND"
616   ; SendMessage $1 ${WM_SETTEXT} 0 "STR:$INSTDIR"
617   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" State  ""
618   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Left   "0"
619   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Right  "-1"
620   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Top    "17"
621   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" Bottom "30"
622   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 2" flags  "READONLY"
624   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Type   "checkbox"
625   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Text   "$(UN_REMOVE_PROFILES)"
626   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Left   "0"
627   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Right  "-1"
628   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Top    "40"
629   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Bottom "50"
630   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" State  "0"
631   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" flags  "NOTIFY"
633   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Type   "text"
634   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" State   "$(UN_REMOVE_PROFILES_DESC)"
635   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Left   "0"
636   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Right  "-1"
637   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Top    "52"
638   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Bottom "120"
639   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" flags  "MULTILINE|READONLY"
641   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Type   "label"
642   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Text   "$(UN_CONFIRM_CLICK)"
643   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Left   "0"
644   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Right  "-1"
645   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Top    "130"
646   WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 5" Bottom "150"
648   ${If} "$TmpVal" == "true"
649     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Type   "label"
650     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Text   "$(SUMMARY_REBOOT_REQUIRED_UNINSTALL)"
651     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Left   "0"
652     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Right  "-1"
653     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Top    "35"
654     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 6" Bottom "45"
656     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Settings" NumFields "6"
658     ; To insert this control reset Top / Bottom for controls below this one
659     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Top    "55"
660     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 3" Bottom "65"
661     WriteINIStr "$PLUGINSDIR\unconfirm.ini" "Field 4" Top    "67"
662   ${EndIf}
663 !macroend
666  * DEPRECATED - use GetParent instead.
667  */
668 !macro GetParentDir
669   Exch $R0
670   Push $R1
671   Push $R2
672   Push $R3
673   StrLen $R3 $R0
674   ${DoWhile} 1 > 0
675     IntOp $R1 $R1 - 1
676     ${If} $R1 <= -$R3
677       ${Break}
678     ${EndIf}
679     StrCpy $R2 $R0 1 $R1
680     ${If} $R2 == "\"
681       ${Break}
682     ${EndIf}
683   ${Loop}
685   StrCpy $R0 $R0 $R1
686   Pop $R3
687   Pop $R2
688   Pop $R1
689   Exch $R0
690 !macroend
691 !define GetParentDir "!insertmacro GetParentDir"
694  * DEPRECATED - use GetPathFromString and RemoveQuotesFromPath
696  * Removes quotes and trailing path separator from registry string paths.
697  * @param   $R0
698  *          Contains the registry string
699  * @return  Modified string at the top of the stack.
700  */
701 !macro GetPathFromRegStr
702   Exch $R0
703   Push $R8
704   Push $R9
706   StrCpy $R9 "$R0" "" -1
707   StrCmp $R9 '"' +2 0
708   StrCmp $R9 "'" 0 +2
709   StrCpy $R0 "$R0" -1
711   StrCpy $R9 "$R0" 1
712   StrCmp $R9 '"' +2 0
713   StrCmp $R9 "'" 0 +2
714   StrCpy $R0 "$R0" "" 1
716   StrCpy $R9 "$R0" "" -1
717   StrCmp $R9 "\" 0 +2
718   StrCpy $R0 "$R0" -1
720   ClearErrors
721   GetFullPathName $R8 $R0
722   IfErrors +2 0
723   StrCpy $R0 $R8
725   ClearErrors
726   Pop $R9
727   Pop $R8
728   Exch $R0
729 !macroend
730 !define GetPathFromRegStr "!insertmacro GetPathFromRegStr"
733 ################################################################################
734 # Macros for handling files in use
737  * Checks for files in use in the $INSTDIR directory. To check files in
738  * sub-directories this macro would need to be rewritten to create
739  * sub-directories in the temporary directory used to backup the files that are
740  * checked.
742  * Example usage:
744  *  ; The first string to be pushed onto the stack MUST be "end" to indicate
745  *  ; that there are no more files in the $INSTDIR directory to check.
746  *  Push "end"
747  *  Push "freebl3.dll"
748  *  ; The last file pushed should be the app's main exe so if it is in use this
749  *  ; macro will return after the first check.
750  *  Push "${FileMainEXE}"
751  *  ${CheckForFilesInUse} $R9
753  * !IMPORTANT - this macro uses the $R7, $R8, and $R9 registers and makes no
754  *              attempt to restore their original values.
756  * @return  _RESULT
757  *          false if all of the files popped from the stack are not in use.
758  *          True if any of the files popped from the stack are in use.
759  * $R7 = Temporary backup directory where the files will be copied to.
760  * $R8 = value popped from the stack. This will either be a file name for a file
761  *       in the $INSTDIR directory or "end" to indicate that there are no
762  *       additional files to check.
763  * $R9 = _RESULT
764  */
765 !macro CheckForFilesInUse
767   !ifndef ${_MOZFUNC_UN}CheckForFilesInUse
768     !verbose push
769     !verbose ${_MOZFUNC_VERBOSE}
770     !define ${_MOZFUNC_UN}CheckForFilesInUse "!insertmacro ${_MOZFUNC_UN}CheckForFilesInUseCall"
772     Function ${_MOZFUNC_UN}CheckForFilesInUse
773       ; Create a temporary backup directory.
774       GetTempFileName $R7 "$INSTDIR"
775       Delete "$R7"
776       SetOutPath "$R7"
777       StrCpy $R9 "false"
779       start:
780       Pop $R8
781       StrCmp "$R8" "end" end +1
782       IfFileExists "$INSTDIR\$R8" +1 start
784       ClearErrors
785       CopyFiles /SILENT "$INSTDIR\$R8" "$R7\$R8"
786       IfErrors +4 +1
787       Delete "$INSTDIR\$R8"
788       IfErrors +1 start
789       Delete "$R7\$R8"
791       StrCpy $R9 "true"
793       end:
794       SetOutPath "$INSTDIR"
795       CopyFiles /SILENT "$R7\*" "$INSTDIR\"
796       RmDir /r "$R7"
797       SetOutPath "$EXEDIR"
798       ClearErrors
800       Push $R9
801     FunctionEnd
803     !verbose pop
804   !endif
805 !macroend
807 !macro CheckForFilesInUseCall _RESULT
808   !verbose push
809   !verbose ${_MOZFUNC_VERBOSE}
810   Call CheckForFilesInUse
811   Pop ${_RESULT}
812   !verbose pop
813 !macroend
815 !macro un.CheckForFilesInUseCall _RESULT
816   !verbose push
817   !verbose ${_MOZFUNC_VERBOSE}
818   Call un.CheckForFilesInUse
819   Pop ${_RESULT}
820   !verbose pop
821 !macroend
823 !macro un.CheckForFilesInUse
824   !ifndef un.CheckForFilesInUse
825     !verbose push
826     !verbose ${_MOZFUNC_VERBOSE}
827     !undef _MOZFUNC_UN
828     !define _MOZFUNC_UN "un."
830     !insertmacro CheckForFilesInUse
832     !undef _MOZFUNC_UN
833     !define _MOZFUNC_UN
834     !verbose pop
835   !endif
836 !macroend
839  * The macros below will automatically prepend un. to the function names when
840  * they are defined (e.g. !define un.RegCleanMain).
841  */
842 !verbose push
843 !verbose 3
844 !ifndef _MOZFUNC_VERBOSE
845   !define _MOZFUNC_VERBOSE 3
846 !endif
847 !verbose ${_MOZFUNC_VERBOSE}
848 !define MOZFUNC_VERBOSE "!insertmacro MOZFUNC_VERBOSE"
849 !define _MOZFUNC_UN
850 !define _MOZFUNC_S
851 !verbose pop
853 !macro MOZFUNC_VERBOSE _VERBOSE
854   !verbose push
855   !verbose 3
856   !undef _MOZFUNC_VERBOSE
857   !define _MOZFUNC_VERBOSE ${_VERBOSE}
858   !verbose pop
859 !macroend
862  * Displays a MessageBox and then calls abort to prevent continuing to the
863  * next page when the specified Window Class is found.
865  * @param   _WINDOW_CLASS
866  *          The Window Class to search for with FindWindow.
867  * @param   _MSG
868  *          The message text to display in the message box.
870  * $R7 = return value from FindWindow
871  * $R8 = _WINDOW_CLASS
872  * $R9 = _MSG
873  */
874 !macro ManualCloseAppPrompt
876   !ifndef ${_MOZFUNC_UN}ManualCloseAppPrompt
877     !verbose push
878     !verbose ${_MOZFUNC_VERBOSE}
879     !define ${_MOZFUNC_UN}ManualCloseAppPrompt "!insertmacro ${_MOZFUNC_UN}ManualCloseAppPromptCall"
881     Function ${_MOZFUNC_UN}ManualCloseAppPrompt
882       Exch $R9
883       Exch 1
884       Exch $R8
885       Push $R7
887       FindWindow $R7 "$R8"
888       IntCmp $R7 0 +3 +1 +1
889       MessageBox MB_OK|MB_ICONQUESTION "$R9"
890       Abort
892       Pop $R7
893       Exch $R8
894       Exch 1
895       Exch $R9
896     FunctionEnd
898     !verbose pop
899   !endif
900 !macroend
902 !macro ManualCloseAppPromptCall _WINDOW_CLASS _MSG
903   !verbose push
904   !verbose ${_MOZFUNC_VERBOSE}
905   Push "${_WINDOW_CLASS}"
906   Push "${_MSG}"
907   Call ManualCloseAppPrompt
908   !verbose pop
909 !macroend
911 !macro un.ManualCloseAppPromptCall _WINDOW_CLASS _MSG
912   !verbose push
913   !verbose ${_MOZFUNC_VERBOSE}
914   Push "${_WINDOW_CLASS}"
915   Push "${_MSG}"
916   Call un.ManualCloseAppPrompt
917   !verbose pop
918 !macroend
920 !macro un.ManualCloseAppPrompt
921   !ifndef un.ManualCloseAppPrompt
922     !verbose push
923     !verbose ${_MOZFUNC_VERBOSE}
924     !undef _MOZFUNC_UN
925     !define _MOZFUNC_UN "un."
927     !insertmacro ManualCloseAppPrompt
929     !undef _MOZFUNC_UN
930     !define _MOZFUNC_UN
931     !verbose pop
932   !endif
933 !macroend
936  * Posts WM_QUIT to the application's message window which is found using the
937  * message window's class. This macro uses the nsProcess plugin available
938  * from http://nsis.sourceforge.net/NsProcess_plugin
940  * @param   _MSG
941  *          The message text to display in the message box.
942  * @param   _PROMPT
943  *          If false don't prompt the user and automatically exit the
944  *          application if it is running.
946  * $R6 = return value for nsProcess::_FindProcess and nsProcess::_KillProcess
947  * $R7 = return value from FindWindow
948  * $R8 = _PROMPT
949  * $R9 = _MSG
950  */
951 !macro CloseApp
953   !ifndef ${_MOZFUNC_UN}CloseApp
954     !verbose push
955     !verbose ${_MOZFUNC_VERBOSE}
956     !define ${_MOZFUNC_UN}CloseApp "!insertmacro ${_MOZFUNC_UN}CloseAppCall"
958     Function ${_MOZFUNC_UN}CloseApp
959       Exch $R9
960       Exch 1
961       Exch $R8
962       Push $R7
963       Push $R6
965       loop:
966       Push $R6
967       nsProcess::_FindProcess /NOUNLOAD "${FileMainEXE}"
968       Pop $R6
969       StrCmp $R6 0 +1 end
971       StrCmp $R8 "false" +2 +1
972       MessageBox MB_OKCANCEL|MB_ICONQUESTION "$R9" IDCANCEL exit 0
974       FindWindow $R7 "${WindowClass}"
975       IntCmp $R7 0 +4 +1 +1
976       System::Call 'user32::PostMessage(i r17, i ${WM_QUIT}, i 0, i 0)'
977       # The amount of time to wait for the app to shutdown before prompting again
978       Sleep 5000
980       Push $R6
981       nsProcess::_FindProcess /NOUNLOAD "${FileMainEXE}"
982       Pop $R6
983       StrCmp $R6 0 +1 end
984       Push $R6
985       nsProcess::_KillProcess /NOUNLOAD "${FileMainEXE}"
986       Pop $R6
987       Sleep 2000
989       Goto loop
991       exit:
992       nsProcess::_Unload
993       Quit
995       end:
996       nsProcess::_Unload
998       Pop $R6
999       Pop $R7
1000       Exch $R8
1001       Exch 1
1002       Exch $R9
1003     FunctionEnd
1005     !verbose pop
1006   !endif
1007 !macroend
1009 !macro CloseAppCall _MSG _PROMPT
1010   !verbose push
1011   !verbose ${_MOZFUNC_VERBOSE}
1012   Push "${_MSG}"
1013   Push "${_PROMPT}"
1014   Call CloseApp
1015   !verbose pop
1016 !macroend
1018 !macro un.CloseApp
1019   !ifndef un.CloseApp
1020     !verbose push
1021     !verbose ${_MOZFUNC_VERBOSE}
1022     !undef _MOZFUNC_UN
1023     !define _MOZFUNC_UN "un."
1025     !insertmacro CloseApp
1027     !undef _MOZFUNC_UN
1028     !define _MOZFUNC_UN
1029     !verbose pop
1030   !endif
1031 !macroend
1033 !macro un.CloseAppCall _MSG _PROMPT
1034   !verbose push
1035   !verbose ${_MOZFUNC_VERBOSE}
1036   Push "${_MSG}"
1037   Push "${_PROMPT}"
1038   Call un.CloseApp
1039   !verbose pop
1040 !macroend
1043 ################################################################################
1044 # Macros for working with the registry
1047  * Writes a registry string using SHCTX and the supplied params and logs the
1048  * action to the install log and the uninstall log if _LOG_UNINSTALL equals 1.
1050  * Define NO_LOG to prevent all logging when calling this from the uninstaller.
1052  * @param   _ROOT
1053  *          The registry key root as defined by NSIS (e.g. HKLM, HKCU, etc.).
1054  *          This will only be used for logging.
1055  * @param   _KEY
1056  *          The subkey in relation to the key root.
1057  * @param   _NAME
1058  *          The key value name to write to.
1059  * @param   _STR
1060  *          The string to write to the key value name.
1061  * @param   _LOG_UNINSTALL
1062  *          0 = don't add to uninstall log, 1 = add to uninstall log.
1064  * $R5 = _ROOT
1065  * $R6 = _KEY
1066  * $R7 = _NAME
1067  * $R8 = _STR
1068  * $R9 = _LOG_UNINSTALL
1069  */
1070 !macro WriteRegStr2
1072   !ifndef ${_MOZFUNC_UN}WriteRegStr2
1073     !verbose push
1074     !verbose ${_MOZFUNC_VERBOSE}
1075     !define ${_MOZFUNC_UN}WriteRegStr2 "!insertmacro ${_MOZFUNC_UN}WriteRegStr2Call"
1077     Function ${_MOZFUNC_UN}WriteRegStr2
1078       Exch $R9
1079       Exch 1
1080       Exch $R8
1081       Exch 2
1082       Exch $R7
1083       Exch 3
1084       Exch $R6
1085       Exch 4
1086       Exch $R5
1088       ClearErrors
1089       WriteRegStr SHCTX "$R6" "$R7" "$R8"
1091       !ifndef NO_LOG
1092         IfErrors 0 +3
1093         FileWrite $fhInstallLog "  ** ERROR Adding Registry String: $R5 | $R6 | $R7 | $R8 **$\r$\n"
1094         GoTo +4
1095         StrCmp "$R9" "1" +1 +2
1096         FileWrite $fhUninstallLog "RegVal: $R5 | $R6 | $R7$\r$\n"
1097         FileWrite $fhInstallLog "  Added Registry String: $R5 | $R6 | $R7 | $R8$\r$\n"
1098       !endif
1100       Exch $R5
1101       Exch 4
1102       Exch $R6
1103       Exch 3
1104       Exch $R7
1105       Exch 2
1106       Exch $R8
1107       Exch 1
1108       Exch $R9
1109     FunctionEnd
1111     !verbose pop
1112   !endif
1113 !macroend
1115 !macro WriteRegStr2Call _ROOT _KEY _NAME _STR _LOG_UNINSTALL
1116   !verbose push
1117   !verbose ${_MOZFUNC_VERBOSE}
1118   Push "${_ROOT}"
1119   Push "${_KEY}"
1120   Push "${_NAME}"
1121   Push "${_STR}"
1122   Push "${_LOG_UNINSTALL}"
1123   Call WriteRegStr2
1124   !verbose pop
1125 !macroend
1127 !macro un.WriteRegStr2Call _ROOT _KEY _NAME _STR _LOG_UNINSTALL
1128   !verbose push
1129   !verbose ${_MOZFUNC_VERBOSE}
1130   Push "${_ROOT}"
1131   Push "${_KEY}"
1132   Push "${_NAME}"
1133   Push "${_STR}"
1134   Push "${_LOG_UNINSTALL}"
1135   Call un.WriteRegStr2
1136   !verbose pop
1137 !macroend
1139 !macro un.WriteRegStr2
1140   !ifndef un.WriteRegStr2
1141     !verbose push
1142     !verbose ${_MOZFUNC_VERBOSE}
1143     !undef _MOZFUNC_UN
1144     !define _MOZFUNC_UN "un."
1146     !insertmacro WriteRegStr2
1148     !undef _MOZFUNC_UN
1149     !define _MOZFUNC_UN
1150     !verbose pop
1151   !endif
1152 !macroend
1155  * Writes a registry dword using SHCTX and the supplied params and logs the
1156  * action to the install log and the uninstall log if _LOG_UNINSTALL equals 1.
1158  * Define NO_LOG to prevent all logging when calling this from the uninstaller.
1160  * @param   _ROOT
1161  *          The registry key root as defined by NSIS (e.g. HKLM, HKCU, etc.).
1162  *          This will only be used for logging.
1163  * @param   _KEY
1164  *          The subkey in relation to the key root.
1165  * @param   _NAME
1166  *          The key value name to write to.
1167  * @param   _DWORD
1168  *          The dword to write to the key value name.
1169  * @param   _LOG_UNINSTALL
1170  *          0 = don't add to uninstall log, 1 = add to uninstall log.
1172  * $R5 = _ROOT
1173  * $R6 = _KEY
1174  * $R7 = _NAME
1175  * $R8 = _DWORD
1176  * $R9 = _LOG_UNINSTALL
1177  */
1178 !macro WriteRegDWORD2
1180   !ifndef ${_MOZFUNC_UN}WriteRegDWORD2
1181     !verbose push
1182     !verbose ${_MOZFUNC_VERBOSE}
1183     !define ${_MOZFUNC_UN}WriteRegDWORD2 "!insertmacro ${_MOZFUNC_UN}WriteRegDWORD2Call"
1185     Function ${_MOZFUNC_UN}WriteRegDWORD2
1186       Exch $R9
1187       Exch 1
1188       Exch $R8
1189       Exch 2
1190       Exch $R7
1191       Exch 3
1192       Exch $R6
1193       Exch 4
1194       Exch $R5
1196       ClearErrors
1197       WriteRegDWORD SHCTX "$R6" "$R7" "$R8"
1199       !ifndef NO_LOG
1200         IfErrors 0 +3
1201         FileWrite $fhInstallLog "  ** ERROR Adding Registry DWord: $R5 | $R6 | $R7 | $R8 **$\r$\n"
1202         GoTo +4
1203         StrCmp "$R9" "1" +1 +2
1204         FileWrite $fhUninstallLog "RegVal: $R5 | $R6 | $R7$\r$\n"
1205         FileWrite $fhInstallLog "  Added Registry DWord: $R5 | $R6 | $R7 | $R8$\r$\n"
1206       !endif
1208       Exch $R5
1209       Exch 4
1210       Exch $R6
1211       Exch 3
1212       Exch $R7
1213       Exch 2
1214       Exch $R8
1215       Exch 1
1216       Exch $R9
1217     FunctionEnd
1219     !verbose pop
1220   !endif
1221 !macroend
1223 !macro WriteRegDWORD2Call _ROOT _KEY _NAME _DWORD _LOG_UNINSTALL
1224   !verbose push
1225   !verbose ${_MOZFUNC_VERBOSE}
1226   Push "${_ROOT}"
1227   Push "${_KEY}"
1228   Push "${_NAME}"
1229   Push "${_DWORD}"
1230   Push "${_LOG_UNINSTALL}"
1231   Call WriteRegDWORD2
1232   !verbose pop
1233 !macroend
1235 !macro un.WriteRegDWORD2Call _ROOT _KEY _NAME _DWORD _LOG_UNINSTALL
1236   !verbose push
1237   !verbose ${_MOZFUNC_VERBOSE}
1238   Push "${_ROOT}"
1239   Push "${_KEY}"
1240   Push "${_NAME}"
1241   Push "${_DWORD}"
1242   Push "${_LOG_UNINSTALL}"
1243   Call un.WriteRegDWORD2
1244   !verbose pop
1245 !macroend
1247 !macro un.WriteRegDWORD2
1248   !ifndef un.WriteRegDWORD2
1249     !verbose push
1250     !verbose ${_MOZFUNC_VERBOSE}
1251     !undef _MOZFUNC_UN
1252     !define _MOZFUNC_UN "un."
1254     !insertmacro WriteRegDWORD2
1256     !undef _MOZFUNC_UN
1257     !define _MOZFUNC_UN
1258     !verbose pop
1259   !endif
1260 !macroend
1263  * Writes a registry string to HKCR using the supplied params and logs the
1264  * action to the install log and the uninstall log if _LOG_UNINSTALL equals 1.
1266  * Define NO_LOG to prevent all logging when calling this from the uninstaller.
1268  * @param   _ROOT
1269  *          The registry key root as defined by NSIS (e.g. HKLM, HKCU, etc.).
1270  *          This will only be used for logging.
1271  * @param   _KEY
1272  *          The subkey in relation to the key root.
1273  * @param   _NAME
1274  *          The key value name to write to.
1275  * @param   _STR
1276  *          The string to write to the key value name.
1277  * @param   _LOG_UNINSTALL
1278  *          0 = don't add to uninstall log, 1 = add to uninstall log.
1280  * $R5 = _ROOT
1281  * $R6 = _KEY
1282  * $R7 = _NAME
1283  * $R8 = _STR
1284  * $R9 = _LOG_UNINSTALL
1285  */
1286 !macro WriteRegStrHKCR
1288   !ifndef ${_MOZFUNC_UN}WriteRegStrHKCR
1289     !verbose push
1290     !verbose ${_MOZFUNC_VERBOSE}
1291     !define ${_MOZFUNC_UN}WriteRegStrHKCR "!insertmacro ${_MOZFUNC_UN}WriteRegStrHKCRCall"
1293     Function ${_MOZFUNC_UN}WriteRegStrHKCR
1294       Exch $R9
1295       Exch 1
1296       Exch $R8
1297       Exch 2
1298       Exch $R7
1299       Exch 3
1300       Exch $R6
1301       Exch 4
1302       Exch $R5
1304       ClearErrors
1305       WriteRegStr HKCR "$R6" "$R7" "$R8"
1307       !ifndef NO_LOG
1308         IfErrors 0 +3
1309         FileWrite $fhInstallLog "  ** ERROR Adding Registry String: $R5 | $R6 | $R7 | $R8 **$\r$\n"
1310         GoTo +4
1311         StrCmp "$R9" "1" +1 +2
1312         FileWrite $fhUninstallLog "RegVal: $R5 | $R6 | $R7$\r$\n"
1313         FileWrite $fhInstallLog "  Added Registry String: $R5 | $R6 | $R7 | $R8$\r$\n"
1314       !endif
1316       Exch $R5
1317       Exch 4
1318       Exch $R6
1319       Exch 3
1320       Exch $R7
1321       Exch 2
1322       Exch $R8
1323       Exch 1
1324       Exch $R9
1325     FunctionEnd
1327     !verbose pop
1328   !endif
1329 !macroend
1331 !macro WriteRegStrHKCRCall _ROOT _KEY _NAME _STR _LOG_UNINSTALL
1332   !verbose push
1333   !verbose ${_MOZFUNC_VERBOSE}
1334   Push "${_ROOT}"
1335   Push "${_KEY}"
1336   Push "${_NAME}"
1337   Push "${_STR}"
1338   Push "${_LOG_UNINSTALL}"
1339   Call WriteRegStrHKCR
1340   !verbose pop
1341 !macroend
1343 !macro un.WriteRegStrHKCRCall _ROOT _KEY _NAME _STR _LOG_UNINSTALL
1344   !verbose push
1345   !verbose ${_MOZFUNC_VERBOSE}
1346   Push "${_ROOT}"
1347   Push "${_KEY}"
1348   Push "${_NAME}"
1349   Push "${_STR}"
1350   Push "${_LOG_UNINSTALL}"
1351   Call un.WriteRegStrHKCR
1352   !verbose pop
1353 !macroend
1355 !macro un.WriteRegStrHKCR
1356   !ifndef un.WriteRegStrHKCR
1357     !verbose push
1358     !verbose ${_MOZFUNC_VERBOSE}
1359     !undef _MOZFUNC_UN
1360     !define _MOZFUNC_UN "un."
1362     !insertmacro WriteRegStrHKCR
1364     !undef _MOZFUNC_UN
1365     !define _MOZFUNC_UN
1366     !verbose pop
1367   !endif
1368 !macroend
1371  * Creates a registry key. NSIS doesn't supply a RegCreateKey method and instead
1372  * will auto create keys when a reg key name value pair is set.
1373  * i - int (includes char, byte, short, handles, pointers and so on)
1374  * t - text, string (LPCSTR, pointer to first character)
1375  * * - pointer specifier -> the proc needs the pointer to type, affects next
1376  *     char (parameter) [ex: '*i' - pointer to int]
1377  * see the NSIS documentation for additional information.
1378  */
1379 !define RegCreateKey "Advapi32::RegCreateKeyA(i, t, *i) i"
1382  * Creates a registry key. This will log the actions to the install and
1383  * uninstall logs. Alternatively you can set a registry value to create the key
1384  * and then delete the value.
1386  * Define NO_LOG to prevent all logging when calling this from the uninstaller.
1388  * @param   _ROOT
1389  *          The registry key root as defined by NSIS (e.g. HKLM, HKCU, etc.).
1390  * @param   _KEY
1391  *          The subkey in relation to the key root.
1392  * @param   _LOG_UNINSTALL
1393  *          0 = don't add to uninstall log, 1 = add to uninstall log.
1395  * $R4 = [out] handle to newly created registry key. If this is not a key
1396  *       located in one of the predefined registry keys this must be closed
1397  *       with RegCloseKey (this should not be needed unless someone decides to
1398  *       do something extremely squirrelly with NSIS).
1399  * $R5 = return value from RegCreateKeyA (represented by r15 in the system call).
1400  * $R6 = [in] hKey passed to RegCreateKeyA.
1401  * $R7 = _ROOT
1402  * $R8 = _KEY
1403  * $R9 = _LOG_UNINSTALL
1404  */
1405 !macro CreateRegKey
1407   !ifndef ${_MOZFUNC_UN}CreateRegKey
1408     !verbose push
1409     !verbose ${_MOZFUNC_VERBOSE}
1410     !define ${_MOZFUNC_UN}CreateRegKey "!insertmacro ${_MOZFUNC_UN}CreateRegKeyCall"
1412     Function ${_MOZFUNC_UN}CreateRegKey
1413       Exch $R9
1414       Exch 1
1415       Exch $R8
1416       Exch 2
1417       Exch $R7
1418       Push $R6
1419       Push $R5
1420       Push $R4
1422       StrCmp $R7 "HKCR" +1 +2
1423       StrCpy $R6 "0x80000000"
1424       StrCmp $R7 "HKCU" +1 +2
1425       StrCpy $R6 "0x80000001"
1426       StrCmp $R7 "HKLM" +1 +2
1427       StrCpy $R6 "0x80000002"
1429       ; see definition of RegCreateKey
1430       System::Call "${RegCreateKey}($R6, '$R8', .r14) .r15"
1432       !ifndef NO_LOG
1433         ; if $R5 is not 0 then there was an error creating the registry key.
1434         IntCmp $R5 0 +3 +3
1435         FileWrite $fhInstallLog "  ** ERROR Adding Registry Key: $R7 | $R8 **$\r$\n"
1436         GoTo +4
1437         StrCmp "$R9" "1" +1 +2
1438         FileWrite $fhUninstallLog "RegKey: $R7 | $R8$\r$\n"
1439         FileWrite $fhInstallLog "  Added Registry Key: $R7 | $R8$\r$\n"
1440       !endif
1442       Pop $R4
1443       Pop $R5
1444       Pop $R6
1445       Exch $R7
1446       Exch 2
1447       Exch $R8
1448       Exch 1
1449       Exch $R9
1450     FunctionEnd
1452     !verbose pop
1453   !endif
1454 !macroend
1456 !macro CreateRegKeyCall _ROOT _KEY _LOG_UNINSTALL
1457   !verbose push
1458   !verbose ${_MOZFUNC_VERBOSE}
1459   Push "${_ROOT}"
1460   Push "${_KEY}"
1461   Push "${_LOG_UNINSTALL}"
1462   Call CreateRegKey
1463   !verbose pop
1464 !macroend
1466 !macro un.CreateRegKeyCall _ROOT _KEY _LOG_UNINSTALL
1467   !verbose push
1468   !verbose ${_MOZFUNC_VERBOSE}
1469   Push "${_ROOT}"
1470   Push "${_KEY}"
1471   Push "${_LOG_UNINSTALL}"
1472   Call un.CreateRegKey
1473   !verbose pop
1474 !macroend
1476 !macro un.CreateRegKey
1477   !ifndef un.CreateRegKey
1478     !verbose push
1479     !verbose ${_MOZFUNC_VERBOSE}
1480     !undef _MOZFUNC_UN
1481     !define _MOZFUNC_UN "un."
1483     !insertmacro CreateRegKey
1485     !undef _MOZFUNC_UN
1486     !define _MOZFUNC_UN
1487     !verbose pop
1488   !endif
1489 !macroend
1492 ################################################################################
1493 # Macros for adding file and protocol handlers
1496  * Writes common registry values for a handler using SHCTX.
1498  * @param   _KEY
1499  *          The subkey in relation to the key root.
1500  * @param   _VALOPEN
1501  *          The path and args to launch the application.
1502  * @param   _VALICON
1503  *          The path to an exe that contains an icon and the icon resource id.
1504  * @param   _DISPNAME
1505  *          The display name for the handler. If emtpy no value will be set.
1506  * @param   _ISPROTOCOL
1507  *          Sets protocol handler specific registry values when "true".
1508  * @param   _ISDDE
1509  *          Sets DDE specific registry values when "true".
1511  * $R3 = string value of the current registry key path.
1512  * $R4 = _KEY
1513  * $R5 = _VALOPEN
1514  * $R6 = _VALICON
1515  * $R7 = _DISPNAME
1516  * $R8 = _ISPROTOCOL
1517  * $R9 = _ISDDE
1518  */
1519 !macro AddHandlerValues
1521   !ifndef ${_MOZFUNC_UN}AddHandlerValues
1522     !verbose push
1523     !verbose ${_MOZFUNC_VERBOSE}
1524     !define ${_MOZFUNC_UN}AddHandlerValues "!insertmacro ${_MOZFUNC_UN}AddHandlerValuesCall"
1526     Function ${_MOZFUNC_UN}AddHandlerValues
1527       Exch $R9
1528       Exch 1
1529       Exch $R8
1530       Exch 2
1531       Exch $R7
1532       Exch 3
1533       Exch $R6
1534       Exch 4
1535       Exch $R5
1536       Exch 5
1537       Exch $R4
1538       Push $R3
1540       StrCmp "$R7" "" +6 +1
1541       ReadRegStr $R3 SHCTX "$R4" "FriendlyTypeName"
1543       StrCmp "$R3" "" +1 +3
1544       WriteRegStr SHCTX "$R4" "" "$R7"
1545       WriteRegStr SHCTX "$R4" "FriendlyTypeName" "$R7"
1547       StrCmp "$R8" "true" +1 +8
1548       WriteRegStr SHCTX "$R4" "URL Protocol" ""
1549       StrCpy $R3 ""
1550       ClearErrors
1551       ReadRegDWord $R3 SHCTX "$R4" "EditFlags"
1552       StrCmp $R3 "" +1 +3  ; Only add EditFlags if a value doesn't exist
1553       DeleteRegValue SHCTX "$R4" "EditFlags"
1554       WriteRegDWord SHCTX "$R4" "EditFlags" 0x00000002
1555       
1556       StrCmp "$R6" "" +2 +1
1557       WriteRegStr SHCTX "$R4\DefaultIcon" "" "$R6"
1558       
1559       StrCmp "$R5" "" +2 +1
1560       WriteRegStr SHCTX "$R4\shell\open\command" "" "$R5"      
1562 !ifdef DDEApplication
1563       StrCmp "$R9" "true" +1 +11
1564       WriteRegStr SHCTX "$R4\shell\open\ddeexec" "" "$\"%1$\",,0,0,,,,"
1565       WriteRegStr SHCTX "$R4\shell\open\ddeexec" "NoActivateHandler" ""
1566       WriteRegStr SHCTX "$R4\shell\open\ddeexec\Application" "" "${DDEApplication}"
1567       WriteRegStr SHCTX "$R4\shell\open\ddeexec\Topic" "" "WWW_OpenURL"
1568       ; The ifexec key may have been added by another application so try to
1569       ; delete it to prevent it from breaking this app's shell integration.
1570       ; Also, IE 6 and below doesn't remove this key when it sets itself as the
1571       ; default handler and if this key exists IE's shell integration breaks.
1572       DeleteRegKey HKLM "$R4\shell\open\ddeexec\ifexec"
1573       DeleteRegKey HKCU "$R4\shell\open\ddeexec\ifexec"
1574 !endif
1576       ClearErrors
1578       Pop $R3
1579       Exch $R4
1580       Exch 5
1581       Exch $R5
1582       Exch 4
1583       Exch $R6
1584       Exch 3
1585       Exch $R7
1586       Exch 2
1587       Exch $R8
1588       Exch 1
1589       Exch $R9
1590     FunctionEnd
1592     !verbose pop
1593   !endif
1594 !macroend
1596 !macro AddHandlerValuesCall _KEY _VALOPEN _VALICON _DISPNAME _ISPROTOCOL _ISDDE
1597   !verbose push
1598   !verbose ${_MOZFUNC_VERBOSE}
1599   Push "${_KEY}"
1600   Push "${_VALOPEN}"
1601   Push "${_VALICON}"
1602   Push "${_DISPNAME}"
1603   Push "${_ISPROTOCOL}"
1604   Push "${_ISDDE}"
1605   Call AddHandlerValues
1606   !verbose pop
1607 !macroend
1609 !macro un.AddHandlerValuesCall _KEY _VALOPEN _VALICON _DISPNAME _ISPROTOCOL _ISDDE
1610   !verbose push
1611   !verbose ${_MOZFUNC_VERBOSE}
1612   Push "${_KEY}"
1613   Push "${_VALOPEN}"
1614   Push "${_VALICON}"
1615   Push "${_DISPNAME}"
1616   Push "${_ISPROTOCOL}"
1617   Push "${_ISDDE}"
1618   Call un.AddHandlerValues
1619   !verbose pop
1620 !macroend
1622 !macro un.AddHandlerValues
1623   !ifndef un.AddHandlerValues
1624     !verbose push
1625     !verbose ${_MOZFUNC_VERBOSE}
1626     !undef _MOZFUNC_UN
1627     !define _MOZFUNC_UN "un."
1629     !insertmacro AddHandlerValues
1631     !undef _MOZFUNC_UN
1632     !define _MOZFUNC_UN
1633     !verbose pop
1634   !endif
1635 !macroend
1638  * Writes common registry values for a handler that uses DDE using SHCTX.
1640  * @param   _KEY
1641  *          The key name in relation to the HKCR root. SOFTWARE\Classes is
1642  *          prefixed to this value when using SHCTX.
1643  * @param   _VALOPEN
1644  *          The path and args to launch the application.
1645  * @param   _VALICON
1646  *          The path to an exe that contains an icon and the icon resource id.
1647  * @param   _DISPNAME
1648  *          The display name for the handler. If emtpy no value will be set.
1649  * @param   _ISPROTOCOL
1650  *          Sets protocol handler specific registry values when "true".
1651  * @param   _DDE_APPNAME
1652  *          Sets DDE specific registry values when not an empty string.
1654  * $R0 = storage for SOFTWARE\Classes
1655  * $R1 = string value of the current registry key path.
1656  * $R2 = _KEY
1657  * $R3 = _VALOPEN
1658  * $R4 = _VALICON
1659  * $R5 = _DISPNAME
1660  * $R6 = _ISPROTOCOL
1661  * $R7 = _DDE_APPNAME
1662  * $R8 = _DDE_DEFAULT
1663  * $R9 = _DDE_TOPIC
1664  */
1665 !macro AddDDEHandlerValues
1667   !ifndef ${_MOZFUNC_UN}AddDDEHandlerValues
1668     !verbose push
1669     !verbose ${_MOZFUNC_VERBOSE}
1670     !define ${_MOZFUNC_UN}AddDDEHandlerValues "!insertmacro ${_MOZFUNC_UN}AddDDEHandlerValuesCall"
1672     Function ${_MOZFUNC_UN}AddDDEHandlerValues
1673       Exch $R9
1674       Exch 1
1675       Exch $R8
1676       Exch 2
1677       Exch $R7
1678       Exch 3
1679       Exch $R6
1680       Exch 4
1681       Exch $R5
1682       Exch 5
1683       Exch $R4
1684       Exch 6
1685       Exch $R3
1686       Exch 7
1687       Exch $R2
1688       Push $R1
1689       Push $R0
1691       StrCpy $R0 "SOFTWARE\Classes"
1692       StrCmp "$R5" "" +6 +1
1693       ReadRegStr $R1 SHCTX "$R2" "FriendlyTypeName"
1695       StrCmp "$R1" "" +1 +3
1696       WriteRegStr SHCTX "$R0\$R2" "" "$R5"
1697       WriteRegStr SHCTX "$R0\$R2" "FriendlyTypeName" "$R5"
1699       StrCmp "$R6" "true" +1 +8
1700       WriteRegStr SHCTX "$R0\$R2" "URL Protocol" ""
1701       StrCpy $R1 ""
1702       ClearErrors
1703       ReadRegDWord $R1 SHCTX "$R0\$R2" "EditFlags"
1704       StrCmp $R1 "" +1 +3  ; Only add EditFlags if a value doesn't exist
1705       DeleteRegValue SHCTX "$R0\$R2" "EditFlags"
1706       WriteRegDWord SHCTX "$R0\$R2" "EditFlags" 0x00000002
1707       
1708       StrCmp "$R4" "" +2 +1
1709       WriteRegStr SHCTX "$R0\$R2\DefaultIcon" "" "$R4"
1711       WriteRegStr SHCTX "$R0\$R2\shell\open\command" "" "$R3"
1713       WriteRegStr SHCTX "$R0\$R2\shell\open\ddeexec" "" "$R8"
1714       WriteRegStr SHCTX "$R0\$R2\shell\open\ddeexec" "NoActivateHandler" ""
1715       WriteRegStr SHCTX "$R0\$R2\shell\open\ddeexec\Application" "" "$R7"
1716       WriteRegStr SHCTX "$R0\$R2\shell\open\ddeexec\Topic" "" "$R9"
1718       ; The ifexec key may have been added by another application so try to
1719       ; delete it to prevent it from breaking this app's shell integration.
1720       ; Also, IE 6 and below doesn't remove this key when it sets itself as the
1721       ; default handler and if this key exists IE's shell integration breaks.
1722       DeleteRegKey HKLM "$R0\$R2\shell\open\ddeexec\ifexec"
1723       DeleteRegKey HKCU "$R0\$R2\shell\open\ddeexec\ifexec"
1724       ClearErrors
1726       Pop $R0
1727       Pop $R1
1728       Exch $R2
1729       Exch 7
1730       Exch $R3
1731       Exch 6
1732       Exch $R4
1733       Exch 5
1734       Exch $R5
1735       Exch 4
1736       Exch $R6
1737       Exch 3
1738       Exch $R7
1739       Exch 2
1740       Exch $R8
1741       Exch 1
1742       Exch $R9
1743     FunctionEnd
1745     !verbose pop
1746   !endif
1747 !macroend
1749 !macro AddDDEHandlerValuesCall _KEY _VALOPEN _VALICON _DISPNAME _ISPROTOCOL _DDE_APPNAME _DDE_DEFAULT _DDE_TOPIC
1750   !verbose push
1751   !verbose ${_MOZFUNC_VERBOSE}
1752   Push "${_KEY}"
1753   Push "${_VALOPEN}"
1754   Push "${_VALICON}"
1755   Push "${_DISPNAME}"
1756   Push "${_ISPROTOCOL}"
1757   Push "${_DDE_APPNAME}"
1758   Push "${_DDE_DEFAULT}"
1759   Push "${_DDE_TOPIC}"
1760   Call AddDDEHandlerValues
1761   !verbose pop
1762 !macroend
1764 !macro un.AddDDEHandlerValuesCall _KEY _VALOPEN _VALICON _DISPNAME _ISPROTOCOL _DDE_APPNAME _DDE_DEFAULT _DDE_TOPIC
1765   !verbose push
1766   !verbose ${_MOZFUNC_VERBOSE}
1767   Push "${_KEY}"
1768   Push "${_VALOPEN}"
1769   Push "${_VALICON}"
1770   Push "${_DISPNAME}"
1771   Push "${_ISPROTOCOL}"
1772   Push "${_DDE_APPNAME}"
1773   Push "${_DDE_DEFAULT}"
1774   Push "${_DDE_TOPIC}"
1775   Call un.AddDDEHandlerValues
1776   !verbose pop
1777 !macroend
1779 !macro un.AddDDEHandlerValues
1780   !ifndef un.AddDDEHandlerValues
1781     !verbose push
1782     !verbose ${_MOZFUNC_VERBOSE}
1783     !undef _MOZFUNC_UN
1784     !define _MOZFUNC_UN "un."
1786     !insertmacro AddDDEHandlerValues
1788     !undef _MOZFUNC_UN
1789     !define _MOZFUNC_UN
1790     !verbose pop
1791   !endif
1792 !macroend
1794 ################################################################################
1795 # Macros for retrieving existing install paths
1798  * Finds a second installation of the application so we can make informed
1799  * decisions about registry operations. This uses SHCTX to determine the
1800  * registry hive so you must call SetShellVarContext first.
1802  * @param   _KEY
1803  *          The registry subkey (typically this will be Software\Mozilla).
1804  * @return  _RESULT
1805  *          false if a second install isn't found, path to the main exe if a
1806  *          second install is found.
1808  * $R3 = stores the long path to $INSTDIR
1809  * $R4 = counter for the outer loop's EnumRegKey
1810  * $R5 = return value from ReadRegStr and RemoveQuotesFromPath
1811  * $R6 = return value from GetParent
1812  * $R7 = return value from the loop's EnumRegKey
1813  * $R8 = storage for _KEY
1814  * $R9 = _KEY and _RESULT
1815  */
1816 !macro GetSecondInstallPath
1818   !ifndef ${_MOZFUNC_UN}GetSecondInstallPath
1819     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
1820     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
1821     !insertmacro ${_MOZFUNC_UN_TMP}GetParent
1822     !insertmacro ${_MOZFUNC_UN_TMP}RemoveQuotesFromPath
1823     !undef _MOZFUNC_UN
1824     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
1825     !undef _MOZFUNC_UN_TMP
1827     !verbose push
1828     !verbose ${_MOZFUNC_VERBOSE}
1829     !define ${_MOZFUNC_UN}GetSecondInstallPath "!insertmacro ${_MOZFUNC_UN}GetSecondInstallPathCall"
1831     Function ${_MOZFUNC_UN}GetSecondInstallPath
1832       Exch $R9
1833       Push $R8
1834       Push $R7
1835       Push $R6
1836       Push $R5
1837       Push $R4
1838       Push $R3
1840       ${${_MOZFUNC_UN}GetLongPath} "$INSTDIR" $R3
1842       StrCpy $R4 0       ; set the counter for the loop to 0
1843       StrCpy $R8 "$R9"   ; Registry key path to search
1844       StrCpy $R9 "false" ; default return value
1846       loop:
1847       EnumRegKey $R7 SHCTX $R8 $R4
1848       StrCmp $R7 "" end +1  ; if empty there are no more keys to enumerate
1849       IntOp $R4 $R4 + 1     ; increment the loop's counter
1850       ClearErrors
1851       ReadRegStr $R5 SHCTX "$R8\$R7\bin" "PathToExe"
1852       IfErrors loop
1854       ${${_MOZFUNC_UN}RemoveQuotesFromPath} "$R5" $R5
1856       IfFileExists "$R5" +1 loop
1857       ${${_MOZFUNC_UN}GetLongPath} "$R5" $R5
1858       ${${_MOZFUNC_UN}GetParent} "$R5" $R6
1859       StrCmp "$R6" "$R3" loop +1
1860       StrCmp "$R6\${FileMainEXE}" "$R5" +1 loop
1861       StrCpy $R9 "$R5"
1863       end:
1864       ClearErrors
1866       Pop $R3
1867       Pop $R4
1868       Pop $R5
1869       Pop $R6
1870       Pop $R7
1871       Pop $R8
1872       Exch $R9
1873     FunctionEnd
1875     !verbose pop
1876   !endif
1877 !macroend
1879 !macro GetSecondInstallPathCall _KEY _RESULT
1880   !verbose push
1881   !verbose ${_MOZFUNC_VERBOSE}
1882   Push "${_KEY}"
1883   Call GetSecondInstallPath
1884   Pop ${_RESULT}
1885   !verbose pop
1886 !macroend
1888 !macro un.GetSecondInstallPathCall _KEY _RESULT
1889   !verbose push
1890   !verbose ${_MOZFUNC_VERBOSE}
1891   Push "${_KEY}"
1892   Call un.GetSecondInstallPath
1893   Pop ${_RESULT}
1894   !verbose pop
1895 !macroend
1897 !macro un.GetSecondInstallPath
1898   !ifndef un.GetSecondInstallPath
1899     !verbose push
1900     !verbose ${_MOZFUNC_VERBOSE}
1901     !undef _MOZFUNC_UN
1902     !define _MOZFUNC_UN "un."
1904     !insertmacro GetSecondInstallPath
1906     !undef _MOZFUNC_UN
1907     !define _MOZFUNC_UN
1908     !verbose pop
1909   !endif
1910 !macroend
1913  * Finds an existing installation path for the application based on the
1914  * application's executable name so we can default to using this path for the
1915  * install. If there is zero or more than one installation of the application
1916  * then we default to the default installation path. This uses SHCTX to
1917  * determine the registry hive to read from so you must call SetShellVarContext
1918  * first.
1920  * @param   _KEY
1921  *          The registry subkey (typically this will be Software\Mozilla\App Name).
1922  * @return  _RESULT
1923  *          false if a single install location for this app name isn't found,
1924  *          path to the install directory if a single install location is found.
1926  * $R5 = counter for the loop's EnumRegKey
1927  * $R6 = return value from EnumRegKey
1928  * $R7 = return value from ReadRegStr
1929  * $R8 = storage for _KEY
1930  * $R9 = _KEY and _RESULT
1931  */
1932 !macro GetSingleInstallPath
1934   !ifndef ${_MOZFUNC_UN}GetSingleInstallPath
1935     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
1936     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
1937     !insertmacro ${_MOZFUNC_UN_TMP}GetParent
1938     !insertmacro ${_MOZFUNC_UN_TMP}RemoveQuotesFromPath
1939     !undef _MOZFUNC_UN
1940     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
1941     !undef _MOZFUNC_UN_TMP
1943     !verbose push
1944     !verbose ${_MOZFUNC_VERBOSE}
1945     !define ${_MOZFUNC_UN}GetSingleInstallPath "!insertmacro ${_MOZFUNC_UN}GetSingleInstallPathCall"
1947     Function ${_MOZFUNC_UN}GetSingleInstallPath
1948       Exch $R9
1949       Push $R8
1950       Push $R7
1951       Push $R6
1952       Push $R5
1954       StrCpy $R8 $R9
1955       StrCpy $R9 "false"
1956       StrCpy $R5 0  ; set the counter for the loop to 0
1958       loop:
1959       ClearErrors
1960       EnumRegKey $R6 SHCTX $R8 $R5
1961       IfErrors cleanup
1962       StrCmp $R6 "" cleanup +1  ; if empty there are no more keys to enumerate
1963       IntOp $R5 $R5 + 1         ; increment the loop's counter
1964       ClearErrors
1965       ReadRegStr $R7 SHCTX "$R8\$R6\Main" "PathToExe"
1966       IfErrors loop
1967       ${${_MOZFUNC_UN}RemoveQuotesFromPath} "$R7" $R7
1968       GetFullPathName $R7 "$R7"
1969       IfErrors loop
1971       StrCmp "$R9" "false" +1 +3
1972       StrCpy $R9 "$R7"
1973       GoTo Loop
1975       StrCpy $R9 "false"
1977       cleanup:
1978       StrCmp $R9 "false" end +1
1979       ${${_MOZFUNC_UN}GetLongPath} "$R9" $R9
1980       ${${_MOZFUNC_UN}GetParent} "$R9" $R9
1982       end:
1983       ClearErrors
1985       Pop $R5
1986       Pop $R6
1987       Pop $R7
1988       Pop $R8
1989       Exch $R9
1990     FunctionEnd
1992     !verbose pop
1993   !endif
1994 !macroend
1996 !macro GetSingleInstallPathCall _KEY _RESULT
1997   !verbose push
1998   !verbose ${_MOZFUNC_VERBOSE}
1999   Push "${_KEY}"
2000   Call GetSingleInstallPath
2001   Pop ${_RESULT}
2002   !verbose pop
2003 !macroend
2005 !macro un.GetSingleInstallPathCall _KEY _RESULT
2006   !verbose push
2007   !verbose ${_MOZFUNC_VERBOSE}
2008   Push "${_KEY}"
2009   Call un.GetSingleInstallPath
2010   Pop ${_RESULT}
2011   !verbose pop
2012 !macroend
2014 !macro un.GetSingleInstallPath
2015   !ifndef un.GetSingleInstallPath
2016     !verbose push
2017     !verbose ${_MOZFUNC_VERBOSE}
2018     !undef _MOZFUNC_UN
2019     !define _MOZFUNC_UN "un."
2021     !insertmacro GetSingleInstallPath
2023     !undef _MOZFUNC_UN
2024     !define _MOZFUNC_UN
2025     !verbose pop
2026   !endif
2027 !macroend
2030 ################################################################################
2031 # Macros for working with the file system
2034  * Attempts to delete a file if it exists. This will fail if the file is in use.
2036  * @param   _FILE
2037  *          The path to the file that is to be deleted.
2038  */
2039 !macro DeleteFile _FILE
2040   ${If} ${FileExists} "${_FILE}"
2041     Delete "${_FILE}"
2042   ${EndIf}
2043 !macroend
2044 !define DeleteFile "!insertmacro DeleteFile"
2047  * Removes a directory if it exists and is empty.
2049  * @param   _DIR
2050  *          The path to the directory that is to be removed.
2051  */
2052 !macro RemoveDir _DIR
2053   ${If} ${FileExists} "${_DIR}"
2054     RmDir "${_DIR}"
2055   ${EndIf}
2056 !macroend
2057 !define RemoveDir "!insertmacro RemoveDir"
2060  * Checks whether we can write to the install directory. If the install
2061  * directory already exists this will attempt to create a temporary file in the
2062  * install directory and then delete it. If it does not exist this will attempt
2063  * to create the directory and then delete it. If we can write to the install
2064  * directory this will return true... if not, this will return false.
2066  * @return  _RESULT
2067  *          true if the install directory can be written to otherwise false.
2069  * $R7 = temp filename in installation directory returned from GetTempFileName
2070  * $R8 = filehandle to temp file used for writing
2071  * $R9 = _RESULT
2072  */
2073 !macro CanWriteToInstallDir
2075   !ifndef ${_MOZFUNC_UN}CanWriteToInstallDir
2076     !verbose push
2077     !verbose ${_MOZFUNC_VERBOSE}
2078     !define ${_MOZFUNC_UN}CanWriteToInstallDir "!insertmacro ${_MOZFUNC_UN}CanWriteToInstallDirCall"
2080     Function ${_MOZFUNC_UN}CanWriteToInstallDir
2081       Push $R9
2082       Push $R8
2083       Push $R7
2085       StrCpy $R9 "true"
2086       IfFileExists "$INSTDIR" +1 checkCreateDir
2087       GetTempFileName $R7 "$INSTDIR"
2088       FileOpen $R8 $R7 w
2089       FileWrite $R8 "Write Access Test"
2090       FileClose $R8
2091       IfFileExists "$R7" +3 +1
2092       StrCpy $R9 "false"
2093       GoTo end
2095       Delete $R7
2096       GoTo end
2098       checkCreateDir:
2099       CreateDirectory "$INSTDIR"
2100       IfFileExists "$INSTDIR" +3 +1
2101       StrCpy $R9 "false"
2102       GoTo end
2104       RmDir "$INSTDIR"
2106       end:
2107       ClearErrors
2109       Pop $R7
2110       Pop $R8
2111       Exch $R9
2112     FunctionEnd
2114     !verbose pop
2115   !endif
2116 !macroend
2118 !macro CanWriteToInstallDirCall _RESULT
2119   !verbose push
2120   !verbose ${_MOZFUNC_VERBOSE}
2121   Call CanWriteToInstallDir
2122   Pop ${_RESULT}
2123   !verbose pop
2124 !macroend
2126 !macro un.CanWriteToInstallDirCall _RESULT
2127   !verbose push
2128   !verbose ${_MOZFUNC_VERBOSE}
2129   Call un.CanWriteToInstallDir
2130   Pop ${_RESULT}
2131   !verbose pop
2132 !macroend
2134 !macro un.CanWriteToInstallDir
2135   !ifndef un.CanWriteToInstallDir
2136     !verbose push
2137     !verbose ${_MOZFUNC_VERBOSE}
2138     !undef _MOZFUNC_UN
2139     !define _MOZFUNC_UN "un."
2141     !insertmacro CanWriteToInstallDir
2143     !undef _MOZFUNC_UN
2144     !define _MOZFUNC_UN
2145     !verbose pop
2146   !endif
2147 !macroend
2150  * Checks whether there is sufficient free space available on the installation
2151  * directory's drive. If there is sufficient free space this will return true...
2152  * if not, this will return false. This will only calculate the size of the
2153  * first three sections.
2155  * @return  _RESULT
2156  *          true if there is sufficient free space otherwise false.
2158  * $R2 = return value from greater than comparison (0=false 1=true)
2159  * $R3 = free space for the install directory's drive
2160  * $R4 = install directory root
2161  * $R5 = return value from SectionGetSize
2162  * $R6 = return value from 'and' comparison of SectionGetFlags (1=selected)
2163  * $R7 = return value from SectionGetFlags
2164  * $R8 = size in KB required for this installation
2165  * $R9 = _RESULT
2166  */
2167 !macro CheckDiskSpace
2169   !ifndef ${_MOZFUNC_UN}CheckDiskSpace
2170     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
2171     !insertmacro ${_MOZFUNC_UN_TMP}GetRoot
2172     !insertmacro ${_MOZFUNC_UN_TMP}DriveSpace
2173     !undef _MOZFUNC_UN
2174     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
2175     !undef _MOZFUNC_UN_TMP
2177     !verbose push
2178     !verbose ${_MOZFUNC_VERBOSE}
2179     !define ${_MOZFUNC_UN}CheckDiskSpace "!insertmacro ${_MOZFUNC_UN}CheckDiskSpaceCall"
2181     Function ${_MOZFUNC_UN}CheckDiskSpace
2182       Push $R9
2183       Push $R8
2184       Push $R7
2185       Push $R6
2186       Push $R5
2187       Push $R4
2188       Push $R3
2189       Push $R2
2191       StrCpy $R9 "true"
2192       SectionGetSize 0 $R8
2194       SectionGetFlags 1 $R7
2195       IntOp $R6 ${SF_SELECTED} & $R7
2196       IntCmp $R6 0 +3 +1 +1
2197       SectionGetSize 1 $R5
2198       IntOp $R8 $R8 + $R5
2200       SectionGetFlags 2 $R7
2201       IntOp $R6 ${SF_SELECTED} & $R7
2202       IntCmp $R6 0 +3 +1 +1
2203       SectionGetSize 2 $R5
2204       IntOp $R8 $R8 + $R5
2206       ${${_MOZFUNC_UN}GetRoot} "$INSTDIR" $R4
2207       ${${_MOZFUNC_UN}DriveSpace} "$R4" "/D=F /S=K" $R3
2209       System::Int64Op $R3 > $R8
2210       Pop $R2
2212       IntCmp $R2 1 end +1 +1
2213       StrCpy $R9 "false"
2215       end:
2216       ClearErrors
2218       Pop $R2
2219       Pop $R3
2220       Pop $R4
2221       Pop $R5
2222       Pop $R6
2223       Pop $R7
2224       Pop $R8
2225       Exch $R9
2226     FunctionEnd
2228     !verbose pop
2229   !endif
2230 !macroend
2232 !macro CheckDiskSpaceCall _RESULT
2233   !verbose push
2234   !verbose ${_MOZFUNC_VERBOSE}
2235   Call CheckDiskSpace
2236   Pop ${_RESULT}
2237   !verbose pop
2238 !macroend
2240 !macro un.CheckDiskSpaceCall _RESULT
2241   !verbose push
2242   !verbose ${_MOZFUNC_VERBOSE}
2243   Call un.CheckDiskSpace
2244   Pop ${_RESULT}
2245   !verbose pop
2246 !macroend
2248 !macro un.CheckDiskSpace
2249   !ifndef un.CheckDiskSpace
2250     !verbose push
2251     !verbose ${_MOZFUNC_VERBOSE}
2252     !undef _MOZFUNC_UN
2253     !define _MOZFUNC_UN "un."
2255     !insertmacro CheckDiskSpace
2257     !undef _MOZFUNC_UN
2258     !define _MOZFUNC_UN
2259     !verbose pop
2260   !endif
2261 !macroend
2264 * Returns the path found within a passed in string. The path is quoted or not
2265 * with the exception of an unquoted non 8dot3 path without arguments that is
2266 * also not a DefaultIcon path, is a 8dot3 path or not, has command line
2267 * arguments, or is a registry DefaultIcon path (e.g. <path to binary>,# where #
2268 * is the icon's resuorce id). The string does not need to be a valid path or
2269 * exist. It is up to the caller to pass in a string of one of the forms noted
2270 * above and to verify existence if necessary.
2272 * Examples:
2273 * In:  C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -flag "%1"
2274 * In:  C:\PROGRA~1\MOZILL~1\FIREFOX.EXE,0
2275 * In:  C:\PROGRA~1\MOZILL~1\FIREFOX.EXE
2276 * In:  "C:\PROGRA~1\MOZILL~1\FIREFOX.EXE"
2277 * In:  "C:\PROGRA~1\MOZILL~1\FIREFOX.EXE" -flag "%1"
2278 * Out: C:\PROGRA~1\MOZILL~1\FIREFOX.EXE
2280 * In:  "C:\Program Files\Mozilla Firefox\firefox.exe" -flag "%1"
2281 * In:  C:\Program Files\Mozilla Firefox\firefox.exe,0
2282 * In:  "C:\Program Files\Mozilla Firefox\firefox.exe"
2283 * Out: C:\Program Files\Mozilla Firefox\firefox.exe
2285 * @param   _IN_PATH
2286 *          The string containing the path.
2287 * @param   _OUT_PATH
2288 *          The register to store the path to.
2290 * $R7 = counter for the outer loop's EnumRegKey
2291 * $R8 = return value from ReadRegStr
2292 * $R9 = _IN_PATH and _OUT_PATH
2294 !macro GetPathFromString
2296   !ifndef ${_MOZFUNC_UN}GetPathFromString
2297     !verbose push
2298     !verbose ${_MOZFUNC_VERBOSE}
2299     !define ${_MOZFUNC_UN}GetPathFromString "!insertmacro ${_MOZFUNC_UN}GetPathFromStringCall"
2301     Function ${_MOZFUNC_UN}GetPathFromString
2302       Exch $R9
2303       Push $R8
2304       Push $R7
2306       StrCpy $R7 0          ; Set the counter to 0.
2308       ; Handle quoted paths with arguments.
2309       StrCpy $R8 $R9 1      ; Copy the first char.
2310       StrCmp $R8 '"' +2 +1  ; Is it a "?
2311       StrCmp $R8 "'" +1 +9  ; Is it a '?
2312       StrCpy $R9 $R9 "" 1   ; Remove the first char.
2313       IntOp $R7 $R7 + 1     ; Increment the counter.
2314       StrCpy $R8 $R9 1 $R7  ; Starting from the counter copy the next char.
2315       StrCmp $R8 "" end +1  ; Are there no more chars?
2316       StrCmp $R8 '"' +2 +1  ; Is it a " char?
2317       StrCmp $R8 "'" +1 -4  ; Is it a ' char?
2318       StrCpy $R9 $R9 $R7    ; Copy chars up to the counter.
2319       GoTo end
2321       ; Handle DefaultIcon paths. DefaultIcon paths are not quoted and end with
2322       ; a , and a number.
2323       IntOp $R7 $R7 - 1     ; Decrement the counter.
2324       StrCpy $R8 $R9 1 $R7  ; Copy one char from the end minus the counter.
2325       StrCmp $R8 '' +4 +1   ; Are there no more chars?
2326       StrCmp $R8 ',' +1 -3  ; Is it a , char?
2327       StrCpy $R9 $R9 $R7    ; Copy chars up to the end minus the counter.
2328       GoTo end
2330       ; Handle unquoted paths with arguments. An unquoted path with arguments
2331       ; must be an 8dot3 path.
2332       StrCpy $R7 -1          ; Set the counter to -1 so it will start at 0.
2333       IntOp $R7 $R7 + 1      ; Increment the counter.
2334       StrCpy $R8 $R9 1 $R7   ; Starting from the counter copy the next char.
2335       StrCmp $R8 "" end +1   ; Are there no more chars?
2336       StrCmp $R8 " " +1 -3   ; Is it a space char?
2337       StrCpy $R9 $R9 $R7     ; Copy chars up to the counter.
2339       end:
2340       ClearErrors
2342       Pop $R7
2343       Pop $R8
2344       Exch $R9
2345     FunctionEnd
2347     !verbose pop
2348   !endif
2349 !macroend
2351 !macro GetPathFromStringCall _IN_PATH _OUT_PATH
2352   !verbose push
2353   !verbose ${_MOZFUNC_VERBOSE}
2354   Push "${_IN_PATH}"
2355   Call GetPathFromString
2356   Pop ${_OUT_PATH}
2357   !verbose pop
2358 !macroend
2360 !macro un.GetPathFromStringCall _IN_PATH _OUT_PATH
2361   !verbose push
2362   !verbose ${_MOZFUNC_VERBOSE}
2363   Push "${_IN_PATH}"
2364   Call un.GetPathFromString
2365   Pop ${_OUT_PATH}
2366   !verbose pop
2367 !macroend
2369 !macro un.GetPathFromString
2370   !ifndef un.GetPathFromString
2371     !verbose push
2372     !verbose ${_MOZFUNC_VERBOSE}
2373     !undef _MOZFUNC_UN
2374     !define _MOZFUNC_UN "un."
2376     !insertmacro GetPathFromString
2378     !undef _MOZFUNC_UN
2379     !define _MOZFUNC_UN
2380     !verbose pop
2381   !endif
2382 !macroend
2385  * Removes the quotes from each end of a string if present.
2387  * @param   _IN_PATH
2388  *          The string containing the path.
2389  * @param   _OUT_PATH
2390  *          The register to store the long path.
2392  * $R7 = storage for single character comparison
2393  * $R8 = storage for _IN_PATH
2394  * $R9 = _IN_PATH and _OUT_PATH
2395  */
2396 !macro RemoveQuotesFromPath
2398   !ifndef ${_MOZFUNC_UN}RemoveQuotesFromPath
2399     !verbose push
2400     !verbose ${_MOZFUNC_VERBOSE}
2401     !define ${_MOZFUNC_UN}RemoveQuotesFromPath "!insertmacro ${_MOZFUNC_UN}RemoveQuotesFromPathCall"
2403     Function ${_MOZFUNC_UN}RemoveQuotesFromPath
2404       Exch $R9
2405       Push $R8
2406       Push $R7
2408       StrCpy $R7 "$R9" 1
2409       StrCmp $R7 "$\"" +1 +2
2410       StrCpy $R9 "$R9" "" 1
2412       StrCpy $R7 "$R9" "" -1
2413       StrCmp $R7 "$\"" +1 +2
2414       StrCpy $R9 "$R9" -1
2416       Pop $R7
2417       Pop $R8
2418       Exch $R9
2419     FunctionEnd
2421     !verbose pop
2422   !endif
2423 !macroend
2425 !macro RemoveQuotesFromPathCall _IN_PATH _OUT_PATH
2426   !verbose push
2427   !verbose ${_MOZFUNC_VERBOSE}
2428   Push "${_IN_PATH}"
2429   Call RemoveQuotesFromPath
2430   Pop ${_OUT_PATH}
2431   !verbose pop
2432 !macroend
2434 !macro un.RemoveQuotesFromPathCall _IN_PATH _OUT_PATH
2435   !verbose push
2436   !verbose ${_MOZFUNC_VERBOSE}
2437   Push "${_IN_PATH}"
2438   Call un.RemoveQuotesFromPath
2439   Pop ${_OUT_PATH}
2440   !verbose pop
2441 !macroend
2443 !macro un.RemoveQuotesFromPath
2444   !ifndef un.RemoveQuotesFromPath
2445     !verbose push
2446     !verbose ${_MOZFUNC_VERBOSE}
2447     !undef _MOZFUNC_UN
2448     !define _MOZFUNC_UN "un."
2450     !insertmacro RemoveQuotesFromPath
2452     !undef _MOZFUNC_UN
2453     !define _MOZFUNC_UN
2454     !verbose pop
2455   !endif
2456 !macroend
2459  * Returns the long path for an existing file or directory. GetLongPathNameA
2460  * may not be available on Win95 if Microsoft Layer for Unicode is not
2461  * installed and GetFullPathName only returns a long path for the last file or
2462  * directory that doesn't end with a \ in the path that it is passed. If the
2463  * path does not exist on the file system this will return an empty string. To
2464  * provide a consistent result trailing back-slashes are always removed.
2466  * Note: 1024 used by GetLongPathNameA is the maximum NSIS string length.
2468  * @param   _IN_PATH
2469  *          The string containing the path.
2470  * @param   _OUT_PATH
2471  *          The register to store the long path.
2473  * $R4 = counter value when the previous \ was found
2474  * $R5 = directory or file name found during loop
2475  * $R6 = return value from GetLongPathNameA and loop counter
2476  * $R7 = long path from GetLongPathNameA and single char from path for comparison
2477  * $R8 = storage for _IN_PATH
2478  * $R9 = _IN_PATH _OUT_PATH
2479  */
2480 !macro GetLongPath
2482   !ifndef ${_MOZFUNC_UN}GetLongPath
2483     !verbose push
2484     !verbose ${_MOZFUNC_VERBOSE}
2485     !define ${_MOZFUNC_UN}GetLongPath "!insertmacro ${_MOZFUNC_UN}GetLongPathCall"
2487     Function ${_MOZFUNC_UN}GetLongPath
2488       Exch $R9
2489       Push $R8
2490       Push $R7
2491       Push $R6
2492       Push $R5
2493       Push $R4
2495       ClearErrors
2497       StrCpy $R8 "$R9"
2498       StrCpy $R9 ""
2499       GetFullPathName $R8 "$R8"
2500       IfErrors end_GetLongPath +1 ; If the path doesn't exist return an empty string.
2502       ; Remove trailing \'s from the path.
2503       StrCpy $R6 "$R8" "" -1
2504       StrCmp $R6 "\" +1 +2
2505       StrCpy $R9 "$R8" -1
2507       System::Call 'kernel32::GetLongPathNameA(t r18, t .r17, i 1024)i .r16'
2508       StrCmp "$R7" "" +4 +1 ; Empty string when GetLongPathNameA is not present.
2509       StrCmp $R6 0 +3 +1    ; Should never equal 0 since the path exists.
2510       StrCpy $R9 "$R7"
2511       GoTo end_GetLongPath
2513       ; Do it the hard way.
2514       StrCpy $R4 0     ; Stores the position in the string of the last \ found.
2515       StrCpy $R6 -1    ; Set the counter to -1 so it will start at 0.
2517       loop_GetLongPath:
2518       IntOp $R6 $R6 + 1      ; Increment the counter.
2519       StrCpy $R7 $R8 1 $R6   ; Starting from the counter copy the next char.
2520       StrCmp $R7 "" +2 +1    ; Are there no more chars?
2521       StrCmp $R7 "\" +1 -3   ; Is it a \?
2523       ; Copy chars starting from the previously found \ to the counter.
2524       StrCpy $R5 $R8 $R6 $R4
2526       ; If this is the first \ found we want to swap R9 with R5 so a \ will
2527       ; be appended to the drive letter and colon (e.g. C: will become C:\).
2528       StrCmp $R4 0 +1 +3     
2529       StrCpy $R9 $R5
2530       StrCpy $R5 ""
2532       GetFullPathName $R9 "$R9\$R5"
2534       StrCmp $R7 "" end_GetLongPath +1 ; Are there no more chars?
2536       ; Store the counter for the current \ and prefix it for StrCpy operations.
2537       StrCpy $R4 "+$R6"
2538       IntOp $R6 $R6 + 1      ; Increment the counter so we skip over the \.
2539       StrCpy $R8 $R8 "" $R6  ; Copy chars starting from the counter to the end.
2540       StrCpy $R6 -1          ; Reset the counter to -1 so it will start over at 0.
2541       GoTo loop_GetLongPath
2543       end_GetLongPath:
2544       ClearErrors
2546       Pop $R4
2547       Pop $R5
2548       Pop $R6
2549       Pop $R7
2550       Pop $R8
2551       Exch $R9
2552     FunctionEnd
2554     !verbose pop
2555   !endif
2556 !macroend
2558 !macro GetLongPathCall _IN_PATH _OUT_PATH
2559   !verbose push
2560   !verbose ${_MOZFUNC_VERBOSE}
2561   Push "${_IN_PATH}"
2562   Call GetLongPath
2563   Pop ${_OUT_PATH}
2564   !verbose pop
2565 !macroend
2567 !macro un.GetLongPathCall _IN_PATH _OUT_PATH
2568   !verbose push
2569   !verbose ${_MOZFUNC_VERBOSE}
2570   Push "${_IN_PATH}"
2571   Call un.GetLongPath
2572   Pop ${_OUT_PATH}
2573   !verbose pop
2574 !macroend
2576 !macro un.GetLongPath
2577   !ifndef un.GetLongPath
2578     !verbose push
2579     !verbose ${_MOZFUNC_VERBOSE}
2580     !undef _MOZFUNC_UN
2581     !define _MOZFUNC_UN "un."
2583     !insertmacro GetLongPath
2585     !undef _MOZFUNC_UN
2586     !define _MOZFUNC_UN
2587     !verbose pop
2588   !endif
2589 !macroend
2592 ################################################################################
2593 # Macros for cleaning up the registry and file system
2596  * Removes registry keys that reference this install location and for paths that
2597  * no longer exist. This uses SHCTX to determine the registry hive so you must
2598  * call SetShellVarContext first.
2600  * @param   _KEY
2601  *          The registry subkey (typically this will be Software\Mozilla).
2603  * XXXrstrong - there is the potential for Key: Software/Mozilla/AppName,
2604  * ValueName: CurrentVersion, ValueData: AppVersion to reference a key that is
2605  * no longer available due to this cleanup. This should be no worse than prior
2606  * to this reg cleanup since the referenced key would be for an app that is no
2607  * longer installed on the system.
2609  * $R1 = stores the long path to $INSTDIR
2610  * $R2 = return value from the stack from the GetParent and GetLongPath macros
2611  * $R3 = return value from the outer loop's EnumRegKey
2612  * $R4 = return value from the inner loop's EnumRegKey
2613  * $R5 = return value from ReadRegStr
2614  * $R6 = counter for the outer loop's EnumRegKey
2615  * $R7 = counter for the inner loop's EnumRegKey
2616  * $R8 = return value from the stack from the RemoveQuotesFromPath macro
2617  * $R9 = _KEY
2618  */
2619 !macro RegCleanMain
2621   !ifndef ${_MOZFUNC_UN}RegCleanMain
2622     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
2623     !insertmacro ${_MOZFUNC_UN_TMP}GetParent
2624     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
2625     !insertmacro ${_MOZFUNC_UN_TMP}RemoveQuotesFromPath
2626     !undef _MOZFUNC_UN
2627     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
2628     !undef _MOZFUNC_UN_TMP
2630     !verbose push
2631     !verbose ${_MOZFUNC_VERBOSE}
2632     !define ${_MOZFUNC_UN}RegCleanMain "!insertmacro ${_MOZFUNC_UN}RegCleanMainCall"
2634     Function ${_MOZFUNC_UN}RegCleanMain
2635       Exch $R9
2636       Push $R8
2637       Push $R7
2638       Push $R6
2639       Push $R5
2640       Push $R4
2641       Push $R3
2642       Push $R2
2643       Push $R1
2645       ${${_MOZFUNC_UN}GetLongPath} "$INSTDIR" $R1
2646       StrCpy $R6 0  ; set the counter for the outer loop to 0
2648       outerloop:
2649       EnumRegKey $R3 SHCTX $R9 $R6
2650       StrCmp $R3 "" end +1  ; if empty there are no more keys to enumerate
2651       IntOp $R6 $R6 + 1     ; increment the outer loop's counter
2652       ClearErrors
2653       ReadRegStr $R5 SHCTX "$R9\$R3\bin" "PathToExe"
2654       IfErrors 0 outercontinue
2655       StrCpy $R7 0  ; set the counter for the inner loop to 0
2657       innerloop:
2658       EnumRegKey $R4 SHCTX "$R9\$R3" $R7
2659       StrCmp $R4 "" outerloop +1  ; if empty there are no more keys to enumerate
2660       IntOp $R7 $R7 + 1  ; increment the inner loop's counter
2661       ClearErrors
2662       ReadRegStr $R5 SHCTX "$R9\$R3\$R4\Main" "PathToExe"
2663       IfErrors innerloop
2665       ${${_MOZFUNC_UN}RemoveQuotesFromPath} "$R5" $R8
2666       ${${_MOZFUNC_UN}GetParent} "$R8" $R2
2667       ${${_MOZFUNC_UN}GetLongPath} "$R2" $R2
2668       IfFileExists "$R2" +1 innerloop
2669       StrCmp "$R2" "$R1" +1 innerloop
2671       ClearErrors
2672       DeleteRegKey SHCTX "$R9\$R3\$R4"
2673       IfErrors innerloop
2674       IntOp $R7 $R7 - 1 ; decrement the inner loop's counter when the key is deleted successfully.
2675       ClearErrors
2676       DeleteRegKey /ifempty SHCTX "$R9\$R3"
2677       IfErrors innerloop outerdecrement
2679       outercontinue:
2680       ${${_MOZFUNC_UN}RemoveQuotesFromPath} "$R5" $R8
2681       ${${_MOZFUNC_UN}GetParent} "$R8" $R2
2682       ${${_MOZFUNC_UN}GetLongPath} "$R2" $R2
2683       IfFileExists "$R2" +1 outerloop
2684       StrCmp "$R2" "$R1" +1 outerloop
2686       ClearErrors
2687       DeleteRegKey SHCTX "$R9\$R3"
2688       IfErrors outerloop
2690       outerdecrement:
2691       IntOp $R6 $R6 - 1 ; decrement the outer loop's counter when the key is deleted successfully.
2692       GoTo outerloop
2694       end:
2695       ClearErrors
2697       Pop $R1
2698       Pop $R2
2699       Pop $R3
2700       Pop $R4
2701       Pop $R5
2702       Pop $R6
2703       Pop $R7
2704       Pop $R8
2705       Exch $R9
2706     FunctionEnd
2708     !verbose pop
2709   !endif
2710 !macroend
2712 !macro RegCleanMainCall _KEY
2713   !verbose push
2714   !verbose ${_MOZFUNC_VERBOSE}
2715   Push "${_KEY}"
2716   Call RegCleanMain
2717   !verbose pop
2718 !macroend
2720 !macro un.RegCleanMainCall _KEY
2721   !verbose push
2722   !verbose ${_MOZFUNC_VERBOSE}
2723   Push "${_KEY}"
2724   Call un.RegCleanMain
2725   !verbose pop
2726 !macroend
2728 !macro un.RegCleanMain
2729   !ifndef un.RegCleanMain
2730     !verbose push
2731     !verbose ${_MOZFUNC_VERBOSE}
2732     !undef _MOZFUNC_UN
2733     !define _MOZFUNC_UN "un."
2735     !insertmacro RegCleanMain
2737     !undef _MOZFUNC_UN
2738     !define _MOZFUNC_UN
2739     !verbose pop
2740   !endif
2741 !macroend
2744  * Removes all registry keys from \Software\Windows\CurrentVersion\Uninstall
2745  * that reference this install location. This uses SHCTX to determine the
2746  * registry hive so you must call SetShellVarContext first.
2748  * $R4 = stores the long path to $INSTDIR
2749  * $R5 = return value from ReadRegStr
2750  * $R6 = string for the base reg key (e.g. Software\Microsoft\Windows\CurrentVersion\Uninstall)
2751  * $R7 = return value from EnumRegKey
2752  * $R8 = counter for EnumRegKey
2753  * $R9 = return value from the stack from the RemoveQuotesFromPath and GetLongPath macros
2754  */
2755 !macro RegCleanUninstall
2757   !ifndef ${_MOZFUNC_UN}RegCleanUninstall
2758     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
2759     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
2760     !insertmacro ${_MOZFUNC_UN_TMP}RemoveQuotesFromPath
2761     !undef _MOZFUNC_UN
2762     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
2763     !undef _MOZFUNC_UN_TMP
2765     !verbose push
2766     !verbose ${_MOZFUNC_VERBOSE}
2767     !define ${_MOZFUNC_UN}RegCleanUninstall "!insertmacro ${_MOZFUNC_UN}RegCleanUninstallCall"
2769     Function ${_MOZFUNC_UN}RegCleanUninstall
2770       Push $R9
2771       Push $R8
2772       Push $R7
2773       Push $R6
2774       Push $R5
2775       Push $R4
2777       ${${_MOZFUNC_UN}GetLongPath} "$INSTDIR" $R4
2778       StrCpy $R6 "Software\Microsoft\Windows\CurrentVersion\Uninstall"
2779       StrCpy $R7 ""
2780       StrCpy $R8 0
2782       loop:
2783       EnumRegKey $R7 SHCTX $R6 $R8
2784       StrCmp $R7 "" end +1
2785       IntOp $R8 $R8 + 1 ; Increment the counter
2786       ClearErrors
2787       ReadRegStr $R5 SHCTX "$R6\$R7" "InstallLocation"
2788       IfErrors loop
2789       ${${_MOZFUNC_UN}RemoveQuotesFromPath} "$R5" $R9
2790       ${${_MOZFUNC_UN}GetLongPath} "$R9" $R9
2791       StrCmp "$R9" "$R4" +1 loop
2792       ClearErrors
2793       DeleteRegKey SHCTX "$R6\$R7"
2794       IfErrors loop
2795       IntOp $R8 $R8 - 1 ; Decrement the counter on successful deletion
2796       GoTo loop
2798       end:
2799       ClearErrors
2801       Pop $R4
2802       Pop $R5
2803       Pop $R6
2804       Pop $R7
2805       Pop $R8
2806       Pop $R9
2807     FunctionEnd
2809     !verbose pop
2810   !endif
2811 !macroend
2813 !macro RegCleanUninstallCall
2814   !verbose push
2815   !verbose ${_MOZFUNC_VERBOSE}
2816   Call RegCleanUninstall
2817   !verbose pop
2818 !macroend
2820 !macro un.RegCleanUninstallCall
2821   !verbose push
2822   !verbose ${_MOZFUNC_VERBOSE}
2823   Call un.RegCleanUninstall
2824   !verbose pop
2825 !macroend
2827 !macro un.RegCleanUninstall
2828   !ifndef un.RegCleanUninstall
2829     !verbose push
2830     !verbose ${_MOZFUNC_VERBOSE}
2831     !undef _MOZFUNC_UN
2832     !define _MOZFUNC_UN "un."
2834     !insertmacro RegCleanUninstall
2836     !undef _MOZFUNC_UN
2837     !define _MOZFUNC_UN
2838     !verbose pop
2839   !endif
2840 !macroend
2843  * Removes an application specific handler registry key under Software\Classes
2844  * for both HKCU and HKLM when its open command refers to this install
2845  * location or the install location doesn't exist.
2847  * @param   _HANDLER_NAME
2848  *          The registry name for the handler.
2850  * $R7 = stores the long path to the $INSTDIR
2851  * $R8 = stores the path to the open command's parent directory
2852  * $R9 = _HANDLER_NAME
2853  */
2854 !macro RegCleanAppHandler
2856   !ifndef ${_MOZFUNC_UN}RegCleanAppHandler
2857     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
2858     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
2859     !insertmacro ${_MOZFUNC_UN_TMP}GetParent
2860     !insertmacro ${_MOZFUNC_UN_TMP}GetPathFromString
2861     !undef _MOZFUNC_UN
2862     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
2863     !undef _MOZFUNC_UN_TMP
2865     !verbose push
2866     !verbose ${_MOZFUNC_VERBOSE}
2867     !define ${_MOZFUNC_UN}RegCleanAppHandler "!insertmacro ${_MOZFUNC_UN}RegCleanAppHandlerCall"
2869     Function ${_MOZFUNC_UN}RegCleanAppHandler
2870       Exch $R9
2871       Push $R8
2872       Push $R7
2874       ClearErrors
2875       ReadRegStr $R8 HKCU "Software\Classes\$R9\shell\open\command" ""
2876       IfErrors next +1
2877       ${${_MOZFUNC_UN}GetPathFromString} "$R8" $R8
2878       ${${_MOZFUNC_UN}GetParent} "$R8" $R8
2879       IfFileExists "$R8" +3 +1
2880       DeleteRegKey HKCU "Software\Classes\$R9"
2881       GoTo next
2883       ${${_MOZFUNC_UN}GetLongPath} "$R8" $R8
2884       ${${_MOZFUNC_UN}GetLongPath} "$INSTDIR" $R7
2885       StrCmp "$R7" "$R8" +1 next
2886       DeleteRegKey HKCU "Software\Classes\$R9"
2888       next:
2889       ReadRegStr $R8 HKLM "Software\Classes\$R9\shell\open\command" ""
2890       IfErrors end
2891       ${${_MOZFUNC_UN}GetPathFromString} "$R8" $R8
2892       ${${_MOZFUNC_UN}GetParent} "$R8" $R8
2893       IfFileExists "$R8" +3 +1
2894       DeleteRegKey HKLM "Software\Classes\$R9"
2895       GoTo end
2897       ${${_MOZFUNC_UN}GetLongPath} "$R8" $R8
2898       ${${_MOZFUNC_UN}GetLongPath} "$INSTDIR" $R7
2899       StrCmp "$R7" "$R8" +1 end
2900       DeleteRegKey HKLM "Software\Classes\$R9"
2902       end:
2904       Pop $R7
2905       Pop $R8
2906       Exch $R9
2907     FunctionEnd
2909     !verbose pop
2910   !endif
2911 !macroend
2913 !macro RegCleanAppHandlerCall _HANDLER_NAME
2914   !verbose push
2915   !verbose ${_MOZFUNC_VERBOSE}
2916   Push "${_HANDLER_NAME}"
2917   Call RegCleanAppHandler
2918   !verbose pop
2919 !macroend
2921 !macro un.RegCleanAppHandlerCall _HANDLER_NAME
2922   !verbose push
2923   !verbose ${_MOZFUNC_VERBOSE}
2924   Push "${_HANDLER_NAME}"
2925   Call un.RegCleanAppHandler
2926   !verbose pop
2927 !macroend
2929 !macro un.RegCleanAppHandler
2930   !ifndef un.RegCleanAppHandler
2931     !verbose push
2932     !verbose ${_MOZFUNC_VERBOSE}
2933     !undef _MOZFUNC_UN
2934     !define _MOZFUNC_UN "un."
2936     !insertmacro RegCleanAppHandler
2938     !undef _MOZFUNC_UN
2939     !define _MOZFUNC_UN
2940     !verbose pop
2941   !endif
2942 !macroend
2945  * Cleans up the registry for a protocol handler when its open command
2946  * refers to this install location. For HKCU the registry key is deleted
2947  * and for HKLM the values set by the application are deleted.
2949  * @param   _HANDLER_NAME
2950  *          The registry name for the handler.
2952  * $R7 = stores the long path to $INSTDIR
2953  * $R8 = stores the the long path to the open command's parent directory
2954  * $R9 = _HANDLER_NAME
2955  */
2956 !macro un.RegCleanProtocolHandler
2958   !ifndef un.RegCleanProtocolHandler
2959     !insertmacro un.GetLongPath
2960     !insertmacro un.GetParent
2961     !insertmacro un.GetPathFromString
2963     !verbose push
2964     !verbose ${_MOZFUNC_VERBOSE}
2965     !define un.RegCleanProtocolHandler "!insertmacro un.RegCleanProtocolHandlerCall"
2967     Function un.RegCleanProtocolHandler
2968       Exch $R9
2969       Push $R8
2970       Push $R7
2972       ReadRegStr $R8 HKCU "Software\Classes\$R9\shell\open\command" ""
2973       ${un.GetLongPath} "$INSTDIR" $R7
2975       StrCmp "$R8" "" next +1
2976       ${un.GetPathFromString} "$R8" $R8
2977       ${un.GetParent} "$R8" $R8
2978       ${un.GetLongPath} "$R8" $R8
2979       StrCmp "$R7" "$R8" +1 next
2980       DeleteRegKey HKCU "Software\Classes\$R9"
2982       next:
2983       ReadRegStr $R8 HKLM "Software\Classes\$R9\shell\open\command" ""
2984       StrCmp "$R8" "" end +1
2985       ${un.GetLongPath} "$INSTDIR" $R7
2986       ${un.GetPathFromString} "$R8" $R8
2987       ${un.GetParent} "$R8" $R8
2988       ${un.GetLongPath} "$R8" $R8
2989       StrCmp "$R7" "$R8" +1 end
2990       DeleteRegValue HKLM "Software\Classes\$R9\DefaultIcon" ""
2991       DeleteRegValue HKLM "Software\Classes\$R9\shell\open" ""
2992       DeleteRegValue HKLM "Software\Classes\$R9\shell\ddeexec" ""
2993       DeleteRegValue HKLM "Software\Classes\$R9\shell\ddeexec\Application" ""
2994       DeleteRegValue HKLM "Software\Classes\$R9\shell\ddeexec\Topic" ""
2996       end:
2998       Pop $R7
2999       Pop $R8
3000       Exch $R9
3001     FunctionEnd
3003     !verbose pop
3004   !endif
3005 !macroend
3007 !macro un.RegCleanProtocolHandlerCall _HANDLER_NAME
3008   !verbose push
3009   !verbose ${_MOZFUNC_VERBOSE}
3010   Push "${_HANDLER_NAME}"
3011   Call un.RegCleanProtocolHandler
3012   !verbose pop
3013 !macroend
3016  * Cleans up the registry for a file handler when the passed in value equals
3017  * the default value for the file handler. For HKCU the registry key is deleted
3018  * and for HKLM the default value is deleted.
3020  * @param   _HANDLER_NAME
3021  *          The registry name for the handler.
3022  * @param   _DEFAULT_VALUE
3023  *          The value to check for against the handler's default value.
3025  * $R6 = stores the long path to $INSTDIR
3026  * $R7 = _DEFAULT_VALUE
3027  * $R9 = _HANDLER_NAME
3028  */
3029 !macro RegCleanFileHandler
3031   !ifndef ${_MOZFUNC_UN}RegCleanFileHandler
3032     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
3033     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
3034     !insertmacro ${_MOZFUNC_UN_TMP}GetParent
3035     !insertmacro ${_MOZFUNC_UN_TMP}GetPathFromString
3036     !undef _MOZFUNC_UN
3037     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
3038     !undef _MOZFUNC_UN_TMP
3040     !verbose push
3041     !verbose ${_MOZFUNC_VERBOSE}
3042     !define ${_MOZFUNC_UN}RegCleanFileHandler "!insertmacro ${_MOZFUNC_UN}RegCleanFileHandlerCall"
3044     Function ${_MOZFUNC_UN}RegCleanFileHandler
3045       Exch $R9
3046       Exch 1
3047       Exch $R8
3048       Push $R7
3050       ReadRegStr $R7 HKCU "Software\Classes\$R9" ""
3051       StrCmp "$R7" "$R8" +1 +2
3052       DeleteRegKey HKCU "Software\Classes\$R9"
3054       ReadRegStr $R7 HKLM "Software\Classes\$R9" ""
3055       StrCmp "$R7" "$R8" +1 +2
3056       DeleteRegValue HKLM "Software\Classes\$R9" ""
3058       ClearErrors
3060       Pop $R7
3061       Exch $R8
3062       Exch 1
3063       Exch $R9
3064     FunctionEnd
3066     !verbose pop
3067   !endif
3068 !macroend
3070 !macro RegCleanFileHandlerCall _HANDLER_NAME _DEFAULT_VALUE
3071   !verbose push
3072   !verbose ${_MOZFUNC_VERBOSE}
3073   Push "${_DEFAULT_VALUE}"
3074   Push "${_HANDLER_NAME}"
3075   Call RegCleanFileHandler
3076   !verbose pop
3077 !macroend
3079 !macro un.RegCleanFileHandlerCall _HANDLER_NAME _DEFAULT_VALUE
3080   !verbose push
3081   !verbose ${_MOZFUNC_VERBOSE}
3082   Push "${_DEFAULT_VALUE}"
3083   Push "${_HANDLER_NAME}"
3084   Call un.RegCleanFileHandler
3085   !verbose pop
3086 !macroend
3088 !macro un.RegCleanFileHandler
3089   !ifndef un.RegCleanFileHandler
3090     !verbose push
3091     !verbose ${_MOZFUNC_VERBOSE}
3092     !undef _MOZFUNC_UN
3093     !define _MOZFUNC_UN "un."
3095     !insertmacro RegCleanFileHandler
3097     !undef _MOZFUNC_UN
3098     !define _MOZFUNC_UN
3099     !verbose pop
3100   !endif
3101 !macroend
3104  * Checks if a handler's open command points to this installation directory.
3105  * Uses SHCTX to determine the registry hive (e.g. HKLM or HKCU) to check.
3107  * @param   _HANDLER_NAME
3108  *          The registry name for the handler.
3109  * @param   _RESULT
3110  *          true if it is the handler's open command points to this
3111  *          installation directory and false if it does not.
3113  * $R7 = stores the value of the open command and the path macros return values
3114  * $R8 = stores the handler's registry key name
3115  * $R9 = _DEFAULT_VALUE and _RESULT
3116  */
3117 !macro IsHandlerForInstallDir
3119   !ifndef ${_MOZFUNC_UN}IsHandlerForInstallDir
3120     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
3121     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
3122     !insertmacro ${_MOZFUNC_UN_TMP}GetParent
3123     !insertmacro ${_MOZFUNC_UN_TMP}GetPathFromString
3124     !undef _MOZFUNC_UN
3125     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
3126     !undef _MOZFUNC_UN_TMP
3128     !verbose push
3129     !verbose ${_MOZFUNC_VERBOSE}
3130     !define ${_MOZFUNC_UN}IsHandlerForInstallDir "!insertmacro ${_MOZFUNC_UN}IsHandlerForInstallDirCall"
3132     Function ${_MOZFUNC_UN}IsHandlerForInstallDir
3133       Exch $R9
3134       Push $R8
3135       Push $R7
3137       StrCpy $R8 "$R9"
3138       StrCpy $R9 "false"
3139       ReadRegStr $R7 SHCTX "Software\Classes\$R8\shell\open\command" ""
3140       StrCmp "$R7" "" end
3142       ${GetPathFromString} "$R7" $R7
3143       ${GetParent} "$R7" $R7
3144       ${GetLongPath} "$R7" $R7
3145       StrCmp "$R7" "$INSTDIR" +1 end
3146       StrCpy $R9 "true"
3148       end:
3149       ClearErrors
3151       Pop $R7
3152       Pop $R8
3153       Exch $R9
3154     FunctionEnd
3156     !verbose pop
3157   !endif
3158 !macroend
3160 !macro IsHandlerForInstallDirCall _HANDLER_NAME _RESULT
3161   !verbose push
3162   !verbose ${_MOZFUNC_VERBOSE}
3163   Push "${_HANDLER_NAME}"
3164   Call IsHandlerForInstallDir
3165   Pop "${_RESULT}"
3166   !verbose pop
3167 !macroend
3169 !macro un.IsHandlerForInstallDirCall _HANDLER_NAME _RESULT
3170   !verbose push
3171   !verbose ${_MOZFUNC_VERBOSE}
3172   Push "${_HANDLER_NAME}"
3173   Call un.IsHandlerForInstallDir
3174   Pop "${_RESULT}"
3175   !verbose pop
3176 !macroend
3178 !macro un.IsHandlerForInstallDir
3179   !ifndef un.IsHandlerForInstallDir
3180     !verbose push
3181     !verbose ${_MOZFUNC_VERBOSE}
3182     !undef _MOZFUNC_UN
3183     !define _MOZFUNC_UN "un."
3185     !insertmacro IsHandlerForInstallDir
3187     !undef _MOZFUNC_UN
3188     !define _MOZFUNC_UN
3189     !verbose pop
3190   !endif
3191 !macroend
3194  * If present removes the VirtualStore directory for this installation. Uses the
3195  * program files directory path and the current install location to determine
3196  * the sub-directory in the VirtualStore directory.
3198  * $R5 = various path values.
3199  * $R6 = length of the long path to $PROGRAMFILES
3200  * $R7 = length of the long path to $INSTDIR
3201  * $R8 = long path to $PROGRAMFILES
3202  * $R9 = long path to $INSTDIR
3203  */
3204 !macro CleanVirtualStore
3206   !ifndef ${_MOZFUNC_UN}CleanVirtualStore
3207     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
3208     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
3209     !undef _MOZFUNC_UN
3210     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
3211     !undef _MOZFUNC_UN_TMP
3213     !verbose push
3214     !verbose ${_MOZFUNC_VERBOSE}
3215     !define ${_MOZFUNC_UN}CleanVirtualStore "!insertmacro ${_MOZFUNC_UN}CleanVirtualStoreCall"
3217     Function ${_MOZFUNC_UN}CleanVirtualStore
3218       Push $R9
3219       Push $R8
3220       Push $R7
3221       Push $R6
3222       Push $R5
3224       ${${_MOZFUNC_UN}GetLongPath} "$INSTDIR" $R9
3225       StrCmp $R9 "" end +1
3226       ${${_MOZFUNC_UN}GetLongPath} "$PROGRAMFILES" $R8
3227       StrCmp $R8 "" end +1
3229       StrLen $R7 "$R9"
3230       StrLen $R6 "$R8"
3231       ; Only continue If the length of $INSTDIR is greater than the length of
3232       ; $PROGRAMFILES
3233       IntCmp $R7 $R6 end end +1
3235       ; Copy from the start of $INSTDIR the length of $PROGRAMFILES 
3236       StrCpy $R5 "$R9" $R6
3237       StrCmp "$R5" "$R8" +1 end ; Check if $INSTDIR is under $PROGRAMFILES
3239       ; Remove the drive letter and colon from the $INSTDIR long path
3240       StrCpy $R5 "$R9" "" 2
3241       StrCpy $R5 "$PROFILE\AppData\Local\VirtualStore$R5"
3242       ${${_MOZFUNC_UN}GetLongPath} "$R5" $R5
3243       StrCmp $R5 "" end +1
3245       IfFileExists "$R5" +1 end
3246       RmDir /r "$R5"
3248       end:
3249       ClearErrors
3251       Pop $R5
3252       Pop $R6
3253       Pop $R7
3254       Pop $R8
3255       Pop $R9
3256     FunctionEnd
3258     !verbose pop
3259   !endif
3260 !macroend
3262 !macro CleanVirtualStoreCall
3263   !verbose push
3264   !verbose ${_MOZFUNC_VERBOSE}
3265   Call CleanVirtualStore
3266   !verbose pop
3267 !macroend
3269 !macro un.CleanVirtualStoreCall
3270   !verbose push
3271   !verbose ${_MOZFUNC_VERBOSE}
3272   Call un.CleanVirtualStore
3273   !verbose pop
3274 !macroend
3276 !macro un.CleanVirtualStore
3277   !ifndef un.CleanVirtualStore
3278     !verbose push
3279     !verbose ${_MOZFUNC_VERBOSE}
3280     !undef _MOZFUNC_UN
3281     !define _MOZFUNC_UN "un."
3283     !insertmacro CleanVirtualStore
3285     !undef _MOZFUNC_UN
3286     !define _MOZFUNC_UN
3287     !verbose pop
3288   !endif
3289 !macroend
3292  * If present removes the updates directory located in the profile's local
3293  * directory for this installation.
3295  * @param   _REL_PROFILE_PATH
3296  *          The relative path to the profile directory from $LOCALAPPDATA.
3298  * $R4 = various path values.
3299  * $R5 = length of the long path to $PROGRAMFILES
3300  * $R6 = length of the long path to $INSTDIR
3301  * $R7 = long path to $PROGRAMFILES
3302  * $R8 = long path to $INSTDIR
3303  * $R9 = _REL_PROFILE_PATH
3304  */
3305 !macro CleanUpdatesDir
3307   !ifndef ${_MOZFUNC_UN}CleanUpdatesDir
3308     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
3309     !insertmacro ${_MOZFUNC_UN_TMP}GetLongPath
3310     !undef _MOZFUNC_UN
3311     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
3312     !undef _MOZFUNC_UN_TMP
3314     !verbose push
3315     !verbose ${_MOZFUNC_VERBOSE}
3316     !define ${_MOZFUNC_UN}CleanUpdatesDir "!insertmacro ${_MOZFUNC_UN}CleanUpdatesDirCall"
3318     Function ${_MOZFUNC_UN}CleanUpdatesDir
3319       Exch $R9
3320       Push $R8
3321       Push $R7
3322       Push $R6
3323       Push $R5
3324       Push $R4
3326       StrCmp $R9 "" end +1 ; The relative path to the app's profiles is required
3327       ${${_MOZFUNC_UN}GetLongPath} "$INSTDIR" $R8
3328       StrCmp $R8 "" end +1
3329       ${${_MOZFUNC_UN}GetLongPath} "$PROGRAMFILES" $R7
3330       StrCmp $R7 "" end +1
3332       StrLen $R6 "$R8"
3333       StrLen $R5 "$R7"
3334       ; Only continue If the length of $INSTDIR is greater than the length of
3335       ; $PROGRAMFILES
3336       IntCmp $R6 $R5 end end +1
3338       ; Copy from the start of $INSTDIR the length of $PROGRAMFILES 
3339       StrCpy $R4 "$R8" $R5
3340       StrCmp "$R4" "$R7" +1 end ; Check if $INSTDIR is under $PROGRAMFILES
3342       ; Copy the relative path to $INSTDIR from $PROGRAMFILES
3343       StrCpy $R4 "$R8" "" $R5
3345       ; Concatenate the path to $LOCALAPPDATA the relative profile path and the
3346       ; relative path to $INSTDIR from $PROGRAMFILES
3347       StrCpy $R4 "$LOCALAPPDATA\$R9$R4"
3348       ${${_MOZFUNC_UN}GetLongPath} "$R4" $R4
3349       StrCmp $R4 "" end +1
3351       IfFileExists "$R4\updates" +1 end
3352       RmDir /r "$R4"
3354       end:
3355       ClearErrors
3357       Pop $R4
3358       Pop $R5
3359       Pop $R6
3360       Pop $R7
3361       Pop $R8
3362       Exch $R9
3363     FunctionEnd
3365     !verbose pop
3366   !endif
3367 !macroend
3369 !macro CleanUpdatesDirCall _REL_PROFILE_PATH
3370   !verbose push
3371   !verbose ${_MOZFUNC_VERBOSE}
3372   Push "${_REL_PROFILE_PATH}"
3373   Call CleanUpdatesDir
3374   !verbose pop
3375 !macroend
3377 !macro un.CleanUpdatesDirCall _REL_PROFILE_PATH
3378   !verbose push
3379   !verbose ${_MOZFUNC_VERBOSE}
3380   Push "${_REL_PROFILE_PATH}"
3381   Call un.CleanUpdatesDir
3382   !verbose pop
3383 !macroend
3385 !macro un.CleanUpdatesDir
3386   !ifndef un.CleanUpdatesDir
3387     !verbose push
3388     !verbose ${_MOZFUNC_VERBOSE}
3389     !undef _MOZFUNC_UN
3390     !define _MOZFUNC_UN "un."
3392     !insertmacro CleanUpdatesDir
3394     !undef _MOZFUNC_UN
3395     !define _MOZFUNC_UN
3396     !verbose pop
3397   !endif
3398 !macroend
3401  * Deletes all relative profiles specified in an application's profiles.ini and
3402  * performs various other cleanup.
3404  * @param   _REL_PROFILE_PATH
3405  *          The relative path to the profile directory.
3407  * $R6 = value of IsRelative read from profiles.ini
3408  * $R7 = value of Path to profile read from profiles.ini
3409  * $R8 = counter for reading profiles (e.g. Profile0, Profile1, etc.)
3410  * $R9 = _REL_PROFILE_PATH
3411  */
3412 !macro DeleteRelativeProfiles
3414   !ifndef ${_MOZFUNC_UN}DeleteRelativeProfiles
3415     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
3416     !insertmacro ${_MOZFUNC_UN_TMP}WordReplace
3417     !undef _MOZFUNC_UN
3418     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
3419     !undef _MOZFUNC_UN_TMP
3421     !verbose push
3422     !verbose ${_MOZFUNC_VERBOSE}
3423     !define ${_MOZFUNC_UN}DeleteRelativeProfiles "!insertmacro ${_MOZFUNC_UN}DeleteRelativeProfilesCall"
3425     Function ${_MOZFUNC_UN}DeleteRelativeProfiles
3426       Exch $R9
3427       Push $R8
3428       Push $R7
3429       Push $R6
3431       SetShellVarContext current
3432       StrCpy $R8 -1
3434       loop:
3435       IntOp $R8 $R8 + 1  ; Increment the counter.
3436       ReadINIStr $R7 "$APPDATA\$R9\profiles.ini" "Profile$R8" "Path"
3437       IfErrors end +1
3439       ; Only remove relative profiles
3440       ReadINIStr $R6 "$APPDATA\$R9\profiles.ini" "Profile$R8" "IsRelative"
3441       StrCmp "$R6" "1" +1 loop
3443       ; Relative paths in profiles.ini use / as a separator
3444       ${${_MOZFUNC_UN}WordReplace} "$R7" "/" "\" "+" $R7
3446       IfFileExists "$LOCALAPPDATA\$R9\$R7" +1 +2
3447       RmDir /r "$LOCALAPPDATA\$R9\$R7"
3448       IfFileExists "$APPDATA\$R9\$R7" +1 +2
3449       RmDir /r "$APPDATA\$R9\$R7"
3450       GoTo loop
3452       end:
3453       ; Remove profiles directory under LOCALAPPDATA (e.g. cache, etc.) since
3454       ; they are at times abandoned.
3455       RmDir /r "$LOCALAPPDATA\$R9\Profiles"
3456       RmDir /r "$APPDATA\$R9\Crash Reports"
3457       Delete "$APPDATA\$R9\profiles.ini"
3458       Delete "$APPDATA\$R9\console.log"
3459       Delete "$APPDATA\$R9\pluginreg.dat"
3460       RmDir "$APPDATA\$R9\Profiles"
3461       RmDir "$APPDATA\$R9"
3463       Pop $R6
3464       Pop $R7
3465       Pop $R8
3466       Exch $R9
3467     FunctionEnd
3469     !verbose pop
3470   !endif
3471 !macroend
3473 !macro DeleteRelativeProfilesCall _REL_PROFILE_PATH
3474   !verbose push
3475   !verbose ${_MOZFUNC_VERBOSE}
3476   Push "${_REL_PROFILE_PATH}"
3477   Call DeleteRelativeProfiles
3478   !verbose pop
3479 !macroend
3481 !macro un.DeleteRelativeProfilesCall _REL_PROFILE_PATH
3482   !verbose push
3483   !verbose ${_MOZFUNC_VERBOSE}
3484   Push "${_REL_PROFILE_PATH}"
3485   Call un.DeleteRelativeProfiles
3486   !verbose pop
3487 !macroend
3489 !macro un.DeleteRelativeProfiles
3490   !ifndef un.DeleteRelativeProfiles
3491     !verbose push
3492     !verbose ${_MOZFUNC_VERBOSE}
3493     !undef _MOZFUNC_UN
3494     !define _MOZFUNC_UN "un."
3496     !insertmacro DeleteRelativeProfiles
3498     !undef _MOZFUNC_UN
3499     !define _MOZFUNC_UN
3500     !verbose pop
3501   !endif
3502 !macroend
3505 ################################################################################
3506 # Macros for parsing and updating the uninstall.log and removed-files.log
3509  * Updates the uninstall.log with new files added by software update.
3511  * When modifying this macro be aware that LineFind uses all registers except
3512  * $R0-$R3 so be cautious. Callers of this macro are not affected.
3513  */
3514 !macro UpdateUninstallLog
3516   !ifndef UpdateUninstallLog
3517     !insertmacro FileJoin
3518     !insertmacro LineFind
3519     !insertmacro TextCompareNoDetails
3520     !insertmacro TrimNewLines
3522     !verbose push
3523     !verbose ${_MOZFUNC_VERBOSE}
3524     !define UpdateUninstallLog "!insertmacro UpdateUninstallLogCall"
3526     Function UpdateUninstallLog
3527       Push $R3
3528       Push $R2
3529       Push $R1
3530       Push $R0
3532       ClearErrors
3534       GetFullPathName $R3 "$INSTDIR\uninstall"
3535       IfFileExists "$R3\uninstall.update" +2 0
3536       Return
3538       ${LineFind} "$R3\uninstall.update" "" "1:-1" "CleanupUpdateLog"
3540       GetTempFileName $R2 "$R3"
3541       FileOpen $R1 $R2 w
3542       ${TextCompareNoDetails} "$R3\uninstall.update" "$R3\uninstall.log" "SlowDiff" "CreateUpdateDiff"
3543       FileClose $R1
3545       IfErrors +2 0
3546       ${FileJoin} "$R3\uninstall.log" "$R2" "$R3\uninstall.log"
3548       ${DeleteFile} "$R2"
3550       ClearErrors
3552       Pop $R0
3553       Pop $R1
3554       Pop $R2
3555       Pop $R3
3556     FunctionEnd
3558     ; This callback MUST use labels vs. relative line numbers.
3559     Function CleanupUpdateLog
3560       StrCpy $R2 "$R9" 12
3561       StrCmp "$R2" "EXECUTE ADD " +1 skip
3562       StrCpy $R9 "$R9" "" 12
3564       Push $R6
3565       Push $R5
3566       Push $R4
3567       StrCpy $R4 ""         ; Initialize to an empty string.
3568       StrCpy $R6 -1         ; Set the counter to -1 so it will start at 0.
3570       loop:
3571       IntOp $R6 $R6 + 1     ; Increment the counter.
3572       StrCpy $R5 $R9 1 $R6  ; Starting from the counter copy the next char.
3573       StrCmp $R5 "" copy    ; Are there no more chars?
3574       StrCmp $R5 "/" +1 +2  ; Is the char a /?
3575       StrCpy $R5 "\"        ; Replace the char with a \.
3577       StrCpy $R4 "$R4$R5"
3578       GoTo loop
3580       copy:
3581       StrCpy $R9 "File: \$R4"
3582       Pop $R6
3583       Pop $R5
3584       Pop $R4
3585       GoTo end
3587       skip:
3588       StrCpy $0 "SkipWrite"
3590       end:
3591       Push $0
3592     FunctionEnd
3594     Function CreateUpdateDiff
3595       ${TrimNewLines} "$9" $9
3596       StrCmp $9 "" +2 +1
3597       FileWrite $R1 "$9$\r$\n"
3599       Push 0
3600     FunctionEnd
3602     !verbose pop
3603   !endif
3604 !macroend
3606 !macro UpdateUninstallLogCall
3607   !verbose push
3608   !verbose ${_MOZFUNC_VERBOSE}
3609   Call UpdateUninstallLog
3610   !verbose pop
3611 !macroend
3614  * Updates the uninstall.log with entries from uninstall.bak. The uninstall.bak
3615  * is the uninstall.log renamed to uninstall.bak at the beginning of the
3616  * installation
3618  * When modifying this macro be aware that LineFind uses all registers except
3619  * $R0-$R3 so be cautious. Callers of this macro are not affected.
3620  */
3621 !macro UpdateFromPreviousLog
3623   !ifndef UpdateFromPreviousLog
3624     !insertmacro FileJoin
3625     !insertmacro GetTime
3626     !insertmacro TextCompareNoDetails
3627     !insertmacro TrimNewLines
3629     !verbose push
3630     !verbose ${_MOZFUNC_VERBOSE}
3631     !define UpdateFromPreviousLog "!insertmacro UpdateFromPreviousLogCall"
3633     Function UpdateFromPreviousLog
3634       Push $R9
3635       Push $R8
3636       Push $R7
3637       Push $R6
3638       Push $R5
3639       Push $R4
3640       Push $R3
3641       Push $R2
3642       Push $R1
3643       Push $R0
3644       Push $9
3646       ; Diff and add missing entries from the previous file log if it exists
3647       IfFileExists "$INSTDIR\uninstall\uninstall.bak" +1 end
3648       StrCpy $R0 "$INSTDIR\uninstall\uninstall.log"
3649       StrCpy $R1 "$INSTDIR\uninstall\uninstall.bak"
3650       GetTempFileName $R2
3651       FileOpen $R3 $R2 w
3652       ${TextCompareNoDetails} "$R1" "$R0" "SlowDiff" "UpdateFromPreviousLog_AddToLog"
3653       FileClose $R3
3654       IfErrors +2
3655       ${FileJoin} "$INSTDIR\uninstall\uninstall.log" "$R2" "$INSTDIR\uninstall\uninstall.log"
3657       ${DeleteFile} "$INSTDIR\uninstall\uninstall.bak"
3658       ${DeleteFile} "$R2"
3660       end:
3662       Pop $9
3663       Pop $R0
3664       Pop $R1
3665       Pop $R2
3666       Pop $R3
3667       Pop $R4
3668       Pop $R5
3669       Pop $R6
3670       Pop $R7
3671       Pop $R8
3672       Push $R9
3673     FunctionEnd
3675     Function UpdateFromPreviousLog_AddToLog
3676       ${TrimNewLines} "$9" $9
3677       StrCmp $9 "" end +1
3678       FileWrite $R3 "$9$\r$\n"
3679       ${LogMsg} "Added To Uninstall Log: $9"
3681       end:
3682       Push 0
3683     FunctionEnd
3685     !verbose pop
3686   !endif
3687 !macroend
3689 !macro UpdateFromPreviousLogCall
3690   !verbose push
3691   !verbose ${_MOZFUNC_VERBOSE}
3692   Call UpdateFromPreviousLog
3693   !verbose pop
3694 !macroend
3697  * Parses the removed-files.log to remove files, and directories prior to
3698  * installing.
3700  * When modifying this macro be aware that LineFind uses all registers except
3701  * $R0-$R3 so be cautious. Callers of this macro are not affected.
3702  */
3703 !macro ParseRemovedFilesLog
3705   !ifndef ParseRemovedFilesLog
3706     !insertmacro LineFind
3707     !insertmacro TrimNewLines
3709     !verbose push
3710     !verbose ${_MOZFUNC_VERBOSE}
3711     !define ParseRemovedFilesLog "!insertmacro ParseRemovedFilesLogCall"
3713     Function ParseRemovedFilesLog
3714       Push $R9
3715       Push $R8
3716       Push $R7
3717       Push $R6
3718       Push $R5
3719       Push $R4
3720       Push $R3
3721       Push $R2
3722       Push $R1
3723       Push $R0
3725       IfFileExists "$EXEDIR\removed-files.log" +1 end
3726       ${LogHeader} "Removing Obsolete Files and Directories"
3727       ${LineFind} "$EXEDIR\removed-files.log" "/NUL" "1:-1" "ParseRemovedFilesLog_RemoveFile"
3728       ${LineFind} "$EXEDIR\removed-files.log" "/NUL" "1:-1" "ParseRemovedFilesLog_RemoveDir"
3730       end:
3732       Pop $R0
3733       Pop $R1
3734       Pop $R2
3735       Pop $R3
3736       Pop $R4
3737       Pop $R5
3738       Pop $R6
3739       Pop $R7
3740       Pop $R8
3741       Pop $R9
3742     FunctionEnd
3744     Function ParseRemovedFilesLog_RemoveFile
3745       ${TrimNewLines} "$R9" $R9
3746       StrCpy $R1 "$R9" 5
3748       StrCmp $R1 "File:" +1 end
3749       StrCpy $R9 "$R9" "" 6
3750       IfFileExists "$INSTDIR$R9" +1 end
3752       ClearErrors
3753       ${DeleteFile} "$INSTDIR$R9"
3754       IfErrors +3 +1
3755       ${LogMsg} "Deleted File: $INSTDIR$R9"
3756       GoTo end
3758       ClearErrors
3759       Rename "$INSTDIR$R9" "$INSTDIR$R9.moz-delete"
3760       IfErrors +1 reboot_delete
3762       ; Original file will be deleted on reboot
3763       Delete /REBOOTOK "$INSTDIR$R9"
3764       ${LogMsg} "Delayed Delete File (Reboot Required): $INSTDIR$R9"
3765       GoTo end
3767       ; Renamed file will be deleted on reboot
3768       reboot_delete:
3769       Delete /REBOOTOK "$INSTDIR$R9.moz-delete"
3770       ${LogMsg} "Delayed Delete File (Reboot Required): $INSTDIR$R9.moz-delete"
3771       GoTo end
3773       end:
3774       ClearErrors
3776       Push 0
3777     FunctionEnd
3779     ; The xpinstall based installer removed directories even when they aren't
3780     ; empty so this does as well.
3781     Function ParseRemovedFilesLog_RemoveDir
3782       ${TrimNewLines} "$R9" $R9
3783       StrCpy $R1 "$R9" 4
3784       StrCmp "$R1" "Dir:" +1 end
3785       StrCpy $R9 "$R9" "" 5
3786       StrCpy $R1 "$R9" "" -1
3788       StrCmp "$R1" "\" +1 +2
3789       StrCpy $R9 "$R9" -1
3791       IfFileExists "$INSTDIR$R9" +1 end
3792       ClearErrors
3793       RmDir /r "$INSTDIR$R9"
3794       IfErrors +1 +3
3795       ${LogMsg} "** ERROR Removing Directory: $INSTDIR$R9 **"
3796       GoTo end
3798       ${LogMsg} "Removed Directory: $INSTDIR$R9"
3800       end:
3801       ClearErrors
3803       Push 0
3804     FunctionEnd
3806     !verbose pop
3807   !endif
3808 !macroend
3810 !macro ParseRemovedFilesLogCall
3811   !verbose push
3812   !verbose ${_MOZFUNC_VERBOSE}
3813   Call ParseRemovedFilesLog
3814   !verbose pop
3815 !macroend
3818  * Copies files from a source directory to a destination directory with logging
3819  * to the uninstall.log. If any destination files are in use a reboot will be
3820  * necessary to complete the installation and the reboot flag (see IfRebootFlag
3821  * in the NSIS documentation).
3823  * @param   _PATH_TO_SOURCE
3824  *          Source path to copy the files from. This must not end with a \.
3826  * @param   _PATH_TO_DESTINATION
3827  *          Destination path to copy the files to. This must not end with a \.
3829  * @param   _PREFIX_ERROR_CREATEDIR
3830  *          Prefix for the directory creation error message. The directory path
3831  *          will be inserted below this string.
3833  * @param   _SUFFIX_ERROR_CREATEDIR
3834  *          Suffix for the directory creation error message. The directory path
3835  *          will be inserted above this string.
3837  * $0  = destination file's parent directory used in the create_dir label
3838  * $R0 = copied value from $R6 (e.g. _PATH_TO_SOURCE)
3839  * $R1 = copied value from $R7 (e.g. _PATH_TO_DESTINATION)
3840  * $R2 = string length of the path to source
3841  * $R3 = relative path from the path to source
3842  * $R4 = copied value from $R8 (e.g. _PREFIX_ERROR_CREATEDIR)
3843  * $R5 = copied value from $R9 (e.g. _SUFFIX_ERROR_CREATEDIR)
3844  * note: the LocateNoDetails macro uses these registers so we copy the values
3845  *       to other registers.
3846  * $R6 = initially _PATH_TO_SOURCE and then set to "size" ($R6="" if directory,
3847  *       $R6="0" if file with /S=)"path\name" in callback
3848  * $R7 = initially _PATH_TO_DESTINATION and then set to "name" in callback
3849  * $R8 = initially _PREFIX_ERROR_CREATEDIR and then set to "path" in callback
3850  * $R9 = initially _SUFFIX_ERROR_CREATEDIR and then set to "path\name" in
3851  *       callback
3852  */
3853 !macro CopyFilesFromDir
3855   !ifndef CopyFilesFromDir
3856     !insertmacro LocateNoDetails
3857     !insertmacro OnEndCommon
3858     !insertmacro WordReplace
3860     !verbose push
3861     !verbose ${_MOZFUNC_VERBOSE}
3862     !define CopyFilesFromDir "!insertmacro CopyFilesFromDirCall"
3864     Function CopyFilesFromDir
3865       Exch $R9
3866       Exch 1
3867       Exch $R8
3868       Exch 2
3869       Exch $R7
3870       Exch 3
3871       Exch $R6
3872       Push $R5
3873       Push $R4
3874       Push $R3
3875       Push $R2
3876       Push $R1
3877       Push $R0
3878       Push $0
3880       StrCpy $R0 "$R6"
3881       StrCpy $R1 "$R7"
3882       StrCpy $R4 "$R8"
3883       StrCpy $R5 "$R9"
3885       StrLen $R2 $R0
3887       ${LocateNoDetails} "$R0" "/L=FD" "CopyFileCallback"
3889       Pop $0
3890       Pop $R0
3891       Pop $R1
3892       Pop $R2
3893       Pop $R3
3894       Pop $R4
3895       Pop $R5
3896       Exch $R6
3897       Exch 3
3898       Exch $R7
3899       Exch 2
3900       Exch $R8
3901       Exch 1
3902       Exch $R9
3903     FunctionEnd
3905     Function CopyFileCallback
3906       StrCpy $R3 $R8 "" $R2 ; $R3 always begins with a \.
3908       retry:
3909       ClearErrors
3910       StrCmp $R6 "" +1 copy_file
3911       IfFileExists "$R1$R3\$R7" end +1
3912       StrCpy $0 "$R1$R3\$R7"
3914       create_dir:
3915       ClearErrors
3916       CreateDirectory "$0"
3917       IfFileExists "$0" +1 err_create_dir  ; protect against looping.
3918       ${LogMsg}  "Created Directory: $0"
3919       StrCmp $R6 "" end copy_file
3921       err_create_dir:
3922       ${LogMsg}  "** ERROR Creating Directory: $0 **"
3923       MessageBox MB_RETRYCANCEL|MB_ICONQUESTION "$R4$\r$\n$\r$\n$0$\r$\n$\r$\n$R5" IDRETRY retry
3924       ${OnEndCommon}
3925       Quit
3927       copy_file:
3928       StrCpy $0 "$R1$R3"
3929       IfFileExists "$0" +1 create_dir
3931       ClearErrors
3932       ${DeleteFile} "$R1$R3\$R7"
3933       IfErrors +1 dest_clear
3934       ClearErrors
3935       Rename "$R1$R3\$R7" "$R1$R3\$R7.moz-delete"
3936       IfErrors +1 reboot_delete
3938       ; file will replace destination file on reboot
3939       Rename "$R9" "$R9.moz-upgrade"
3940       CopyFiles /SILENT "$R9.moz-upgrade" "$R1$R3"
3941       Rename /REBOOTOK "$R1$R3\$R7.moz-upgrade" "$R1$R3\$R7"
3942       ${LogMsg} "Copied File: $R1$R3\$R7.moz-upgrade"
3943       ${LogMsg} "Delayed Install File (Reboot Required): $R1$R3\$R7"
3944       GoTo log_uninstall
3946       ; file will be deleted on reboot
3947       reboot_delete:
3948       CopyFiles /SILENT $R9 "$R1$R3"
3949       Delete /REBOOTOK "$R1$R3\$R7.moz-delete"
3950       ${LogMsg} "Installed File: $R1$R3\$R7"
3951       ${LogMsg} "Delayed Delete File (Reboot Required): $R1$R3\$R7.moz-delete"
3952       GoTo log_uninstall
3954       ; destination file doesn't exist - coast is clear
3955       dest_clear:
3956       CopyFiles /SILENT $R9 "$R1$R3"
3957       ${LogMsg} "Installed File: $R1$R3\$R7"
3959       log_uninstall:
3960       ; If the file is installed into the installation directory remove the
3961       ; installation directory's path from the file path when writing to the
3962       ; uninstall.log so it will be a relative path. This allows the same
3963       ; helper.exe to be used with zip builds if we supply an uninstall.log.
3964       ${WordReplace} "$R1$R3\$R7" "$INSTDIR" "" "+" $R3
3965       ${LogUninstall} "File: $R3"
3967       end:
3968       Push 0
3969     FunctionEnd
3971     !verbose pop
3972   !endif
3973 !macroend
3975 !macro CopyFilesFromDirCall _PATH_TO_SOURCE _PATH_TO_DESTINATION \
3976                             _PREFIX_ERROR_CREATEDIR _SUFFIX_ERROR_CREATEDIR
3977   !verbose push
3978   !verbose ${_MOZFUNC_VERBOSE}
3979   Push "${_PATH_TO_SOURCE}"
3980   Push "${_PATH_TO_DESTINATION}"
3981   Push "${_PREFIX_ERROR_CREATEDIR}"
3982   Push "${_SUFFIX_ERROR_CREATEDIR}"
3983   Call CopyFilesFromDir
3984   !verbose pop
3985 !macroend
3988  * Parses the uninstall.log to unregister dll's, remove files, and remove
3989  * empty directories for this installation.
3991  * When modifying this macro be aware that LineFind uses all registers except
3992  * $R0-$R3 so be cautious. Callers of this macro are not affected.
3993  */
3994 !macro un.ParseUninstallLog
3996   !ifndef un.ParseUninstallLog
3997     !insertmacro un.LineFind
3998     !insertmacro un.TrimNewLines
4000     !verbose push
4001     !verbose ${_MOZFUNC_VERBOSE}
4002     !define un.ParseUninstallLog "!insertmacro un.ParseUninstallLogCall"
4004     Function un.ParseUninstallLog
4005       Push $R9
4006       Push $R8
4007       Push $R7
4008       Push $R6
4009       Push $R5
4010       Push $R4
4011       Push $R3
4012       Push $R2
4013       Push $R1
4014       Push $R0
4015       Push $TmpVal
4017       IfFileExists "$INSTDIR\uninstall\uninstall.log" +1 end
4019       ; Copy the uninstall log file to a temporary file
4020       GetTempFileName $TmpVal
4021       CopyFiles /SILENT /FILESONLY "$INSTDIR\uninstall\uninstall.log" "$TmpVal"
4023       ; Unregister DLL's
4024       ${un.LineFind} "$TmpVal" "/NUL" "1:-1" "un.UnRegDLLsCallback"
4026       ; Delete files
4027       ${un.LineFind} "$TmpVal" "/NUL" "1:-1" "un.RemoveFilesCallback"
4029       ; Remove empty directories
4030       ${un.LineFind} "$TmpVal" "/NUL" "1:-1" "un.RemoveDirsCallback"
4032       ; Delete the temporary uninstall log file
4033       Delete /REBOOTOK "$TmpVal"
4035       end:
4037       Pop $TmpVal
4038       Pop $R0
4039       Pop $R1
4040       Pop $R2
4041       Pop $R3
4042       Pop $R4
4043       Pop $R5
4044       Pop $R6
4045       Pop $R7
4046       Pop $R8
4047       Pop $R9
4048     FunctionEnd
4050     Function un.RemoveFilesCallback
4051       ${un.TrimNewLines} "$R9" $R9
4052       StrCpy $R1 "$R9" 5
4054       StrCmp "$R1" "File:" +1 end
4055       StrCpy $R9 "$R9" "" 6
4056       StrCpy $R0 "$R9" 1
4058       StrCpy $R1 "$INSTDIR$R9"
4059       StrCmp "$R0" "\" +2 +1
4060       StrCpy $R1 "$R9"
4062       IfFileExists "$R1" +1 end
4063       Delete "$R1"
4064       IfErrors +1 end
4065       ClearErrors
4066       Rename "$R1" "$R1.moz-delete"
4067       IfErrors +1 +3
4068       Delete /REBOOTOK "$R1"
4069       GoTo end
4071       Delete /REBOOTOK "$R1.moz-delete"
4073       end:
4074       ClearErrors
4076       Push 0
4077     FunctionEnd
4079     Function un.UnRegDLLsCallback
4080       ${un.TrimNewLines} "$R9" $R9
4081       StrCpy $R1 "$R9" 7
4083       StrCmp $R1 "DLLReg:" +1 end
4084       StrCpy $R9 "$R9" "" 8
4085       StrCpy $R0 "$R9" 1
4087       StrCpy $R1 "$INSTDIR$R9"
4088       StrCmp $R0 "\" +2 +1
4089       StrCpy $R1 "$R9"
4091       UnRegDLL $R1
4093       end:
4094       ClearErrors
4096       Push 0
4097     FunctionEnd
4099     ; Using locate will leave file handles open to some of the directories
4100     ; which will prevent the deletion of these directories. This parses the
4101     ; uninstall.log and uses the file entries to find / remove empty
4102     ; directories.
4103     Function un.RemoveDirsCallback
4104       ${un.TrimNewLines} "$R9" $R9
4105       StrCpy $R0 "$R9" 5          ; Copy the first five chars
4106       StrCmp "$R0" "File:" +1 end
4108       StrCpy $R9 "$R9" "" 6       ; Copy string starting after the 6th char
4109       StrCpy $R0 "$R9" 1          ; Copy the first char
4111       StrCpy $R1 "$INSTDIR$R9"    ; Copy the install dir path and suffix it with the string
4112       StrCmp "$R0" "\" loop       ; If this is a relative path goto the loop
4113       StrCpy $R1 "$R9"            ; Already a full path so copy the string
4115       loop:
4116       ${un.GetParent} "$R1" $R1   ; Get the parent directory for the path
4117       StrCmp "$R1" "$INSTDIR" end ; If the directory is the install dir goto end
4119       ; We only try to remove empty directories but the Desktop, StartMenu, and
4120       ; QuickLaunch directories can be empty so guard against removing them.
4121       SetShellVarContext all          ; Set context to all users
4122       StrCmp "$R1" "$DESKTOP" end     ; All users desktop
4123       StrCmp "$R1" "$STARTMENU" end   ; All users start menu
4125       SetShellVarContext current      ; Set context to all users
4126       StrCmp "$R1" "$DESKTOP" end     ; Current user desktop
4127       StrCmp "$R1" "$STARTMENU" end   ; Current user start menu
4128       StrCmp "$R1" "$QUICKLAUNCH" end ; Current user quick launch
4130       IfFileExists "$R1" +1 +3  ; Only try to remove the dir if it exists
4131       ClearErrors
4132       RmDir "$R1"    ; Remove the dir
4133       IfErrors end   ; If we fail there is no use trying to remove its parent dir
4135       StrCmp "$R0" "\" loop end  ; Only loop when the path is relative to the install dir
4137       end:
4138       ClearErrors
4140       Push 0
4141     FunctionEnd
4143     !verbose pop
4144   !endif
4145 !macroend
4147 !macro un.ParseUninstallLogCall
4148   !verbose push
4149   !verbose ${_MOZFUNC_VERBOSE}
4150   Call un.ParseUninstallLog
4151   !verbose pop
4152 !macroend
4155 ################################################################################
4156 # Macros for custom branding
4159  * Sets BrandFullName and / or BrandShortName to values provided in the specified
4160  * ini file and defaults to BrandShortName and BrandFullName as defined in
4161  * branding.nsi when the associated ini file entry is not specified.
4163  * ini file format:
4164  * [Branding]
4165  * BrandFullName=Custom Full Name
4166  * BrandShortName=Custom Short Name
4168  * @param   _PATH_TO_INI
4169  *          Path to the ini file.
4171  * $R6 = return value from ReadINIStr
4172  * $R7 = stores BrandShortName
4173  * $R8 = stores BrandFullName
4174  * $R9 = _PATH_TO_INI
4175  */
4176 !macro SetBrandNameVars
4178   !ifndef ${_MOZFUNC_UN}SetBrandNameVars
4179     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
4180     !insertmacro ${_MOZFUNC_UN_TMP}WordReplace
4181     !undef _MOZFUNC_UN
4182     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
4183     !undef _MOZFUNC_UN_TMP
4185     ; Prevent declaring vars twice when the SetBrandNameVars macro is
4186     ; inserted into both the installer and uninstaller.
4187     !ifndef SetBrandNameVars
4188       Var BrandFullName
4189       Var BrandFullNameDA
4190       Var BrandShortName
4191     !endif
4193     !verbose push
4194     !verbose ${_MOZFUNC_VERBOSE}
4195     !define ${_MOZFUNC_UN}SetBrandNameVars "!insertmacro ${_MOZFUNC_UN}SetBrandNameVarsCall"
4197     Function ${_MOZFUNC_UN}SetBrandNameVars
4198       Exch $R9
4199       Push $R8
4200       Push $R7
4201       Push $R6
4203       StrCpy $R8 "${BrandFullName}"
4204       StrCpy $R7 "${BrandShortName}"
4206       IfFileExists "$R9" +1 finish
4208       ClearErrors
4209       ReadINIStr $R6 $R9 "Branding" "BrandFullName"
4210       IfErrors +2 +1
4211       StrCpy $R8 "$R6"
4213       ClearErrors
4214       ReadINIStr $R6 $R9 "Branding" "BrandShortName"
4215       IfErrors +2 +1
4216       StrCpy $R7 "$R6"
4218       finish:
4219       StrCpy $BrandFullName "$R8"
4220       ${${_MOZFUNC_UN}WordReplace} "$R8" "&" "&&" "+" $R8
4221       StrCpy $BrandFullNameDA "$R8"
4222       StrCpy $BrandShortName "$R7"
4224       Pop $R6
4225       Pop $R7
4226       Pop $R8
4227       Exch $R9
4228     FunctionEnd
4230     !verbose pop
4231   !endif
4232 !macroend
4234 !macro SetBrandNameVarsCall _PATH_TO_INI
4235   !verbose push
4236   !verbose ${_MOZFUNC_VERBOSE}
4237   Push "${_PATH_TO_INI}"
4238   Call SetBrandNameVars
4239   !verbose pop
4240 !macroend
4242 !macro un.SetBrandNameVarsCall _PATH_TO_INI
4243   !verbose push
4244   !verbose ${_MOZFUNC_VERBOSE}
4245   Push "${_PATH_TO_INI}"
4246   Call un.SetBrandNameVars
4247   !verbose pop
4248 !macroend
4250 !macro un.SetBrandNameVars
4251   !ifndef un.SetBrandNameVars
4252     !verbose push
4253     !verbose ${_MOZFUNC_VERBOSE}
4254     !undef _MOZFUNC_UN
4255     !define _MOZFUNC_UN "un."
4257     !insertmacro SetBrandNameVars
4259     !undef _MOZFUNC_UN
4260     !define _MOZFUNC_UN
4261     !verbose pop
4262   !endif
4263 !macroend
4266  * Replaces the wizard's header image with the one specified.
4268  * @param   _PATH_TO_IMAGE
4269  *          Fully qualified path to the bitmap to use for the header image.
4271  * $R8 = hwnd for the control returned from GetDlgItem.
4272  * $R9 = _PATH_TO_IMAGE
4273  */
4274 !macro ChangeMUIHeaderImage
4276   !ifndef ${_MOZFUNC_UN}ChangeMUIHeaderImage
4277     Var hHeaderBitmap
4279     !verbose push
4280     !verbose ${_MOZFUNC_VERBOSE}
4281     !define ${_MOZFUNC_UN}ChangeMUIHeaderImage "!insertmacro ${_MOZFUNC_UN}ChangeMUIHeaderImageCall"
4283     Function ${_MOZFUNC_UN}ChangeMUIHeaderImage
4284       Exch $R9
4285       Push $R8
4287       GetDlgItem $R8 $HWNDPARENT 1046
4288       System::Call 'user32::LoadImage(i 0, t "$R9", i 0, i 0, i 0, i 0x0010|0x2000) i.s'
4289       Pop $hHeaderBitmap
4290       SendMessage $R8 ${STM_SETIMAGE} 0 $hHeaderBitmap
4291       ; There is no way to specify a show function for a custom page so hide
4292       ; and then show the control to force the bitmap to redraw.
4293       ShowWindow $R8 ${SW_HIDE}
4294       ShowWindow $R8 ${SW_SHOW}
4296       Pop $R8
4297       Exch $R9
4298     FunctionEnd
4300     !verbose pop
4301   !endif
4302 !macroend
4304 !macro ChangeMUIHeaderImageCall _PATH_TO_IMAGE
4305   !verbose push
4306   !verbose ${_MOZFUNC_VERBOSE}
4307   Push "${_PATH_TO_IMAGE}"
4308   Call ChangeMUIHeaderImage
4309   !verbose pop
4310 !macroend
4312 !macro un.ChangeMUIHeaderImageCall _PATH_TO_IMAGE
4313   !verbose push
4314   !verbose ${_MOZFUNC_VERBOSE}
4315   Push "${_PATH_TO_IMAGE}"
4316   Call un.ChangeMUIHeaderImage
4317   !verbose pop
4318 !macroend
4320 !macro un.ChangeMUIHeaderImage
4321   !ifndef un.ChangeMUIHeaderImage
4322     !verbose push
4323     !verbose ${_MOZFUNC_VERBOSE}
4324     !undef _MOZFUNC_UN
4325     !define _MOZFUNC_UN "un."
4327     !insertmacro ChangeMUIHeaderImage
4329     !undef _MOZFUNC_UN
4330     !define _MOZFUNC_UN
4331     !verbose pop
4332   !endif
4333 !macroend
4336 ################################################################################
4337 # User interface callback helper defines and macros
4339 /* Install type defines */
4340 !ifndef INSTALLTYPE_BASIC
4341   !define INSTALLTYPE_BASIC     1
4342 !endif
4344 !ifndef INSTALLTYPE_ADVANCED
4345   !define INSTALLTYPE_ADVANCED  2
4346 !endif
4348 !ifndef INSTALLTYPE_CUSTOM
4349   !define INSTALLTYPE_CUSTOM    4
4350 !endif
4353  * Checks whether to display the current page (e.g. if not performing a custom
4354  * install don't display the custom pages).
4355  */
4356 !macro CheckCustomCommon
4358   !ifndef CheckCustomCommon
4359     !verbose push
4360     !verbose ${_MOZFUNC_VERBOSE}
4361     !define CheckCustomCommon "!insertmacro CheckCustomCommonCall"
4363     Function CheckCustomCommon
4365       ; Abort if not a custom install
4366       IntCmp $InstallType ${INSTALLTYPE_CUSTOM} +2 +1 +1
4367       Abort
4369     FunctionEnd
4371     !verbose pop
4372   !endif
4373 !macroend
4375 !macro CheckCustomCommonCall
4376   !verbose push
4377   !verbose ${_MOZFUNC_VERBOSE}
4378   Call CheckCustomCommon
4379   !verbose pop
4380 !macroend
4383  * Unloads dll's and releases references when the installer and uninstaller
4384  * exit.
4385  */
4386 !macro OnEndCommon
4388   !ifndef ${_MOZFUNC_UN}OnEndCommon
4389     !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
4390     !insertmacro ${_MOZFUNC_UN_TMP}UnloadUAC
4391     !undef _MOZFUNC_UN
4392     !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
4393     !undef _MOZFUNC_UN_TMP
4395     !verbose push
4396     !verbose ${_MOZFUNC_VERBOSE}
4397     !define ${_MOZFUNC_UN}OnEndCommon "!insertmacro ${_MOZFUNC_UN}OnEndCommonCall"
4399     Function ${_MOZFUNC_UN}OnEndCommon
4401       ${${_MOZFUNC_UN}UnloadUAC}
4402       StrCmp $hHeaderBitmap "" +3 +1
4403       System::Call "gdi32::DeleteObject(i s)" $hHeaderBitmap
4404       StrCpy $hHeaderBitmap ""
4406       System::Free 0
4408     FunctionEnd
4410     !verbose pop
4411   !endif
4412 !macroend
4414 !macro OnEndCommonCall
4415   !verbose push
4416   !verbose ${_MOZFUNC_VERBOSE}
4417   Call OnEndCommon
4418   !verbose pop
4419 !macroend
4421 !macro un.OnEndCommonCall
4422   !verbose push
4423   !verbose ${_MOZFUNC_VERBOSE}
4424   Call un.OnEndCommon
4425   !verbose pop
4426 !macroend
4428 !macro un.OnEndCommon
4429   !ifndef un.OnEndCommon
4430     !verbose push
4431     !verbose ${_MOZFUNC_VERBOSE}
4432     !undef _MOZFUNC_UN
4433     !define _MOZFUNC_UN "un."
4435     !insertmacro OnEndCommon
4437     !undef _MOZFUNC_UN
4438     !define _MOZFUNC_UN
4439     !verbose pop
4440   !endif
4441 !macroend
4444  * Called from the installer's .onInit function not to be confused with the
4445  * uninstaller's .onInit or the uninstaller's un.onInit functions.
4447  * @param   _WARN_UNSUPPORTED_MSG
4448  *          Message displayed when the Windows version is not supported.
4450  * $R5 = return value from the GetSize macro
4451  * $R6 = general string values, return value from GetTempFileName, return
4452  *       value from the GetSize macro
4453  * $R7 = full path to the configuration ini file
4454  * $R8 = return value from the GetParameters macro
4455  * $R9 = _WARN_UNSUPPORTED_MSG
4456  */
4457 !macro InstallOnInitCommon
4459   !ifndef InstallOnInitCommon
4460     !insertmacro CloseApp
4461     !insertmacro ElevateUAC
4462     !insertmacro GetOptions
4463     !insertmacro GetParameters
4464     !insertmacro GetSize
4466     !verbose push
4467     !verbose ${_MOZFUNC_VERBOSE}
4468     !define InstallOnInitCommon "!insertmacro InstallOnInitCommonCall"
4470     Function InstallOnInitCommon
4471       Exch $R9
4472       Push $R8
4473       Push $R7
4474       Push $R6
4475       Push $R5
4477       !ifdef ___WINVER__NSH___
4478         ${Unless} ${AtLeastWin2000}
4479           ; XXX-rstrong - some systems fail the AtLeastWin2000 test for an
4480           ; unknown reason. To work around this also check if the Windows NT
4481           ; registry Key exists and if it does if the first char in
4482           ; CurrentVersion is equal to 3 (Windows NT 3.5 and 3.5.1) or 4
4483           ; (Windows NT 4).
4484           StrCpy $R8 ""
4485           ClearErrors
4486           ReadRegStr $R8 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
4487           StrCpy $R8 "$R8" 1
4488           ${If} ${Errors}
4489           ${OrIf} "$R8" == "3"
4490           ${OrIf} "$R8" == "4"
4491             MessageBox MB_OK|MB_ICONSTOP "$R9" IDOK
4492             ; Nothing initialized so no need to call OnEndCommon
4493             Quit
4494           ${EndIf}
4495         ${EndUnless}
4496       !endif
4498       ${GetParameters} $R8
4500       ; Require elevation if the user can elevate
4501       ${ElevateUAC}
4503       ${If} $R8 != ""
4504         ClearErrors
4505         ${GetOptions} "$R8" "-ms" $R7
4506         ${If} ${Errors}
4507           ; Default install type
4508           StrCpy $InstallType ${INSTALLTYPE_BASIC}
4509           ; Support for specifying an installation configuration file.
4510           ClearErrors
4511           ${GetOptions} "$R8" "/INI=" $R7
4512           ${Unless} ${Errors}
4513             ; The configuration file must also exist
4514             ${If} ${FileExists} "$R7"
4515               SetSilent silent
4516               ReadINIStr $R8 $R7 "Install" "InstallDirectoryName"
4517               ${If} $R8 != ""
4518                 StrCpy $INSTDIR "$PROGRAMFILES\$R8"
4519               ${Else}
4520                 ReadINIStr $R8 $R7 "Install" "InstallDirectoryPath"
4521                 ${If} $R8 != ""
4522                   StrCpy $INSTDIR "$R8"
4523                 ${EndIf}
4524               ${EndIf}
4526               ${If} $INSTDIR == ""
4527                 ; Check if there is an existing uninstall registry entry for this
4528                 ; version of the application and if present install into that location
4529                 StrCpy $R6 "Software\Microsoft\Windows\CurrentVersion\Uninstall\${BrandFullNameInternal} (${AppVersion})"
4530                 ReadRegStr $R8 HKLM "$R6" "InstallLocation"
4531                 ${If} $R8 == ""
4532                   StrCpy $INSTDIR "$PROGRAMFILES\${BrandFullName}"
4533                 ${Else}
4534                   GetFullPathName $INSTDIR "$R8"
4535                   ${Unless} ${FileExists} "$INSTDIR"
4536                     StrCpy $INSTDIR "$PROGRAMFILES\${BrandFullName}"
4537                   ${EndUnless}
4538                 ${EndIf}
4539               ${EndIf}
4541               ; Quit if we are unable to create the installation directory or we are
4542               ; unable to write to a file in the installation directory.
4543               ClearErrors
4544               ${If} ${FileExists} "$INSTDIR"
4545                 GetTempFileName $R6 "$INSTDIR"
4546                 FileOpen $R5 $R6 w
4547                 FileWrite $R5 "Write Access Test"
4548                 FileClose $R5
4549                 Delete $R6
4550                 ${If} ${Errors}
4551                   ; Nothing initialized so no need to call OnEndCommon
4552                   Quit
4553                 ${EndIf}
4554               ${Else}
4555                 CreateDirectory "$INSTDIR"
4556                 ${If} ${Errors}
4557                   ; Nothing initialized so no need to call OnEndCommon
4558                   Quit
4559                 ${EndIf}
4560               ${EndIf}
4562               ReadINIStr $R8 $R7 "Install" "CloseAppNoPrompt"
4563               ${If} $R8 == "true"
4564                 ; Try to close the app if the exe is in use.
4565                 ClearErrors
4566                 ${If} ${FileExists} "$INSTDIR\${FileMainEXE}"
4567                   ${DeleteFile} "$INSTDIR\${FileMainEXE}"
4568                 ${EndIf}
4569                 ${If} ${Errors}
4570                   ClearErrors
4571                   ${CloseApp} "false" ""
4572                   ClearErrors
4573                   ${DeleteFile} "$INSTDIR\${FileMainEXE}"
4574                   ; If unsuccessful try one more time and if it still fails Quit
4575                   ${If} ${Errors}
4576                     ClearErrors
4577                     ${CloseApp} "false" ""
4578                     ClearErrors
4579                     ${DeleteFile} "$INSTDIR\${FileMainEXE}"
4580                     ${If} ${Errors}
4581                       ; Nothing initialized so no need to call OnEndCommon
4582                       Quit
4583                     ${EndIf}
4584                   ${EndIf}
4585                 ${EndIf}
4586               ${EndIf}
4588               ReadINIStr $R8 $R7 "Install" "QuickLaunchShortcut"
4589               ${If} $R8 == "false"
4590                 StrCpy $AddQuickLaunchSC "0"
4591               ${Else}
4592                 StrCpy $AddQuickLaunchSC "1"
4593               ${EndIf}
4595               ReadINIStr $R8 $R7 "Install" "DesktopShortcut"
4596               ${If} $R8 == "false"
4597                 StrCpy $AddDesktopSC "0"
4598               ${Else}
4599                 StrCpy $AddDesktopSC "1"
4600               ${EndIf}
4602               ReadINIStr $R8 $R7 "Install" "StartMenuShortcuts"
4603               ${If} $R8 == "false"
4604                 StrCpy $AddStartMenuSC "0"
4605               ${Else}
4606                 StrCpy $AddStartMenuSC "1"
4607               ${EndIf}
4609               ReadINIStr $R8 $R7 "Install" "StartMenuDirectoryName"
4610               ${If} $R8 != ""
4611                 StrCpy $StartMenuDir "$R8"
4612               ${EndIf}
4613             ${EndIf}
4614           ${EndUnless}
4615         ${Else}
4616           ; Support for the deprecated -ms command line argument. The new command
4617           ; line arguments are not supported when -ms is used.
4618           SetSilent silent
4619         ${EndIf}
4620       ${EndIf}
4621       ClearErrors
4623       Pop $R5
4624       Pop $R6
4625       Pop $R7
4626       Pop $R8
4627       Exch $R9
4628     FunctionEnd
4630     !verbose pop
4631   !endif
4632 !macroend
4634 !macro InstallOnInitCommonCall _WARN_UNSUPPORTED_MSG
4635   !verbose push
4636   !verbose ${_MOZFUNC_VERBOSE}
4637   Push "${_WARN_UNSUPPORTED_MSG}"
4638   Call InstallOnInitCommon
4639   !verbose pop
4640 !macroend
4643  * Called from the uninstaller's .onInit function not to be confused with the
4644  * installer's .onInit or the uninstaller's un.onInit functions.
4645  */
4646 !macro UninstallOnInitCommon
4648   !ifndef UninstallOnInitCommon
4649     !insertmacro ElevateUAC
4650     !insertmacro GetLongPath
4651     !insertmacro GetOptions
4652     !insertmacro GetParameters
4653     !insertmacro UnloadUAC
4654     !insertmacro UpdateUninstallLog
4656     !verbose push
4657     !verbose ${_MOZFUNC_VERBOSE}
4658     !define UninstallOnInitCommon "!insertmacro UninstallOnInitCommonCall"
4660     Function UninstallOnInitCommon
4661 ; Prevents breaking Thunderbird
4662 !ifdef SetBrandNameVars
4663       ${SetBrandNameVars} "$EXEDIR\distribution\setup.ini"
4664 !endif
4666       ; Prevent launching the application when a reboot is required and this
4667       ; executable is the main application executable
4668       IfFileExists "$EXEDIR\${FileMainEXE}.moz-upgrade" +1 +4
4669       MessageBox MB_YESNO "$(WARN_RESTART_REQUIRED_UPGRADE)" IDNO +2
4670       Reboot
4671       Quit ; Nothing initialized so no need to call OnEndCommon
4673       GetFullPathName $INSTDIR "$EXEDIR\.."
4674       ${GetLongPath} "$INSTDIR" $INSTDIR
4675       IfFileExists "$INSTDIR\${FileMainEXE}" +2 +1
4676       Quit ; Nothing initialized so no need to call OnEndCommon
4678 ; Prevents breaking Thunderbird
4679 !ifdef SetBrandNameVars
4680       ${SetBrandNameVars} "$INSTDIR\distribution\setup.ini"
4681 !endif
4683       ; Prevent all operations (e.g. set as default, postupdate, etc.) when a
4684       ; reboot is required and the executable launched is helper.exe
4685       IfFileExists "$INSTDIR\${FileMainEXE}.moz-upgrade" +1 +4
4686       MessageBox MB_YESNO "$(WARN_RESTART_REQUIRED_UPGRADE)" IDNO +2
4687       Reboot
4688       Quit ; Nothing initialized so no need to call OnEndCommon
4690       ${GetParameters} $R0
4692       StrCmp "$R0" "" continue +1
4694       ; Require elevation if the user can elevate
4695       ClearErrors
4696       ${GetOptions} "$R0" "/HideShortcuts" $R2
4697       IfErrors showshortcuts +1
4698       ${ElevateUAC}
4699       ${HideShortcuts}
4700       GoTo finish
4702       ; Require elevation if the user can elevate
4703       showshortcuts:
4704       ClearErrors
4705       ${GetOptions} "$R0" "/ShowShortcuts" $R2
4706       IfErrors defaultappuser +1
4707       ${ElevateUAC}
4708       ${ShowShortcuts}
4709       GoTo finish
4711       ; Require elevation if the the StartMenuInternet registry keys require
4712       ; updating and the user can elevate
4713       defaultappuser:
4714       ClearErrors
4715       ${GetOptions} "$R0" "/SetAsDefaultAppUser" $R2
4716       IfErrors defaultappglobal +1
4717       ${SetAsDefaultAppUser}
4718       GoTo finish
4720       ; Require elevation if the user can elevate
4721       defaultappglobal:
4722       ClearErrors
4723       ${GetOptions} "$R0" "/SetAsDefaultAppGlobal" $R2
4724       IfErrors postupdate +1
4725       ${ElevateUAC}
4726       ${SetAsDefaultAppGlobal}
4727       GoTo finish
4729       ; Do not attempt to elevate. The application launching this executable is
4730       ; responsible for elevation if it is required.
4731       postupdate:
4732       ${WordReplace} "$R0" "$\"" "" "+" $R0
4733       ClearErrors
4734       ${GetOptions} "$R0" "/PostUpdate" $R2
4735       IfErrors continue +1
4736       ; If the uninstall.log does not exist don't perform post update
4737       ; operations. This prevents updating the registry for zip builds.
4738       IfFileExists "$EXEDIR\uninstall.log" +1 finish
4739       ${PostUpdate}
4740       ClearErrors
4741       ${GetOptions} "$R0" "/UninstallLog=" $R2
4742       IfErrors updateuninstalllog +1
4743       StrCmp "$R2" "" finish +1
4744       GetFullPathName $R3 "$R2"
4745       IfFileExists "$R3" +1 finish
4746       Delete "$INSTDIR\uninstall\*wizard*"
4747       Delete "$INSTDIR\uninstall\uninstall.log"
4748       CopyFiles /SILENT /FILESONLY "$R3" "$INSTDIR\uninstall\"
4749       ${GetParent} "$R3" $R4
4750       Delete "$R3"
4751       RmDir "$R4"
4752       GoTo finish
4754       ; Do not attempt to elevate. The application launching this executable is
4755       ; responsible for elevation if it is required.
4756       updateuninstalllog:
4757       ${UpdateUninstallLog}
4759       finish:
4760       ${UnloadUAC}
4761       System::Call "shell32::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)"
4762       Quit ; Nothing initialized so no need to call OnEndCommon
4764       continue:
4766       ; If the uninstall.log does not exist don't perform uninstall
4767       ; operations. This prevents running the uninstaller for zip builds.
4768       IfFileExists "$INSTDIR\uninstall\uninstall.log" +2 +1
4769       Quit ; Nothing initialized so no need to call OnEndCommon
4771       ; Require elevation if the user can elevate
4772       ${ElevateUAC}
4774       ; If we made it this far then this installer is being used as an uninstaller.
4775       WriteUninstaller "$EXEDIR\uninstaller.exe"
4777       StrCpy $R1 "$\"$EXEDIR\uninstaller.exe$\""
4778       StrCmp $R0 "/S" +1 +2
4779       StrCpy $R1 "$\"$EXEDIR\uninstaller.exe$\" /S"
4781       ; When the uninstaller is launched it copies itself to the temp directory
4782       ; so it won't be in use so it can delete itself.
4783       ExecWait $R1
4784       ${DeleteFile} "$EXEDIR\uninstaller.exe"
4785       ${UnloadUAC}
4786       SetErrorLevel 0
4787       Quit ; Nothing initialized so no need to call OnEndCommon
4789     FunctionEnd
4791     !verbose pop
4792   !endif
4793 !macroend
4795 !macro UninstallOnInitCommonCall
4796   !verbose push
4797   !verbose ${_MOZFUNC_VERBOSE}
4798   Call UninstallOnInitCommon
4799   !verbose pop
4800 !macroend
4803  * Called from the MUI preDirectory function
4805  * $R9 = returned value from GetSingleInstallPath, CheckDiskSpace, and
4806  *       CanWriteToInstallDir macros
4807  */
4808 !macro PreDirectoryCommon
4810   !ifndef PreDirectoryCommon
4811     !insertmacro CanWriteToInstallDir
4812     !insertmacro CheckDiskSpace
4813     !insertmacro GetLongPath
4815 !ifndef NO_INSTDIR_FROM_REG
4816     !insertmacro GetSingleInstallPath
4817 !endif
4819     !verbose push
4820     !verbose ${_MOZFUNC_VERBOSE}
4821     !define PreDirectoryCommon "!insertmacro PreDirectoryCommonCall"
4823     Function PreDirectoryCommon
4824       Push $R9
4826 !ifndef NO_INSTDIR_FROM_REG
4827       SetShellVarContext all      ; Set SHCTX to HKLM
4828       ${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
4830       StrCmp "$R9" "false" +1 fix_install_dir
4832       SetShellVarContext current  ; Set SHCTX to HKCU
4833       ${GetSingleInstallPath} "Software\Mozilla\${BrandFullNameInternal}" $R9
4835       fix_install_dir:
4836       StrCmp "$R9" "false" +2 +1
4837       StrCpy $INSTDIR "$R9"
4838 !endif
4840       IfFileExists "$INSTDIR" +1 check_install_dir
4842       ; Always display the long path if the path already exists.
4843       ${GetLongPath} "$INSTDIR" $INSTDIR
4845       ; The call to GetLongPath returns a long path without a trailing
4846       ; back-slash. Append a \ to the path to prevent the directory
4847       ; name from being appended when using the NSIS create new folder.
4848       ; http://www.nullsoft.com/free/nsis/makensis.htm#InstallDir
4849       StrCpy $INSTDIR "$INSTDIR\"
4851       check_install_dir:
4852       IntCmp $InstallType ${INSTALLTYPE_CUSTOM} end +1 +1
4853       ${CheckDiskSpace} $R9
4854       StrCmp $R9 "false" end +1
4855       ${CanWriteToInstallDir} $R9
4856       StrCmp $R9 "false" end +1
4857       Abort
4859       end:
4861       Pop $R9
4862     FunctionEnd
4864     !verbose pop
4865   !endif
4866 !macroend
4868 !macro PreDirectoryCommonCall
4869   !verbose push
4870   !verbose ${_MOZFUNC_VERBOSE}
4871   Call PreDirectoryCommon
4872   !verbose pop
4873 !macroend
4876  * Called from the MUI leaveDirectory function
4878  * @param   _WARN_DISK_SPACE
4879  *          Message displayed when there isn't enough disk space to perform the
4880  *          installation.
4881  * @param   _WARN_WRITE_ACCESS
4882  *          Message displayed when the installer does not have write access to
4883  *          $INSTDIR.
4885  * $R7 = returned value from CheckDiskSpace and CanWriteToInstallDir macros
4886  * $R8 = _WARN_DISK_SPACE
4887  * $R9 = _WARN_WRITE_ACCESS
4888  */
4889 !macro LeaveDirectoryCommon
4891   !ifndef LeaveDirectoryCommon
4892     !insertmacro CheckDiskSpace
4893     !insertmacro CanWriteToInstallDir
4895     !verbose push
4896     !verbose ${_MOZFUNC_VERBOSE}
4897     !define LeaveDirectoryCommon "!insertmacro LeaveDirectoryCommonCall"
4899     Function LeaveDirectoryCommon
4900       Exch $R9
4901       Exch 1
4902       Exch $R8
4903       Push $R7
4905       ${CheckDiskSpace} $R7
4906       StrCmp $R7 "false" +1 +3
4907       MessageBox MB_OK "$R8"
4908       Abort
4910       ${CanWriteToInstallDir} $R7
4911       StrCmp $R7 "false" +1 +3
4912       MessageBox MB_OK "$R9"
4913       Abort
4915       Pop $R7
4916       Exch $R8
4917       Exch 1
4918       Exch $R9
4919     FunctionEnd
4921     !verbose pop
4922   !endif
4923 !macroend
4925 !macro LeaveDirectoryCommonCall _WARN_DISK_SPACE _WARN_WRITE_ACCESS
4926   !verbose push
4927   Push "${_WARN_DISK_SPACE}"
4928   Push "${_WARN_WRITE_ACCESS}"
4929   !verbose ${_MOZFUNC_VERBOSE}
4930   Call LeaveDirectoryCommon
4931   !verbose pop
4932 !macroend
4935 ################################################################################
4936 # Install Section common macros.
4939  * Performs common cleanup operations prior to the actual installation.
4940  * This macro should be called first when installation starts.
4941  */
4942 !macro InstallStartCleanupCommon
4944   !ifndef InstallStartCleanupCommon
4945     !insertmacro CleanVirtualStore
4946     !insertmacro EndUninstallLog
4947     !insertmacro ParseRemovedFilesLog
4948     !insertmacro UpdateFromPreviousLog
4950     !verbose push
4951     !verbose ${_MOZFUNC_VERBOSE}
4952     !define InstallStartCleanupCommon "!insertmacro InstallStartCleanupCommonCall"
4954     Function InstallStartCleanupCommon
4956       ; Remove files not removed by parsing the removed-files.log
4957       Delete "$INSTDIR\install_wizard.log"
4958       Delete "$INSTDIR\install_status.log"
4960       RmDir /r "$INSTDIR\updates"
4961       Delete "$INSTDIR\updates.xml"
4962       Delete "$INSTDIR\active-update.xml"
4964       RmDir /r "$INSTDIR\distribution"
4966       ; Remove files from the uninstall directory.
4967       IfFileExists "$INSTDIR\uninstall" +1 +7
4968       Delete "$INSTDIR\uninstall\*wizard*"
4969       Delete "$INSTDIR\uninstall\uninstall.ini"
4970       Delete "$INSTDIR\uninstall\cleanup.log"
4971       Delete "$INSTDIR\uninstall\uninstall.update"
4972       IfFileExists "$INSTDIR\uninstall\uninstall.log" +1 +2
4973       Rename "$INSTDIR\uninstall\uninstall.log" "$INSTDIR\uninstall\uninstall.bak"
4975       ; Since we write to the uninstall.log in this directory during the
4976       ; installation create the directory if it doesn't already exist.
4977       IfFileExists "$INSTDIR\uninstall" +2 +1
4978       CreateDirectory "$INSTDIR\uninstall"
4980       ; Remove files that may be left behind by the application in the
4981       ; VirtualStore directory.
4982       ${CleanVirtualStore}
4984       ; Remove the files and directories in the removed-files.log
4985       ${ParseRemovedFilesLog}
4986     FunctionEnd
4988     !verbose pop
4989   !endif
4990 !macroend
4992 !macro InstallStartCleanupCommonCall
4993   !verbose push
4994   !verbose ${_MOZFUNC_VERBOSE}
4995   Call InstallStartCleanupCommon
4996   !verbose pop
4997 !macroend
5000  * Performs common cleanup operations after the actual installation.
5001  * This macro should be called last during the installation.
5002  */
5003 !macro InstallEndCleanupCommon
5005   !ifndef InstallEndCleanupCommon
5006     !insertmacro EndUninstallLog
5007     !insertmacro UpdateFromPreviousLog
5009     !verbose push
5010     !verbose ${_MOZFUNC_VERBOSE}
5011     !define InstallEndCleanupCommon "!insertmacro InstallEndCleanupCommonCall"
5013     Function InstallEndCleanupCommon
5015       ; Close the file handle to the uninstall.log
5016       ${EndUninstallLog}
5017       ${UpdateFromPreviousLog}
5019     FunctionEnd
5021     !verbose pop
5022   !endif
5023 !macroend
5025 !macro InstallEndCleanupCommonCall
5026   !verbose push
5027   !verbose ${_MOZFUNC_VERBOSE}
5028   Call InstallEndCleanupCommon
5029   !verbose pop
5030 !macroend
5033 ################################################################################
5034 # UAC Related Macros
5037  * Provides UAC elevation support for Vista and above (requires the UAC plugin).
5039  * $0 = return values from calls to the UAC plugin (always uses $0)
5040  * $R9 = return values from GetParameters and GetOptions macros
5041  */
5042 !macro ElevateUAC
5044   !ifndef ${_MOZFUNC_UN}ElevateUAC
5045     !ifdef USE_UAC_PLUGIN
5046       !ifdef ___WINVER__NSH___
5047         !define _MOZFUNC_UN_TMP ${_MOZFUNC_UN}
5048         !insertmacro ${_MOZFUNC_UN_TMP}GetOptions
5049         !insertmacro ${_MOZFUNC_UN_TMP}GetParameters
5050         !undef _MOZFUNC_UN
5051         !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP}
5052         !undef _MOZFUNC_UN_TMP
5053       !endif
5054     !endif
5056     !verbose push
5057     !verbose ${_MOZFUNC_VERBOSE}
5058     !define ${_MOZFUNC_UN}ElevateUAC "!insertmacro ${_MOZFUNC_UN}ElevateUACCall"
5060     Function ${_MOZFUNC_UN}ElevateUAC
5061       ; USE_UAC_PLUGIN is temporary until Thunderbird has been updated to use the UAC plugin
5062       !ifdef USE_UAC_PLUGIN
5063         !ifdef ___WINVER__NSH___
5064           Push $R9
5065           Push $0
5067           ${If} ${AtLeastWinVista}
5068             UAC::IsAdmin
5069             ; If the user is not an admin already
5070             ${If} "$0" != "1"
5071               UAC::SupportsUAC
5072               ; If the system supports UAC
5073               ${If} "$0" == "1"
5074                 UAC::GetElevationType
5075                 ; If the user account has a split token
5076                 ${If} "$0" == "3"
5077                   UAC::RunElevated
5078                   UAC::Unload
5079                   ; Nothing besides UAC initialized so no need to call OnEndCommon
5080                   Quit
5081                 ${EndIf}
5082               ${EndIf}
5083             ${Else}
5084               ${GetParameters} $R9
5085               ${If} $R9 != ""
5086                 ClearErrors
5087                 ${GetOptions} "$R9" "/UAC:" $0
5088                 ; If the command line contains /UAC then we need to initialize
5089                 ; the UAC plugin to use UAC::ExecCodeSegment to execute code in
5090                 ; the non-elevated context.
5091                 ${Unless} ${Errors}
5092                   UAC::RunElevated 
5093                 ${EndUnless}
5094               ${EndIf}
5095             ${EndIf}
5096           ${EndIf}
5098           Pop $0
5099           Pop $R9
5100         !endif
5101       !endif
5102     FunctionEnd
5104     !verbose pop
5105   !endif
5106 !macroend
5108 !macro ElevateUACCall
5109   !verbose push
5110   !verbose ${_MOZFUNC_VERBOSE}
5111   Call ElevateUAC
5112   !verbose pop
5113 !macroend
5115 !macro un.ElevateUACCall
5116   !verbose push
5117   !verbose ${_MOZFUNC_VERBOSE}
5118   Call un.ElevateUAC
5119   !verbose pop
5120 !macroend
5122 !macro un.ElevateUAC
5123   !ifndef un.ElevateUAC
5124     !verbose push
5125     !verbose ${_MOZFUNC_VERBOSE}
5126     !undef _MOZFUNC_UN
5127     !define _MOZFUNC_UN "un."
5129     !insertmacro ElevateUAC
5131     !undef _MOZFUNC_UN
5132     !define _MOZFUNC_UN
5133     !verbose pop
5134   !endif
5135 !macroend
5138  * Unloads the UAC plugin so the NSIS plugins can be removed when the installer
5139  * and uninstaller exit.
5141  * $R9 = return values from GetParameters and GetOptions macros
5142  */
5143 !macro UnloadUAC
5145   !ifndef ${_MOZFUNC_UN}UnloadUAC
5146     !ifdef USE_UAC_PLUGIN
5147       !ifdef ___WINVER__NSH___
5148         !define _MOZFUNC_UN_TMP_UnloadUAC ${_MOZFUNC_UN}
5149         !insertmacro ${_MOZFUNC_UN_TMP_UnloadUAC}GetOptions
5150         !insertmacro ${_MOZFUNC_UN_TMP_UnloadUAC}GetParameters
5151         !undef _MOZFUNC_UN
5152         !define _MOZFUNC_UN ${_MOZFUNC_UN_TMP_UnloadUAC}
5153         !undef _MOZFUNC_UN_TMP_UnloadUAC
5154       !endif
5155     !endif
5157     !verbose push
5158     !verbose ${_MOZFUNC_VERBOSE}
5159     !define ${_MOZFUNC_UN}UnloadUAC "!insertmacro ${_MOZFUNC_UN}UnloadUACCall"
5161     Function ${_MOZFUNC_UN}UnloadUAC
5162       !ifdef USE_UAC_PLUGIN
5163         !ifdef ___WINVER__NSH___
5164           Push $R9
5166           ${Unless} ${AtLeastWinVista}
5167             Return
5168           ${EndUnless}
5170           ClearErrors
5171           ${${_MOZFUNC_UN}GetParameters} $R9
5172           ${${_MOZFUNC_UN}GetOptions} "$R9" "/UAC:" $R9
5173           ; If the command line contains /UAC then we need to unload the UAC plugin
5174           IfErrors +2 +1
5175           UAC::Unload
5177           ClearErrors
5179           Pop $R9
5180         !endif
5181       !endif
5182     FunctionEnd
5184     !verbose pop
5185   !endif
5186 !macroend
5188 !macro UnloadUACCall
5189   !verbose push
5190   !verbose ${_MOZFUNC_VERBOSE}
5191   Call UnloadUAC
5192   !verbose pop
5193 !macroend
5195 !macro un.UnloadUACCall
5196   !verbose push
5197   !verbose ${_MOZFUNC_VERBOSE}
5198   Call un.UnloadUAC
5199   !verbose pop
5200 !macroend
5202 !macro un.UnloadUAC
5203   !ifndef un.UnloadUAC
5204     !verbose push
5205     !verbose ${_MOZFUNC_VERBOSE}
5206     !undef _MOZFUNC_UN
5207     !define _MOZFUNC_UN "un."
5209     !insertmacro UnloadUAC
5211     !undef _MOZFUNC_UN
5212     !define _MOZFUNC_UN
5213     !verbose pop
5214   !endif
5215 !macroend
5218 ################################################################################
5219 # Macros for logging
5221 # Since these are used by other macros they should be inserted first. All of
5222 # these macros can be easily inserted using the _LoggingCommon macro.
5225  * Adds all logging macros in the correct order in one fell swoop as well as
5226  * the vars for the install.log and uninstall.log file handles.
5227  */
5228 !macro _LoggingCommon
5229   Var /GLOBAL fhInstallLog
5230   Var /GLOBAL fhUninstallLog
5231   !insertmacro StartInstallLog
5232   !insertmacro EndInstallLog
5233   !insertmacro StartUninstallLog
5234   !insertmacro EndUninstallLog
5235 !macroend
5236 !define _LoggingCommon "!insertmacro _LoggingCommon"
5239  * Creates a file named install.log in the install directory (e.g. $INSTDIR)
5240  * and adds the installation started message to the install.log for this
5241  * installation. This also adds the fhInstallLog and fhUninstallLog vars used
5242  * for logging.
5244  * $fhInstallLog   = filehandle for $INSTDIR\install.log
5246  * @param   _APP_NAME
5247  *          Typically the BrandFullName
5248  * @param   _AB_CD
5249  *          The locale identifier
5250  * @param   _APP_VERSION
5251  *          The application version
5252  * @param   _GRE_VERSION
5253  *          The Gecko Runtime Engine version
5255  * $R6 = _APP_NAME
5256  * $R7 = _AB_CD
5257  * $R8 = _APP_VERSION
5258  * $R9 = _GRE_VERSION
5259  */
5260 !macro StartInstallLog
5262   !ifndef StartInstallLog
5263     !insertmacro GetTime
5265     !verbose push
5266     !verbose ${_MOZFUNC_VERBOSE}
5267     !define StartInstallLog "!insertmacro StartInstallLogCall"
5269     Function StartInstallLog
5270       Exch $R9
5271       Exch 1
5272       Exch $R8
5273       Exch 2
5274       Exch $R7
5275       Exch 3
5276       Exch $R6
5277       Push $R5
5278       Push $R4
5279       Push $R3
5280       Push $R2
5281       Push $R1
5282       Push $R0
5283       Push $9
5285       FileOpen $fhInstallLog "$INSTDIR\install.log" w
5287       ${GetTime} "" "L" $9 $R0 $R1 $R2 $R3 $R4 $R5
5288       FileWrite $fhInstallLog "$R6 Installation Started: $R1-$R0-$9 $R3:$R4:$R5"
5289       ${WriteLogSeparator}
5291       ${LogHeader} "Installation Details"
5292       ${LogMsg} "Install Dir: $INSTDIR"
5293       ${LogMsg} "Locale     : $R7"
5294       ${LogMsg} "App Version: $R8"
5295       ${LogMsg} "GRE Version: $R9"
5297       Pop $9
5298       Pop $R0
5299       Pop $R1
5300       Pop $R2
5301       Pop $R3
5302       Pop $R4
5303       Pop $R5
5304       Exch $R6
5305       Exch 3
5306       Exch $R7
5307       Exch 2
5308       Exch $R8
5309       Exch 1
5310       Exch $R9
5311     FunctionEnd
5313     !verbose pop
5314   !endif
5315 !macroend
5317 !macro StartInstallLogCall _APP_NAME _AB_CD _APP_VERSION _GRE_VERSION
5318   !verbose push
5319   !verbose ${_MOZFUNC_VERBOSE}
5320   Push "${_APP_NAME}"
5321   Push "${_AB_CD}"
5322   Push "${_APP_VERSION}"
5323   Push "${_GRE_VERSION}"
5324   Call StartInstallLog
5325   !verbose pop
5326 !macroend
5329  * Writes the installation finished message to the install.log and closes the
5330  * file handles to the install.log and uninstall.log
5332  * @param   _APP_NAME
5334  * $R9 = _APP_NAME
5335  */
5336 !macro EndInstallLog
5338   !ifndef EndInstallLog
5339     !insertmacro GetTime
5341     !verbose push
5342     !verbose ${_MOZFUNC_VERBOSE}
5343     !define EndInstallLog "!insertmacro EndInstallLogCall"
5345     Function EndInstallLog
5346       Exch $R9
5347       Push $R8
5348       Push $R7
5349       Push $R6
5350       Push $R5
5351       Push $R4
5352       Push $R3
5353       Push $R2
5354       
5355       ${WriteLogSeparator}
5356       ${GetTime} "" "L" $R2 $R3 $R4 $R5 $R6 $R7 $R8
5357       FileWrite $fhInstallLog "$R9 Installation Finished: $R4-$R3-$R2 $R6:$R7:$R8$\r$\n"
5358       FileClose $fhInstallLog
5360       Pop $R2
5361       Pop $R3
5362       Pop $R4
5363       Pop $R5
5364       Pop $R6
5365       Pop $R7
5366       Pop $R8
5367       Exch $R9
5368     FunctionEnd
5370     !verbose pop
5371   !endif
5372 !macroend
5374 !macro EndInstallLogCall _APP_NAME
5375   !verbose push
5376   !verbose ${_MOZFUNC_VERBOSE}
5377   Push "${_APP_NAME}"
5378   Call EndInstallLog
5379   !verbose pop
5380 !macroend
5383  * Opens the file handle to the uninstall.log.
5385  * $fhUninstallLog = filehandle for $INSTDIR\uninstall\uninstall.log
5386  */
5387 !macro StartUninstallLog
5389   !ifndef StartUninstallLog
5390     !verbose push
5391     !verbose ${_MOZFUNC_VERBOSE}
5392     !define StartUninstallLog "!insertmacro StartUninstallLogCall"
5394     Function StartUninstallLog
5395       FileOpen $fhUninstallLog "$INSTDIR\uninstall\uninstall.log" w
5396     FunctionEnd
5398     !verbose pop
5399   !endif
5400 !macroend
5402 !macro StartUninstallLogCall
5403   !verbose push
5404   !verbose ${_MOZFUNC_VERBOSE}
5405   Call StartUninstallLog
5406   !verbose pop
5407 !macroend
5410  * Closes the file handle to the uninstall.log.
5411  */
5412 !macro EndUninstallLog
5414   !ifndef EndUninstallLog
5416     !verbose push
5417     !verbose ${_MOZFUNC_VERBOSE}
5418     !define EndUninstallLog "!insertmacro EndUninstallLogCall"
5420     Function EndUninstallLog
5421       FileClose $fhUninstallLog
5422     FunctionEnd
5424     !verbose pop
5425   !endif
5426 !macroend
5428 !macro EndUninstallLogCall
5429   !verbose push
5430   !verbose ${_MOZFUNC_VERBOSE}
5431   Call EndUninstallLog
5432   !verbose pop
5433 !macroend
5436  * Adds a section header to the human readable log.
5438  * @param   _HEADER
5439  *          The header text to write to the log.
5440  */
5441 !macro LogHeader _HEADER
5442   ${WriteLogSeparator}
5443   FileWrite $fhInstallLog "${_HEADER}"
5444   ${WriteLogSeparator}
5445 !macroend
5446 !define LogHeader "!insertmacro LogHeader"
5449  * Adds a section message to the human readable log.
5451  * @param   _MSG
5452  *          The message text to write to the log.
5453  */
5454 !macro LogMsg _MSG
5455   FileWrite $fhInstallLog "  ${_MSG}$\r$\n"
5456 !macroend
5457 !define LogMsg "!insertmacro LogMsg"
5460  * Adds an uninstall entry to the uninstall log.
5462  * @param   _MSG
5463  *          The message text to write to the log.
5464  */
5465 !macro LogUninstall _MSG
5466   FileWrite $fhUninstallLog "${_MSG}$\r$\n"
5467 !macroend
5468 !define LogUninstall "!insertmacro LogUninstall"
5471  * Adds a section divider to the human readable log.
5472  */
5473 !macro WriteLogSeparator
5474   FileWrite $fhInstallLog "$\r$\n----------------------------------------\
5475                            ---------------------------------------$\r$\n"
5476 !macroend
5477 !define WriteLogSeparator "!insertmacro WriteLogSeparator"