From 65a05a3075e9aa3c8ff25b80f4865ca2efebcfca Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sat, 8 Oct 2016 23:53:08 +0200 Subject: Packaging: move NSIS plugins and macros to /plugins and /macros subdirs (bzr r15244.1.3) --- packaging/win32/AdvUninstLog.nsh | 437 ------------------------- packaging/win32/AdvUninstLog.txt | 121 ------- packaging/win32/MessageBox.txt | 186 ----------- packaging/win32/RequireLatestNSIS.nsh | 9 - packaging/win32/VersionCompleteXXXX.nsh | 60 ---- packaging/win32/ifexist.nsh | 21 -- packaging/win32/inkscape.nsi | 10 +- packaging/win32/macros/AdvUninstLog.nsh | 437 +++++++++++++++++++++++++ packaging/win32/macros/AdvUninstLog.txt | 121 +++++++ packaging/win32/macros/RequireLatestNSIS.nsh | 9 + packaging/win32/macros/VersionCompleteXXXX.nsh | 60 ++++ packaging/win32/macros/ifexist.nsh | 21 ++ packaging/win32/md5dll.dll | Bin 8192 -> 0 bytes packaging/win32/md5dll.txt | 68 ---- packaging/win32/messagebox.dll | Bin 6144 -> 0 bytes packaging/win32/plugins/MessageBox.txt | 186 +++++++++++ packaging/win32/plugins/md5dll.dll | Bin 0 -> 8192 bytes packaging/win32/plugins/md5dll.txt | 68 ++++ packaging/win32/plugins/messagebox.dll | Bin 0 -> 6144 bytes 19 files changed, 907 insertions(+), 907 deletions(-) delete mode 100644 packaging/win32/AdvUninstLog.nsh delete mode 100644 packaging/win32/AdvUninstLog.txt delete mode 100644 packaging/win32/MessageBox.txt delete mode 100644 packaging/win32/RequireLatestNSIS.nsh delete mode 100644 packaging/win32/VersionCompleteXXXX.nsh delete mode 100644 packaging/win32/ifexist.nsh create mode 100644 packaging/win32/macros/AdvUninstLog.nsh create mode 100644 packaging/win32/macros/AdvUninstLog.txt create mode 100644 packaging/win32/macros/RequireLatestNSIS.nsh create mode 100644 packaging/win32/macros/VersionCompleteXXXX.nsh create mode 100644 packaging/win32/macros/ifexist.nsh delete mode 100644 packaging/win32/md5dll.dll delete mode 100644 packaging/win32/md5dll.txt delete mode 100644 packaging/win32/messagebox.dll create mode 100644 packaging/win32/plugins/MessageBox.txt create mode 100644 packaging/win32/plugins/md5dll.dll create mode 100644 packaging/win32/plugins/md5dll.txt create mode 100644 packaging/win32/plugins/messagebox.dll diff --git a/packaging/win32/AdvUninstLog.nsh b/packaging/win32/AdvUninstLog.nsh deleted file mode 100644 index f48049164..000000000 --- a/packaging/win32/AdvUninstLog.nsh +++ /dev/null @@ -1,437 +0,0 @@ - ;_____________________________ HEADER FILE BEGIN ____________________________ - - # Advanced Uninstall Log NSIS header - # Version 1.0 2007-01-31 - # By Red Wine (http://nsis.sf.net/User:Red_Wine) - - # Usage: See included examples Uninstall_Log_Default_UI.nsi - Uninstall_Log_Modern_UI.nsi - -!verbose push - !verbose 3 - -!ifndef ADVANCED_UNINSTALL.LOG_NSH - !define ADVANCED_UNINSTALL.LOG_NSH - -!ifndef INSTDIR_REG_ROOT | INSTDIR_REG_KEY - !error "You must properly define both INSTDIR_REG_ROOT and INSTDIR_REG_KEY" -!endif - -!ifndef UNINSTALL_LOG - !define UNINSTALL_LOG "Uninstall" -!endif - -!ifndef UNINST_LOG_VERBOSE - !define UNINST_LOG_VERBOSE "3" -!endif - -!verbose pop - -!echo "Advanced Uninstall Log NSIS header v1.0 2007-01-31 by Red Wine (http://nsis.sf.net/User:Red_Wine)" - -!verbose push - !verbose ${UNINST_LOG_VERBOSE} - -!define UNINST_EXE "$INSTDIR\${UNINSTALL_LOG}.exe" -!define UNINST_DAT "$INSTDIR\${UNINSTALL_LOG}.dat" -!define UNLOG_PART "$PLUGINSDIR\part." -!define UNLOG_TEMP "$PLUGINSDIR\unlog.tmp" -!define EXCLU_LIST "$PLUGINSDIR\exclude.tmp" -!define UNLOG_HEAD "=========== Uninstaller Log please do not edit this file ===========" - - var unlog_tmp_0 - var unlog_tmp_1 - var unlog_tmp_2 - var unlog_tmp_3 - var unlog_error - -!include FileFunc.nsh -!include TextFunc.nsh - -!insertmacro Locate -!insertmacro un.Locate -!insertmacro DirState -!insertmacro un.DirState -!insertmacro FileJoin -!insertmacro TrimNewLines -!insertmacro un.TrimNewLines - -;.............................. Uninstaller Macros .............................. - -!macro UNINSTALL.LOG_BEGIN_UNINSTALL - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - IfFileExists "${UNINST_DAT}" +3 - MessageBox MB_ICONSTOP|MB_OK "${UNINST_DAT} not found, unable to perform uninstall." /SD IDOK - Quit - - StrCmp "$PLUGINSDIR" "" 0 +2 - InitPluginsDir - - CopyFiles "${UNINST_DAT}" "${UNLOG_TEMP}" - FileOpen $unlog_tmp_2 "${UNLOG_TEMP}" r - - !verbose pop -!macroend - - -!macro UNINSTALL.LOG_END_UNINSTALL - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - FileClose $unlog_tmp_2 - DeleteRegValue ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}.dat" - DeleteRegValue ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" - - !verbose pop -!macroend - - -!macro UNINSTALL.LOG_UNINSTALL TargetDir - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - !ifndef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL - !error "You must insert either Interactive or Unattended Uninstall neither both, neither none." - !endif - - !ifdef INTERACTIVE_UNINSTALL - GetTempFileName $unlog_tmp_5 "$PLUGINSDIR" - FileOpen $unlog_tmp_4 "$unlog_tmp_5" a - !endif - - ${PerfomUninstall} "${TargetDir}" "${UnLog_Uninstall_CallBackFunc}" - - !ifdef INTERACTIVE_UNINSTALL - FileClose $unlog_tmp_4 - !endif - - !verbose pop -!macroend - - -!define PerfomUninstall "!insertmacro PERFORMUNINSTALL" - -!macro PERFORMUNINSTALL TargetDir UninstCallBackFunc - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - !define ID ${__LINE__} - - ${un.Locate} "${TargetDir}" "/L=F" "${UninstCallBackFunc}" - - loop_${ID}: - - StrCpy $unlog_tmp_1 0 - - ${un.Locate} "${TargetDir}" "/L=DE" "${UninstCallBackFunc}" - StrCmp $unlog_tmp_1 "0" 0 loop_${ID} - - ${un.DirState} "${TargetDir}" $unlog_tmp_0 - StrCmp "$unlog_tmp_0" "0" 0 +2 - RmDir "${TargetDir}" - - IfErrors 0 +2 - MessageBox MB_ICONEXCLAMATION|MB_OK "${UNINSTALL_LOG} Log error" /SD IDOK - - !undef ID - - !verbose pop -!macroend - - -!macro INTERACTIVE_UNINSTALL - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - !ifdef INTERACTIVE_UNINSTALL - !error "INTERACTIVE_UNINSTALL is already defined" - !endif - - var unlog_tmp_4 - var unlog_tmp_5 - - !define INTERACTIVE_UNINSTALL - - !ifdef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL - !error "You must insert either Interactive or Unattended Uninstall neither both, neither none." - !endif - - !ifdef UnLog_Uninstall_CallBackFunc - !undef UnLog_Uninstall_CallBackFunc - !endif - - !ifndef UnLog_Uninstall_CallBackFunc - !insertmacro UNINSTALL.LOG_UNINSTALL_INTERACTIVE - !define UnLog_Uninstall_CallBackFunc "un._LocateCallBack_Function_Interactive" - !endif - - !verbose pop -!macroend - - -!macro UNATTENDED_UNINSTALL - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - !ifdef UNATTENDED_UNINSTALL - !error "UNATTENDED_UNINSTALL is already defined" - !endif - - !define UNATTENDED_UNINSTALL - - !ifdef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL - !error "You must insert either Interactive or Unattended Uninstall neither both, neither none." - !endif - - !ifdef UnLog_Uninstall_CallBackFunc - !undef UnLog_Uninstall_CallBackFunc - !endif - - !ifndef UnLog_Uninstall_CallBackFunc - !insertmacro UNINSTALL.LOG_UNINSTALL_UNATTENDED - !define UnLog_Uninstall_CallBackFunc "un._LocateCallBack_Function_Unattended" - !endif - - !verbose pop -!macroend - - -!macro UNINSTALL.LOG_UNINSTALL_UNATTENDED - - Function un._LocateCallBack_Function_Unattended - start: - FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} - ${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" - StrCmp "$unlog_tmp_3" "$R9" islog - IfErrors nolog - goto start - - islog: - IfFileExists "$R9\*.*" isdir - - isfile: - Delete "$R9" - goto end - - isdir: - RmDir "$R9" - IntOp $unlog_tmp_1 $unlog_tmp_1 + 1 - goto end - - nolog: - ClearErrors - StrCmp "$R9" "${UNINST_EXE}" isfile - StrCmp "$R9" "${UNINST_DAT}" isfile - - end: - FileSeek $unlog_tmp_2 0 SET - Push $unlog_tmp_0 - FunctionEnd - -!macroend - - -!macro UNINSTALL.LOG_UNINSTALL_INTERACTIVE - - Function un._LocateCallBack_Function_Interactive - start: - FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} - ${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" - StrCmp "$unlog_tmp_3" "$R9" islog - IfErrors nolog - goto start - - islog: - IfFileExists "$R9\*.*" isdir - - isfile: - Delete "$R9" - goto end - - isdir: - RmDir "$R9" - IntOp $unlog_tmp_1 $unlog_tmp_1 + 1 - goto end - - nolog: - ClearErrors - FileSeek $unlog_tmp_4 0 SET - read: - FileRead $unlog_tmp_4 "$unlog_tmp_3" - ${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" - StrCmp "$unlog_tmp_3" "$R9" end - IfErrors +2 - goto read - ClearErrors - StrCmp "$R9" "${UNINST_EXE}" isfile - StrCmp "$R9" "${UNINST_DAT}" isfile - IfFileExists "$R9\*.*" msgdir - - MessageBox MB_ICONQUESTION|MB_YESNO \ - 'Delete File "$R9"?' /SD IDNO IDYES isfile IDNO nodel - - msgdir: - MessageBox MB_ICONQUESTION|MB_YESNO \ - 'Delete Directory "$R9"?' /SD IDNO IDYES isdir IDNO nodel - - nodel: - FileSeek $unlog_tmp_4 0 END - FileWrite $unlog_tmp_4 "$R9$\r$\n" - - end: - FileSeek $unlog_tmp_2 0 SET - Push $unlog_tmp_0 - FunctionEnd - -!macroend - -;................................. Installer Macros ................................. - -!macro UNINSTALL.LOG_INSTALL_UNATTENDED - - Function _LocateCallBack_Function_Install - loop: - FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} - ${TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" - IfErrors 0 +4 - ClearErrors - FileSeek $unlog_tmp_2 0 SET - goto next - StrCmp "$R9" "$unlog_tmp_3" end - goto loop - next: - FileWrite $unlog_tmp_1 "$R9$\r$\n" - end: - Push $unlog_tmp_0 - FunctionEnd - -!macroend - - -!ifdef UnLog_Install_Func_CallBack - !undef UnLog_Install_Func_CallBack -!endif - -!ifndef UnLog_Install_Func_CallBack - !insertmacro UNINSTALL.LOG_INSTALL_UNATTENDED - !define UnLog_Install_Func_CallBack "_LocateCallBack_Function_Install" -!endif - - -!macro UNINSTALL.LOG_PREPARE_INSTALL - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - Push $0 - Push $1 - ClearErrors - ReadRegStr "$0" ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" - IfErrors next - ${DirState} "$0" $1 - StrCmp "$1" "-1" next - StrCmp "$1" "0" next - IfFileExists "$0\${UNINSTALL_LOG}.dat" next - MessageBox MB_ICONEXCLAMATION|MB_OK \ - "Previous installation detected at $0.$\n\ - Required file ${UNINSTALL_LOG}.dat is missing.$\n$\nIt is highly recommended \ - to select an empty directory and perform a fresh installation." /SD IDOK - StrCpy $unlog_error "error" - - next: - ClearErrors - StrCmp "$PLUGINSDIR" "" 0 +2 - InitPluginsDir - - GetTempFileName "$1" - FileOpen $0 "$1" w - FileWrite $0 "${UNLOG_HEAD}$\r$\n" - FileClose $0 - Rename "$1" "${UNLOG_TEMP}" - Pop $1 - Pop $0 - - !verbose pop -!macroend - - -!macro UNINSTALL.LOG_UPDATE_INSTALL - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - Delete "${UNINST_DAT}" - Rename "${UNLOG_TEMP}" "${UNINST_DAT}" - WriteUninstaller "${UNINST_EXE}" - WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}.dat" "${UNINST_DAT}" - WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" "$INSTDIR" - - !verbose pop -!macroend - - -!define uninstall.log_install "!insertmacro UNINSTALL.LOG_INSTALL" - -!macro UNINSTALL.LOG_INSTALL FileOpenWrite FileOpenRead TargetDir - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - FileOpen $unlog_tmp_1 "${FileOpenWrite}" w - FileOpen $unlog_tmp_2 "${FileOpenRead}" r - - ${Locate} "${TargetDir}" "/L=FD" "${UnLog_Install_Func_CallBack}" - - StrCmp $unlog_error "error" 0 +2 - ClearErrors - - IfErrors 0 +2 - MessageBox MB_ICONEXCLAMATION|MB_OK "Error creating ${UNINSTALL_LOG} Log." /SD IDOK - - FileClose $unlog_tmp_1 - FileClose $unlog_tmp_2 - - !verbose pop -!macroend - - -!define uninstall.log_mergeID "!insertmacro UNINSTALL.LOG_MERGE" - -!macro UNINSTALL.LOG_MERGE UnlogPart - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - ${FileJoin} "${UNLOG_TEMP}" "${UnlogPart}" "${UNLOG_TEMP}" - - !verbose pop -!macroend - - -!macro UNINSTALL.LOG_OPEN_INSTALL - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - StrCmp $unlog_error "error" +2 - ${uninstall.log_install} "${EXCLU_LIST}" "${UNINST_DAT}" "$OUTDIR" - - !verbose pop -!macroend - - -!macro UNINSTALL.LOG_CLOSE_INSTALL - !verbose push - !verbose ${UNINST_LOG_VERBOSE} - - !define ID ${__LINE__} - - ${uninstall.log_install} "${UNLOG_PART}${ID}" "${EXCLU_LIST}" "$OUTDIR" - ${uninstall.log_mergeID} "${UNLOG_PART}${ID}" - - !undef ID ${__LINE__} - - !verbose pop -!macroend - -!endif - -!verbose pop - ;_____________________________ HEADER FILE END ____________________________ - diff --git a/packaging/win32/AdvUninstLog.txt b/packaging/win32/AdvUninstLog.txt deleted file mode 100644 index c294c3df2..000000000 --- a/packaging/win32/AdvUninstLog.txt +++ /dev/null @@ -1,121 +0,0 @@ -Overview - -Advanced Uninstall Log for NSIS was born in the need to cover a specific gap. -It's been discussed fairly enough that the File /r command is very useful -in cases when developers want to add a huge amount of sub directories and -files, nevertheless it has the disadvantage that such an installation should -be uninstalled with RmDir /r which is risky and removes also data that has -been added/created later within the installation folder. - - - - -About Advanced Uninstall Log. - -Advanced Uninstall Log is a macro system provided in a NSIS header that -is able to monitor an installation and build an uninstall log file which -is used by the uninstaller to uninstall files/directories that have been -added within specific installation blocks. - -This means that files which have been installed outside these blocks, -or added later either by the user or application's activities, ignored -by the uninstaller. - -Moreover files that might exist into the target directory prior the current -installation, ignored as well. - -Advanced Uninstall Log creates an uninstall log that removes only files that -have been installed and optionally interacts with users for every other file -and/or directory has found in installation folder and requires permission to -remove these files/directories. - -It is enhanced as well to support updates, e.g. if the installer later would -update the installation by adding new data, the uninstaller would remove the -new data that has been added by the installer, without bothering users about. - - - - -Features - -If target installation folder exists and contains files and/or directories -they all preserved from being uninstalled. - -Uninstaller removes data that has been added within specific installation -blocks, preserving all other data that has been created/added outside of -these installation blocks. See included examples for details. - -Supports unlimited updates/reinstallations. - -Supports two uninstaller modes. Interactive mode requires confirmation -to remove every other file exept those files that have been installed. -Unattended mode leaves intact every other file without bothering users. - -In case when uninstall log (uninstall.dat) has been removed manually instead -of execute uninstaller, if users attempt to run the installer later, a warning -issued that they should select a new output folder. - -Implements only the included with NSIS release headers FileFunc and TextFunc. -There is no need for external plugins and headers, adds a very small overhead. - - - - -Restrictions - -If uninstall log (uninstall.dat) is missing uninstaller won't execute at all. - -Due to file create - write procedure that is required in order to add/update -the uninstall log (uninstall.dat), restricted users on NT based systems won't -be able to execute the installer. - - - - -Disadvantage - -Since the header does not implement anything else than the common NSIS release, -a delay occurs while builds and reads the uninstall log because it needs to -throw the list several times. Talking for common cases, most likely the delay -won't be noticeable, however, in cases where the target directory isn't empty -and contains a large amount of data which will be excluded from uninstall log, -or added large amount of data after the installation which will be excluded also, -the delay should be noticeable. - - - - -Credits - -A very big thanks goes to kichik. -When my idea of the Advanced Uninstall Log became an NSIS header, it was -indeed an amateur's attempt to write a flexible and errors free NSIS header. -Kichik dropped me a dozen of suggestions helping me to achieve my plan. -However, his main suggestion to eliminate the mentioned above disadvantage, -still remains untouched by me. - - - - -License - -This header file is provided 'as-is', without any express or implied warranty. -In no event will the author be held liable for any damages arising from the use -of this header file. - -Permission is granted to anyone to use this header file for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - - 1. The origin of this header file must not be misrepresented; - you must not claim that you wrote the original header file. - If you use this header file in a product, an acknowledgment in - the product documentation would be appreciated but is not required. - - 2. Altered versions must be plainly marked as such, and must not be - misrepresented as being the original header file. - - 3. This notice may not be removed or altered from any distribution. - - -eof \ No newline at end of file diff --git a/packaging/win32/MessageBox.txt b/packaging/win32/MessageBox.txt deleted file mode 100644 index c2aa963d6..000000000 --- a/packaging/win32/MessageBox.txt +++ /dev/null @@ -1,186 +0,0 @@ -Customisable MessageBox Plug-In (v0.98 beta 3) - -[ Archive Page: http://nsis.sourceforge.net/archive/??? ] - --------------- - -The Customisable MessageBox plug-in allows you to use a MessageBox in your installer which can be altered to how you want it to be. You can control: - * the number of buttons shown - * the text each button shows - * a standard or customisable icon ( flexible so you can use the installer or other files ) - * a fully working 'forth' button! - -The plug-in uses a few tricks to allow for the messagebox functionality to be altered so that the button text can finally be altered making [ Yes | Yes to All | No | No to All ] ( and anything else you care for ) possible. - -Also with the changes made it is now possible to have a functional 'forth' button - yes you read correctly! When using the function just pass in four button texts and you will see the forth button - simple really :o) - -There is only the one function to show the messagebox so enjoy. - -[ As of v0.98 beta the parameters of calling the function have changed, check out usage for the revised options - thanks to n0On3 for the suggestions. ] - - -Usage ------ - -messagebox::show styles caption ( module_name, icon_id ) text but1 [ but2 but3 but4 ] - -styles - messagebox styles ( supports most of the windows messagebox styles ) - -caption - the text to be used for the dialog title ( or the installer title if not specified ) - -module_name - sets the name of the file ( usually a dll or exe file ) that contains the custom icon to be used - if 0 is passed then the installer will be used - -icon_id - the id of the icon group to be used for the custom icon - -text - the text to be shown by the messagebox - -but1 - specified text or name id to use ie IDYES, IDNO, etc ( there must always be at least one button ) - -but2, but3, but4 - optional buttons which follow the same way as for but1 - - -When passing in options, you should use a "" pair for options you pass in to ensure the strings are correctly read. It is not necessary to do so for the predefined button texts -e.g. "IDCANCEL" is the same as IDCANCEL. - -See Example.nsi for an example ;o) ( bit hacked at the moment due to testing but shows most things ) - - -Return Values ------ - -To get the return value use Pop $0 immediately after the function has been used incase other functions alter the value. - -If there were no problems then the function will return the number of the button pressed working from the left being 'button 1'. -i.e. - if you have [ yes | no | abort ] and 'no' is selected then the return value will be '2' - -If an error happens then the messagebox will return 0. - -If there are no buttons passed then the function will return '-1'. - - -Some More Info ----------------- - -If you pass an empty string for the caption ( "" ) then the installer title text will be used instead (stripping back the current section name as NSIS messageboxes do). -If the installer is run silently then the title will be blank if setting the caption option to "" ( as NSIS messageboxes do ). This is because when the installer is silent it does not have a visible window and so will not have a window title ( had not taken this into account initially, oops - fixed from v0.98 beta 3 ). - -When you want to use a custom icon, setting module to '0' will look for the icon in the installer otherwise it will search the file specified. -e.g. - "0,103" will load the installer icon ( well in testing it does :o) ) - "shell32.dll,24" will load the help file icon from the shell32.dll ( as long as the file exists! ) - -If the module passed is not valid then the usericon style will not be used ( you may receive a windows message informing of this ). - -If the icon is not valid then the messagebox will just show a blank area where the icon would be displayed assuming that the value of module is valid. - -If a usericon is specified then if there are any of the messagebox icon styles passed in, these will be ignored. This allows an icon to appear otherwise internal style conflicts will prevent any icon being shown. - -If you want to display the standard button texts then pass the following strings in for the necessary button: - - IDOK - Ok - IDCANCEL - Cancel - IDABORT - Abort - IDRETRY - Retry - IDIGNORE - Ignore - IDYES - Yes - IDNO - No - IDHELP - Help / 4th button - IDTRYAGAIN - Try Again - IDCONTINUE - Continue - -When the function is processing the passed button texts to use, if a duplicate of the predefined texts (above) happen then the only the first instance will be allowed -e.g. - IDYES "ah go on if you dare" IDYES -> [ YES | ah go on if you dare ] - -Each button will be resized if needed to allow the text to fit correctly in the button without being clipped. If the text is still too long for the messagebox width ( limited to 80% of the screen width ) then buttons will be resized and clipping of the button text may happen again ( this will be fixed in v1.0 ). - - -Final Notes -------- - -I have no idea how the code will work with international text (since i just use plain text in the code) so if you try it in a multilanguage setup then let me know how it reacts or if there are any issues with the function's display. - -The predefined button texts are hard coded and cannot be altered. To alter the default texts involves passing in the language button text as a custom button text. - -The button resizing code is not complete at the moment ( as can be clearly seen from the first messagebox ) when it detects that the width of the messagebox is at the 80% screen width. Issues are that the buttons are not correctly resized to ensure that they appear correctly ( as is the case with the second messagebox ). This is more down to fiddling with the button widths after the initial processing but will be fixed soon :o) - - -Credits -------- - -Coded by Darren Owen, aka DrO (Sept 2003) - -n0On3 - Idea request and helpful feedback ( the simplified function use over previous versions :o) ) - -A plugin from me to you :o) - - -Version History -------- - -v0.1 -* Initial release of the function -* Basic support to show that the button text can be altered on the messagebox -* Inital support for controlling the number of buttons shown - -v0.5 -* Setting of text of only the buttons wanted ( "/but? blah" ) -* Now if a string is not passed then the text will not be set (broken in the v0.1 release) -* Altered a lot of internal workings to allow for more customising of the MessageBox -* Better support for the number of buttons to show -* The functional '4th' button - making use of the 'Help' button to act as a real button -* Fixed a number of crash issues due to buffer sizes and a few other bugs, etc - -v0.8 -* A lot of changes made :o) -* Improved internal handling so that now button text is set correctly either when the number of buttons is set or user styles are set so now "/but2 blah" will always set the second buttons text and not just a few cases as beforehand -* Altered the order of the parameters from earlier versions to make some internals easier to do :o) -* The 4th / Help button will now close the MessageBox in ALL cases - would not close correctly if there was not a 'cancel' button in earlier versions -* Buffers are now allocated to the NSIS buffer sizes passed to the dll on use for better compatibility between dll and installer -* When the button numbers are set, the function will map the returned value now to the button selected instead of the normal wndows defined return value -* some other bits and bobs that i've forgotten on the way - -v0.9 -* Added in support for displaying custom icons on the messagebox ( along with standard icons which can be shown ) either in the installer or from other files -* Altered the example script to show off some more bits of what it can do - -v0.95 beta -* Added in support for resizing of buttons based on the text set into the button ( use the /trim before the text to be set ) -* Messagebox is now limited to approximately 80% of the screen size ( as the messagebox normally does ) -* The resizing of button texts will also update the width of the text width to ensure it keeps to the size of the messagebox -* Support is not complete for /trim ( still need to update the graduating of the width increment ) -* When the 80% width is reached, currently buttons will disappear off the messagebox ( handling for a double height button will come to cope with this soon ) -* Altered the example script to show off some more bits of what it can do - -v0.98 beta -* Removed the passing in of a hwnd parameter - is always owned by the installer -* Altered the custom icon option to be a single parameter now in the form 'module,id' where module can be 0 to use the installer -* All return values are now mapped to the button number pressed ie 1,2,etc -* Now the number of buttons to show is based on the button string texts passed in to the function :o) -* Altered the order of parameters to work in a top to bottom order with respect to the messagebox layout and to match closer to the NSIS setup -[ a good suggestion from n0On3 - nice ] -- now goes: style title usericon text but1 [ but2 but3 but4 ] -* Altered the button texts to be set in the order passed and will also convert the default ids too! eg IDYES -> "Yes", IDIGNORE -> "Ignore" -* Fixed the graduating of the button trim feature to appear 'natural' -[ adds approxiamately 3 character widths either side when the text won't fit fully in the button ] -* Fixed a few bugs in the code introduced in the changes made -* Support for MB_DEFBUTTON? is broken when a button has to be resized ( will fix this soon - already worked out how to but not why this happens ) - -v0.98 beta 2 -* Fixed the MB_DEFBUTTON? issue ( needed to prevent the wm_active message being handled ) -* Verified the installer will show icons correctly if the installer is run silently ( no code changes were made ) -* Added in checking of the defined buttons to ensure that duplicates are not allowed (only the first occurrance is allowed) -* Checked that all strings are verified for having data before being used -* A few code tidy-ups introduced to the code -* Typo fix in the example -* Added in stripping out of the icon definitions if a user icon is specified (otherwise no icon will appear!) -* Updated the readme file to reflect the changes made to the plug-in's functionality since v0.98 beta and to clarify things in better detail now ( i hope ) -* Added in a reference to the archive page for the plugin ( will upload majority of this file to the archive ) -* All internal buffers are now set to the buffer size passed into the plugin when it is called and altered how they are referenced -* Fixed how the module string is cleared, should fix a potential crash issue i hope -* Partially fixed the resizing of the text area when using long button strings to correctly limit out when the 80% limit is reached ( fine when now icon is used at the moment ) -* Added a silent installer option to the example script, just !define SILENT to get the silent version (should show that the function works fine either in a normal or silent installer) - -v0.98 beta 3 -* Fixed a crash when a silent installer is run ( pointed out by n0On3 ) - not checking the string length when getting the installer title if ""is the pased caption value, doh! \ No newline at end of file diff --git a/packaging/win32/RequireLatestNSIS.nsh b/packaging/win32/RequireLatestNSIS.nsh deleted file mode 100644 index 70371552a..000000000 --- a/packaging/win32/RequireLatestNSIS.nsh +++ /dev/null @@ -1,9 +0,0 @@ -!if `${NSIS_VERSION}` == `v2.45` - !error "There is a bug in !searchparse which makes this script not compile in NSIS 2.45. Please upgrade to NSIS 2.46 or later and try again." -!else - !echo "(If you get a compile error with !searchparse, please upgrade to NSIS 2.46 or later and try again.)" -!endif -!searchparse ${NSIS_VERSION} "v" V -!if ${V} < 2.46 - !error "You only have NSIS ${V}, but NSIS 2.46 or later is required for proper Windows 7 support. Please upgrade to NSIS 2.46 or later and try again." -!endif diff --git a/packaging/win32/VersionCompleteXXXX.nsh b/packaging/win32/VersionCompleteXXXX.nsh deleted file mode 100644 index 6ea780508..000000000 --- a/packaging/win32/VersionCompleteXXXX.nsh +++ /dev/null @@ -1,60 +0,0 @@ -; See http://nsis.sourceforge.net/VersionCompleteXXXX for documentation -!macro VersionCompleteXXXRevision _INPUT_VALUE _OUTPUT_SYMBOL _REVISION - !searchparse /noerrors ${_INPUT_VALUE} "" _VERSION_1 "." _VERSION_2 "." _VERSION_3 "." _VERSION_4 - !ifndef _VERSION_1 - !define _VERSION_1 0 - !else if `${_VERSION_1}` == `` - !define /redef _VERSION_1 0 - !endif - !ifndef _VERSION_2 - !define _VERSION_2 0 - !else if `${_VERSION_2}` == `` - !define /redef _VERSION_2 0 - !endif - !ifndef _VERSION_3 - !define _VERSION_3 0 - !else if `${_VERSION_3}` == `` - !define /redef _VERSION_3 0 - !endif - !ifndef _VERSION_4 - !define _VERSION_4 0 - !else if `${_VERSION_4}` == `` - !define /redef _VERSION_4 0 - !endif - !define ${_OUTPUT_SYMBOL} ${_VERSION_1}.${_VERSION_2}.${_VERSION_3}.${_REVISION} - !undef _VERSION_1 - !undef _VERSION_2 - !undef _VERSION_3 - !undef _VERSION_4 - !undef _REVISION -!macroend -!define VersionCompleteXXXRevision `!insertmacro VersionCompleteXXXRevision` -!macro VersionCompleteXXXX _INPUT_VALUE _OUTPUT_SYMBOL - !searchparse /noerrors ${_INPUT_VALUE} "" _VERSION_1 "." _VERSION_2 "." _VERSION_3 "." _VERSION_4 - !ifndef _VERSION_1 - !define _VERSION_1 0 - !else if `${_VERSION_1}` == `` - !define /redef _VERSION_1 0 - !endif - !ifndef _VERSION_2 - !define _VERSION_2 0 - !else if `${_VERSION_2}` == `` - !define /redef _VERSION_2 0 - !endif - !ifndef _VERSION_3 - !define _VERSION_3 0 - !else if `${_VERSION_3}` == `` - !define /redef _VERSION_3 0 - !endif - !ifndef _VERSION_4 - !define _VERSION_4 0 - !else if `${_VERSION_4}` == `` - !define /redef _VERSION_4 0 - !endif - !define ${_OUTPUT_SYMBOL} ${_VERSION_1}.${_VERSION_2}.${_VERSION_3}.${_VERSION_4} - !undef _VERSION_1 - !undef _VERSION_2 - !undef _VERSION_3 - !undef _VERSION_4 -!macroend -!define VersionCompleteXXXX `!insertmacro VersionCompleteXXXX` \ No newline at end of file diff --git a/packaging/win32/ifexist.nsh b/packaging/win32/ifexist.nsh deleted file mode 100644 index f14236c2e..000000000 --- a/packaging/win32/ifexist.nsh +++ /dev/null @@ -1,21 +0,0 @@ -; See http://nsis.sourceforge.net/Check_if_a_file_exists_at_compile_time for documentation -!macro !ifexist _FILE_NAME - !tempfile _TEMPFILE - !system `if exist "${_FILE_NAME}" echo !define _FILE_EXISTS > "${_TEMPFILE}"` - !include `${_TEMPFILE}` - !delfile `${_TEMPFILE}` - !undef _TEMPFILE - !ifdef _FILE_EXISTS - !undef _FILE_EXISTS -!macroend -!define !ifexist "!insertmacro !ifexist" -!macro !ifnexist _FILE_NAME - !tempfile _TEMPFILE - !system `if not exist "${_FILE_NAME}" echo !define _FILE_EXISTS > "${_TEMPFILE}"` - !include `${_TEMPFILE}` - !delfile `${_TEMPFILE}` - !undef _TEMPFILE - !ifdef _FILE_EXISTS - !undef _FILE_EXISTS -!macroend -!define !ifnexist "!insertmacro !ifnexist" diff --git a/packaging/win32/inkscape.nsi b/packaging/win32/inkscape.nsi index 9646ee2f4..8f5d067c5 100755 --- a/packaging/win32/inkscape.nsi +++ b/packaging/win32/inkscape.nsi @@ -27,9 +27,9 @@ SetCompressorDictSize 32 RequestExecutionLevel admin ; Include required files {{{2 -!include RequireLatestNSIS.nsh -!include ifexist.nsh -!include VersionCompleteXXXX.nsh +!include macros\RequireLatestNSIS.nsh +!include macros\ifexist.nsh +!include macros\VersionCompleteXXXX.nsh !include LogicLib.nsh !include Sections.nsh @@ -48,12 +48,12 @@ RequestExecutionLevel admin ; However, for the moment, this is what we're using. !define INSTDIR_REG_ROOT HKLM !define INSTDIR_REG_KEY "${UNINST_KEY}" -!include AdvUninstLog.nsh +!include macros\AdvUninstLog.nsh !insertmacro INTERACTIVE_UNINSTALL ; Initialise NSIS plug-ins {{{3 ; The plugins used are md5dll and messagebox -!addplugindir . +!addplugindir plugins ; FileFunc bits and pieces {{{3 !include FileFunc.nsh diff --git a/packaging/win32/macros/AdvUninstLog.nsh b/packaging/win32/macros/AdvUninstLog.nsh new file mode 100644 index 000000000..f48049164 --- /dev/null +++ b/packaging/win32/macros/AdvUninstLog.nsh @@ -0,0 +1,437 @@ + ;_____________________________ HEADER FILE BEGIN ____________________________ + + # Advanced Uninstall Log NSIS header + # Version 1.0 2007-01-31 + # By Red Wine (http://nsis.sf.net/User:Red_Wine) + + # Usage: See included examples Uninstall_Log_Default_UI.nsi - Uninstall_Log_Modern_UI.nsi + +!verbose push + !verbose 3 + +!ifndef ADVANCED_UNINSTALL.LOG_NSH + !define ADVANCED_UNINSTALL.LOG_NSH + +!ifndef INSTDIR_REG_ROOT | INSTDIR_REG_KEY + !error "You must properly define both INSTDIR_REG_ROOT and INSTDIR_REG_KEY" +!endif + +!ifndef UNINSTALL_LOG + !define UNINSTALL_LOG "Uninstall" +!endif + +!ifndef UNINST_LOG_VERBOSE + !define UNINST_LOG_VERBOSE "3" +!endif + +!verbose pop + +!echo "Advanced Uninstall Log NSIS header v1.0 2007-01-31 by Red Wine (http://nsis.sf.net/User:Red_Wine)" + +!verbose push + !verbose ${UNINST_LOG_VERBOSE} + +!define UNINST_EXE "$INSTDIR\${UNINSTALL_LOG}.exe" +!define UNINST_DAT "$INSTDIR\${UNINSTALL_LOG}.dat" +!define UNLOG_PART "$PLUGINSDIR\part." +!define UNLOG_TEMP "$PLUGINSDIR\unlog.tmp" +!define EXCLU_LIST "$PLUGINSDIR\exclude.tmp" +!define UNLOG_HEAD "=========== Uninstaller Log please do not edit this file ===========" + + var unlog_tmp_0 + var unlog_tmp_1 + var unlog_tmp_2 + var unlog_tmp_3 + var unlog_error + +!include FileFunc.nsh +!include TextFunc.nsh + +!insertmacro Locate +!insertmacro un.Locate +!insertmacro DirState +!insertmacro un.DirState +!insertmacro FileJoin +!insertmacro TrimNewLines +!insertmacro un.TrimNewLines + +;.............................. Uninstaller Macros .............................. + +!macro UNINSTALL.LOG_BEGIN_UNINSTALL + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + IfFileExists "${UNINST_DAT}" +3 + MessageBox MB_ICONSTOP|MB_OK "${UNINST_DAT} not found, unable to perform uninstall." /SD IDOK + Quit + + StrCmp "$PLUGINSDIR" "" 0 +2 + InitPluginsDir + + CopyFiles "${UNINST_DAT}" "${UNLOG_TEMP}" + FileOpen $unlog_tmp_2 "${UNLOG_TEMP}" r + + !verbose pop +!macroend + + +!macro UNINSTALL.LOG_END_UNINSTALL + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + FileClose $unlog_tmp_2 + DeleteRegValue ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}.dat" + DeleteRegValue ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" + + !verbose pop +!macroend + + +!macro UNINSTALL.LOG_UNINSTALL TargetDir + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + !ifndef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL + !error "You must insert either Interactive or Unattended Uninstall neither both, neither none." + !endif + + !ifdef INTERACTIVE_UNINSTALL + GetTempFileName $unlog_tmp_5 "$PLUGINSDIR" + FileOpen $unlog_tmp_4 "$unlog_tmp_5" a + !endif + + ${PerfomUninstall} "${TargetDir}" "${UnLog_Uninstall_CallBackFunc}" + + !ifdef INTERACTIVE_UNINSTALL + FileClose $unlog_tmp_4 + !endif + + !verbose pop +!macroend + + +!define PerfomUninstall "!insertmacro PERFORMUNINSTALL" + +!macro PERFORMUNINSTALL TargetDir UninstCallBackFunc + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + !define ID ${__LINE__} + + ${un.Locate} "${TargetDir}" "/L=F" "${UninstCallBackFunc}" + + loop_${ID}: + + StrCpy $unlog_tmp_1 0 + + ${un.Locate} "${TargetDir}" "/L=DE" "${UninstCallBackFunc}" + StrCmp $unlog_tmp_1 "0" 0 loop_${ID} + + ${un.DirState} "${TargetDir}" $unlog_tmp_0 + StrCmp "$unlog_tmp_0" "0" 0 +2 + RmDir "${TargetDir}" + + IfErrors 0 +2 + MessageBox MB_ICONEXCLAMATION|MB_OK "${UNINSTALL_LOG} Log error" /SD IDOK + + !undef ID + + !verbose pop +!macroend + + +!macro INTERACTIVE_UNINSTALL + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + !ifdef INTERACTIVE_UNINSTALL + !error "INTERACTIVE_UNINSTALL is already defined" + !endif + + var unlog_tmp_4 + var unlog_tmp_5 + + !define INTERACTIVE_UNINSTALL + + !ifdef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL + !error "You must insert either Interactive or Unattended Uninstall neither both, neither none." + !endif + + !ifdef UnLog_Uninstall_CallBackFunc + !undef UnLog_Uninstall_CallBackFunc + !endif + + !ifndef UnLog_Uninstall_CallBackFunc + !insertmacro UNINSTALL.LOG_UNINSTALL_INTERACTIVE + !define UnLog_Uninstall_CallBackFunc "un._LocateCallBack_Function_Interactive" + !endif + + !verbose pop +!macroend + + +!macro UNATTENDED_UNINSTALL + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + !ifdef UNATTENDED_UNINSTALL + !error "UNATTENDED_UNINSTALL is already defined" + !endif + + !define UNATTENDED_UNINSTALL + + !ifdef INTERACTIVE_UNINSTALL & UNATTENDED_UNINSTALL + !error "You must insert either Interactive or Unattended Uninstall neither both, neither none." + !endif + + !ifdef UnLog_Uninstall_CallBackFunc + !undef UnLog_Uninstall_CallBackFunc + !endif + + !ifndef UnLog_Uninstall_CallBackFunc + !insertmacro UNINSTALL.LOG_UNINSTALL_UNATTENDED + !define UnLog_Uninstall_CallBackFunc "un._LocateCallBack_Function_Unattended" + !endif + + !verbose pop +!macroend + + +!macro UNINSTALL.LOG_UNINSTALL_UNATTENDED + + Function un._LocateCallBack_Function_Unattended + start: + FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} + ${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" + StrCmp "$unlog_tmp_3" "$R9" islog + IfErrors nolog + goto start + + islog: + IfFileExists "$R9\*.*" isdir + + isfile: + Delete "$R9" + goto end + + isdir: + RmDir "$R9" + IntOp $unlog_tmp_1 $unlog_tmp_1 + 1 + goto end + + nolog: + ClearErrors + StrCmp "$R9" "${UNINST_EXE}" isfile + StrCmp "$R9" "${UNINST_DAT}" isfile + + end: + FileSeek $unlog_tmp_2 0 SET + Push $unlog_tmp_0 + FunctionEnd + +!macroend + + +!macro UNINSTALL.LOG_UNINSTALL_INTERACTIVE + + Function un._LocateCallBack_Function_Interactive + start: + FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} + ${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" + StrCmp "$unlog_tmp_3" "$R9" islog + IfErrors nolog + goto start + + islog: + IfFileExists "$R9\*.*" isdir + + isfile: + Delete "$R9" + goto end + + isdir: + RmDir "$R9" + IntOp $unlog_tmp_1 $unlog_tmp_1 + 1 + goto end + + nolog: + ClearErrors + FileSeek $unlog_tmp_4 0 SET + read: + FileRead $unlog_tmp_4 "$unlog_tmp_3" + ${un.TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" + StrCmp "$unlog_tmp_3" "$R9" end + IfErrors +2 + goto read + ClearErrors + StrCmp "$R9" "${UNINST_EXE}" isfile + StrCmp "$R9" "${UNINST_DAT}" isfile + IfFileExists "$R9\*.*" msgdir + + MessageBox MB_ICONQUESTION|MB_YESNO \ + 'Delete File "$R9"?' /SD IDNO IDYES isfile IDNO nodel + + msgdir: + MessageBox MB_ICONQUESTION|MB_YESNO \ + 'Delete Directory "$R9"?' /SD IDNO IDYES isdir IDNO nodel + + nodel: + FileSeek $unlog_tmp_4 0 END + FileWrite $unlog_tmp_4 "$R9$\r$\n" + + end: + FileSeek $unlog_tmp_2 0 SET + Push $unlog_tmp_0 + FunctionEnd + +!macroend + +;................................. Installer Macros ................................. + +!macro UNINSTALL.LOG_INSTALL_UNATTENDED + + Function _LocateCallBack_Function_Install + loop: + FileRead $unlog_tmp_2 "$unlog_tmp_3" ${NSIS_MAX_STRLEN} + ${TrimNewLines} "$unlog_tmp_3" "$unlog_tmp_3" + IfErrors 0 +4 + ClearErrors + FileSeek $unlog_tmp_2 0 SET + goto next + StrCmp "$R9" "$unlog_tmp_3" end + goto loop + next: + FileWrite $unlog_tmp_1 "$R9$\r$\n" + end: + Push $unlog_tmp_0 + FunctionEnd + +!macroend + + +!ifdef UnLog_Install_Func_CallBack + !undef UnLog_Install_Func_CallBack +!endif + +!ifndef UnLog_Install_Func_CallBack + !insertmacro UNINSTALL.LOG_INSTALL_UNATTENDED + !define UnLog_Install_Func_CallBack "_LocateCallBack_Function_Install" +!endif + + +!macro UNINSTALL.LOG_PREPARE_INSTALL + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + Push $0 + Push $1 + ClearErrors + ReadRegStr "$0" ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" + IfErrors next + ${DirState} "$0" $1 + StrCmp "$1" "-1" next + StrCmp "$1" "0" next + IfFileExists "$0\${UNINSTALL_LOG}.dat" next + MessageBox MB_ICONEXCLAMATION|MB_OK \ + "Previous installation detected at $0.$\n\ + Required file ${UNINSTALL_LOG}.dat is missing.$\n$\nIt is highly recommended \ + to select an empty directory and perform a fresh installation." /SD IDOK + StrCpy $unlog_error "error" + + next: + ClearErrors + StrCmp "$PLUGINSDIR" "" 0 +2 + InitPluginsDir + + GetTempFileName "$1" + FileOpen $0 "$1" w + FileWrite $0 "${UNLOG_HEAD}$\r$\n" + FileClose $0 + Rename "$1" "${UNLOG_TEMP}" + Pop $1 + Pop $0 + + !verbose pop +!macroend + + +!macro UNINSTALL.LOG_UPDATE_INSTALL + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + Delete "${UNINST_DAT}" + Rename "${UNLOG_TEMP}" "${UNINST_DAT}" + WriteUninstaller "${UNINST_EXE}" + WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}.dat" "${UNINST_DAT}" + WriteRegStr ${INSTDIR_REG_ROOT} "${INSTDIR_REG_KEY}" "${UNINSTALL_LOG}Directory" "$INSTDIR" + + !verbose pop +!macroend + + +!define uninstall.log_install "!insertmacro UNINSTALL.LOG_INSTALL" + +!macro UNINSTALL.LOG_INSTALL FileOpenWrite FileOpenRead TargetDir + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + FileOpen $unlog_tmp_1 "${FileOpenWrite}" w + FileOpen $unlog_tmp_2 "${FileOpenRead}" r + + ${Locate} "${TargetDir}" "/L=FD" "${UnLog_Install_Func_CallBack}" + + StrCmp $unlog_error "error" 0 +2 + ClearErrors + + IfErrors 0 +2 + MessageBox MB_ICONEXCLAMATION|MB_OK "Error creating ${UNINSTALL_LOG} Log." /SD IDOK + + FileClose $unlog_tmp_1 + FileClose $unlog_tmp_2 + + !verbose pop +!macroend + + +!define uninstall.log_mergeID "!insertmacro UNINSTALL.LOG_MERGE" + +!macro UNINSTALL.LOG_MERGE UnlogPart + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + ${FileJoin} "${UNLOG_TEMP}" "${UnlogPart}" "${UNLOG_TEMP}" + + !verbose pop +!macroend + + +!macro UNINSTALL.LOG_OPEN_INSTALL + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + StrCmp $unlog_error "error" +2 + ${uninstall.log_install} "${EXCLU_LIST}" "${UNINST_DAT}" "$OUTDIR" + + !verbose pop +!macroend + + +!macro UNINSTALL.LOG_CLOSE_INSTALL + !verbose push + !verbose ${UNINST_LOG_VERBOSE} + + !define ID ${__LINE__} + + ${uninstall.log_install} "${UNLOG_PART}${ID}" "${EXCLU_LIST}" "$OUTDIR" + ${uninstall.log_mergeID} "${UNLOG_PART}${ID}" + + !undef ID ${__LINE__} + + !verbose pop +!macroend + +!endif + +!verbose pop + ;_____________________________ HEADER FILE END ____________________________ + diff --git a/packaging/win32/macros/AdvUninstLog.txt b/packaging/win32/macros/AdvUninstLog.txt new file mode 100644 index 000000000..c294c3df2 --- /dev/null +++ b/packaging/win32/macros/AdvUninstLog.txt @@ -0,0 +1,121 @@ +Overview + +Advanced Uninstall Log for NSIS was born in the need to cover a specific gap. +It's been discussed fairly enough that the File /r command is very useful +in cases when developers want to add a huge amount of sub directories and +files, nevertheless it has the disadvantage that such an installation should +be uninstalled with RmDir /r which is risky and removes also data that has +been added/created later within the installation folder. + + + + +About Advanced Uninstall Log. + +Advanced Uninstall Log is a macro system provided in a NSIS header that +is able to monitor an installation and build an uninstall log file which +is used by the uninstaller to uninstall files/directories that have been +added within specific installation blocks. + +This means that files which have been installed outside these blocks, +or added later either by the user or application's activities, ignored +by the uninstaller. + +Moreover files that might exist into the target directory prior the current +installation, ignored as well. + +Advanced Uninstall Log creates an uninstall log that removes only files that +have been installed and optionally interacts with users for every other file +and/or directory has found in installation folder and requires permission to +remove these files/directories. + +It is enhanced as well to support updates, e.g. if the installer later would +update the installation by adding new data, the uninstaller would remove the +new data that has been added by the installer, without bothering users about. + + + + +Features + +If target installation folder exists and contains files and/or directories +they all preserved from being uninstalled. + +Uninstaller removes data that has been added within specific installation +blocks, preserving all other data that has been created/added outside of +these installation blocks. See included examples for details. + +Supports unlimited updates/reinstallations. + +Supports two uninstaller modes. Interactive mode requires confirmation +to remove every other file exept those files that have been installed. +Unattended mode leaves intact every other file without bothering users. + +In case when uninstall log (uninstall.dat) has been removed manually instead +of execute uninstaller, if users attempt to run the installer later, a warning +issued that they should select a new output folder. + +Implements only the included with NSIS release headers FileFunc and TextFunc. +There is no need for external plugins and headers, adds a very small overhead. + + + + +Restrictions + +If uninstall log (uninstall.dat) is missing uninstaller won't execute at all. + +Due to file create - write procedure that is required in order to add/update +the uninstall log (uninstall.dat), restricted users on NT based systems won't +be able to execute the installer. + + + + +Disadvantage + +Since the header does not implement anything else than the common NSIS release, +a delay occurs while builds and reads the uninstall log because it needs to +throw the list several times. Talking for common cases, most likely the delay +won't be noticeable, however, in cases where the target directory isn't empty +and contains a large amount of data which will be excluded from uninstall log, +or added large amount of data after the installation which will be excluded also, +the delay should be noticeable. + + + + +Credits + +A very big thanks goes to kichik. +When my idea of the Advanced Uninstall Log became an NSIS header, it was +indeed an amateur's attempt to write a flexible and errors free NSIS header. +Kichik dropped me a dozen of suggestions helping me to achieve my plan. +However, his main suggestion to eliminate the mentioned above disadvantage, +still remains untouched by me. + + + + +License + +This header file is provided 'as-is', without any express or implied warranty. +In no event will the author be held liable for any damages arising from the use +of this header file. + +Permission is granted to anyone to use this header file for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + + 1. The origin of this header file must not be misrepresented; + you must not claim that you wrote the original header file. + If you use this header file in a product, an acknowledgment in + the product documentation would be appreciated but is not required. + + 2. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original header file. + + 3. This notice may not be removed or altered from any distribution. + + +eof \ No newline at end of file diff --git a/packaging/win32/macros/RequireLatestNSIS.nsh b/packaging/win32/macros/RequireLatestNSIS.nsh new file mode 100644 index 000000000..70371552a --- /dev/null +++ b/packaging/win32/macros/RequireLatestNSIS.nsh @@ -0,0 +1,9 @@ +!if `${NSIS_VERSION}` == `v2.45` + !error "There is a bug in !searchparse which makes this script not compile in NSIS 2.45. Please upgrade to NSIS 2.46 or later and try again." +!else + !echo "(If you get a compile error with !searchparse, please upgrade to NSIS 2.46 or later and try again.)" +!endif +!searchparse ${NSIS_VERSION} "v" V +!if ${V} < 2.46 + !error "You only have NSIS ${V}, but NSIS 2.46 or later is required for proper Windows 7 support. Please upgrade to NSIS 2.46 or later and try again." +!endif diff --git a/packaging/win32/macros/VersionCompleteXXXX.nsh b/packaging/win32/macros/VersionCompleteXXXX.nsh new file mode 100644 index 000000000..6ea780508 --- /dev/null +++ b/packaging/win32/macros/VersionCompleteXXXX.nsh @@ -0,0 +1,60 @@ +; See http://nsis.sourceforge.net/VersionCompleteXXXX for documentation +!macro VersionCompleteXXXRevision _INPUT_VALUE _OUTPUT_SYMBOL _REVISION + !searchparse /noerrors ${_INPUT_VALUE} "" _VERSION_1 "." _VERSION_2 "." _VERSION_3 "." _VERSION_4 + !ifndef _VERSION_1 + !define _VERSION_1 0 + !else if `${_VERSION_1}` == `` + !define /redef _VERSION_1 0 + !endif + !ifndef _VERSION_2 + !define _VERSION_2 0 + !else if `${_VERSION_2}` == `` + !define /redef _VERSION_2 0 + !endif + !ifndef _VERSION_3 + !define _VERSION_3 0 + !else if `${_VERSION_3}` == `` + !define /redef _VERSION_3 0 + !endif + !ifndef _VERSION_4 + !define _VERSION_4 0 + !else if `${_VERSION_4}` == `` + !define /redef _VERSION_4 0 + !endif + !define ${_OUTPUT_SYMBOL} ${_VERSION_1}.${_VERSION_2}.${_VERSION_3}.${_REVISION} + !undef _VERSION_1 + !undef _VERSION_2 + !undef _VERSION_3 + !undef _VERSION_4 + !undef _REVISION +!macroend +!define VersionCompleteXXXRevision `!insertmacro VersionCompleteXXXRevision` +!macro VersionCompleteXXXX _INPUT_VALUE _OUTPUT_SYMBOL + !searchparse /noerrors ${_INPUT_VALUE} "" _VERSION_1 "." _VERSION_2 "." _VERSION_3 "." _VERSION_4 + !ifndef _VERSION_1 + !define _VERSION_1 0 + !else if `${_VERSION_1}` == `` + !define /redef _VERSION_1 0 + !endif + !ifndef _VERSION_2 + !define _VERSION_2 0 + !else if `${_VERSION_2}` == `` + !define /redef _VERSION_2 0 + !endif + !ifndef _VERSION_3 + !define _VERSION_3 0 + !else if `${_VERSION_3}` == `` + !define /redef _VERSION_3 0 + !endif + !ifndef _VERSION_4 + !define _VERSION_4 0 + !else if `${_VERSION_4}` == `` + !define /redef _VERSION_4 0 + !endif + !define ${_OUTPUT_SYMBOL} ${_VERSION_1}.${_VERSION_2}.${_VERSION_3}.${_VERSION_4} + !undef _VERSION_1 + !undef _VERSION_2 + !undef _VERSION_3 + !undef _VERSION_4 +!macroend +!define VersionCompleteXXXX `!insertmacro VersionCompleteXXXX` \ No newline at end of file diff --git a/packaging/win32/macros/ifexist.nsh b/packaging/win32/macros/ifexist.nsh new file mode 100644 index 000000000..f14236c2e --- /dev/null +++ b/packaging/win32/macros/ifexist.nsh @@ -0,0 +1,21 @@ +; See http://nsis.sourceforge.net/Check_if_a_file_exists_at_compile_time for documentation +!macro !ifexist _FILE_NAME + !tempfile _TEMPFILE + !system `if exist "${_FILE_NAME}" echo !define _FILE_EXISTS > "${_TEMPFILE}"` + !include `${_TEMPFILE}` + !delfile `${_TEMPFILE}` + !undef _TEMPFILE + !ifdef _FILE_EXISTS + !undef _FILE_EXISTS +!macroend +!define !ifexist "!insertmacro !ifexist" +!macro !ifnexist _FILE_NAME + !tempfile _TEMPFILE + !system `if not exist "${_FILE_NAME}" echo !define _FILE_EXISTS > "${_TEMPFILE}"` + !include `${_TEMPFILE}` + !delfile `${_TEMPFILE}` + !undef _TEMPFILE + !ifdef _FILE_EXISTS + !undef _FILE_EXISTS +!macroend +!define !ifnexist "!insertmacro !ifnexist" diff --git a/packaging/win32/md5dll.dll b/packaging/win32/md5dll.dll deleted file mode 100644 index abefbb038..000000000 Binary files a/packaging/win32/md5dll.dll and /dev/null differ diff --git a/packaging/win32/md5dll.txt b/packaging/win32/md5dll.txt deleted file mode 100644 index a8d3572c7..000000000 --- a/packaging/win32/md5dll.txt +++ /dev/null @@ -1,68 +0,0 @@ -Calculates the md5sum of a file or string. -Has been tested to work with NSIS 2.0+ - - -Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm - -[Md5Dll] -Matthew "IGx89" Lieder - -Original plugin Author - -Sunjammer (12th May 2002) - -Original usage notes and example script - -[Md5Dll.0.1] -KJD (2004) - -Modified to reduce size and use exdll.h - (reduced to about 6KB uncompressed, by removing CRTL dependency) - -[Md5dll.0.2] -Davy Durham (2004) - -MD5.cpp fix (correct for loop used to replace memset, exceeded bounds) - -[Md5dll.0.3] -Shengalts Aleksander aka Instructor (2005) - -New command: "GetMD5Random" - -Changed names: "GetFileMD5" -> "GetMD5File", "GetMD5" -> "GetMD5String" - -Fixed: string length error - -[Md5dll.0.4] -KJD (2005) - -Added dual name to exports for backwards compatibility - - --------------------------------- - -Usage: - -Push $1 ;string -CallInstDll "md5dll" GetMD5String -Pop $1 ;md5 of string - --or- - -Push $1 ;filename -CallInstDll "md5dll" GetMD5File -Pop $1 ;md5 of file - --------------------------------- - -Example usage in recent NSIS versions - -OutFile "md5test.exe" -Section "" - #generate MD5sum of a string - md5dll::GetMD5String "md5me" - Pop $0 - DetailPrint "md5: [$0]" - - # generate MD5sum of a file - md5dll::GetMD5File "${NSISDIR}\makensis.exe" - Pop $0 - DetailPrint "md5: [$0]" - - #generate random MD5sum - md5dll::GetMD5Random - Pop $0 - DetailPrint "md5: [$0]" -SectionEnd diff --git a/packaging/win32/messagebox.dll b/packaging/win32/messagebox.dll deleted file mode 100644 index 97407fa1a..000000000 Binary files a/packaging/win32/messagebox.dll and /dev/null differ diff --git a/packaging/win32/plugins/MessageBox.txt b/packaging/win32/plugins/MessageBox.txt new file mode 100644 index 000000000..c2aa963d6 --- /dev/null +++ b/packaging/win32/plugins/MessageBox.txt @@ -0,0 +1,186 @@ +Customisable MessageBox Plug-In (v0.98 beta 3) + +[ Archive Page: http://nsis.sourceforge.net/archive/??? ] + +-------------- + +The Customisable MessageBox plug-in allows you to use a MessageBox in your installer which can be altered to how you want it to be. You can control: + * the number of buttons shown + * the text each button shows + * a standard or customisable icon ( flexible so you can use the installer or other files ) + * a fully working 'forth' button! + +The plug-in uses a few tricks to allow for the messagebox functionality to be altered so that the button text can finally be altered making [ Yes | Yes to All | No | No to All ] ( and anything else you care for ) possible. + +Also with the changes made it is now possible to have a functional 'forth' button - yes you read correctly! When using the function just pass in four button texts and you will see the forth button - simple really :o) + +There is only the one function to show the messagebox so enjoy. + +[ As of v0.98 beta the parameters of calling the function have changed, check out usage for the revised options - thanks to n0On3 for the suggestions. ] + + +Usage +----- + +messagebox::show styles caption ( module_name, icon_id ) text but1 [ but2 but3 but4 ] + +styles - messagebox styles ( supports most of the windows messagebox styles ) + +caption - the text to be used for the dialog title ( or the installer title if not specified ) + +module_name - sets the name of the file ( usually a dll or exe file ) that contains the custom icon to be used - if 0 is passed then the installer will be used + +icon_id - the id of the icon group to be used for the custom icon + +text - the text to be shown by the messagebox + +but1 - specified text or name id to use ie IDYES, IDNO, etc ( there must always be at least one button ) + +but2, but3, but4 - optional buttons which follow the same way as for but1 + + +When passing in options, you should use a "" pair for options you pass in to ensure the strings are correctly read. It is not necessary to do so for the predefined button texts +e.g. "IDCANCEL" is the same as IDCANCEL. + +See Example.nsi for an example ;o) ( bit hacked at the moment due to testing but shows most things ) + + +Return Values +----- + +To get the return value use Pop $0 immediately after the function has been used incase other functions alter the value. + +If there were no problems then the function will return the number of the button pressed working from the left being 'button 1'. +i.e. + if you have [ yes | no | abort ] and 'no' is selected then the return value will be '2' + +If an error happens then the messagebox will return 0. + +If there are no buttons passed then the function will return '-1'. + + +Some More Info +---------------- + +If you pass an empty string for the caption ( "" ) then the installer title text will be used instead (stripping back the current section name as NSIS messageboxes do). +If the installer is run silently then the title will be blank if setting the caption option to "" ( as NSIS messageboxes do ). This is because when the installer is silent it does not have a visible window and so will not have a window title ( had not taken this into account initially, oops - fixed from v0.98 beta 3 ). + +When you want to use a custom icon, setting module to '0' will look for the icon in the installer otherwise it will search the file specified. +e.g. + "0,103" will load the installer icon ( well in testing it does :o) ) + "shell32.dll,24" will load the help file icon from the shell32.dll ( as long as the file exists! ) + +If the module passed is not valid then the usericon style will not be used ( you may receive a windows message informing of this ). + +If the icon is not valid then the messagebox will just show a blank area where the icon would be displayed assuming that the value of module is valid. + +If a usericon is specified then if there are any of the messagebox icon styles passed in, these will be ignored. This allows an icon to appear otherwise internal style conflicts will prevent any icon being shown. + +If you want to display the standard button texts then pass the following strings in for the necessary button: + + IDOK - Ok + IDCANCEL - Cancel + IDABORT - Abort + IDRETRY - Retry + IDIGNORE - Ignore + IDYES - Yes + IDNO - No + IDHELP - Help / 4th button + IDTRYAGAIN - Try Again + IDCONTINUE - Continue + +When the function is processing the passed button texts to use, if a duplicate of the predefined texts (above) happen then the only the first instance will be allowed +e.g. + IDYES "ah go on if you dare" IDYES -> [ YES | ah go on if you dare ] + +Each button will be resized if needed to allow the text to fit correctly in the button without being clipped. If the text is still too long for the messagebox width ( limited to 80% of the screen width ) then buttons will be resized and clipping of the button text may happen again ( this will be fixed in v1.0 ). + + +Final Notes +------- + +I have no idea how the code will work with international text (since i just use plain text in the code) so if you try it in a multilanguage setup then let me know how it reacts or if there are any issues with the function's display. + +The predefined button texts are hard coded and cannot be altered. To alter the default texts involves passing in the language button text as a custom button text. + +The button resizing code is not complete at the moment ( as can be clearly seen from the first messagebox ) when it detects that the width of the messagebox is at the 80% screen width. Issues are that the buttons are not correctly resized to ensure that they appear correctly ( as is the case with the second messagebox ). This is more down to fiddling with the button widths after the initial processing but will be fixed soon :o) + + +Credits +------- + +Coded by Darren Owen, aka DrO (Sept 2003) + +n0On3 - Idea request and helpful feedback ( the simplified function use over previous versions :o) ) + +A plugin from me to you :o) + + +Version History +------- + +v0.1 +* Initial release of the function +* Basic support to show that the button text can be altered on the messagebox +* Inital support for controlling the number of buttons shown + +v0.5 +* Setting of text of only the buttons wanted ( "/but? blah" ) +* Now if a string is not passed then the text will not be set (broken in the v0.1 release) +* Altered a lot of internal workings to allow for more customising of the MessageBox +* Better support for the number of buttons to show +* The functional '4th' button - making use of the 'Help' button to act as a real button +* Fixed a number of crash issues due to buffer sizes and a few other bugs, etc + +v0.8 +* A lot of changes made :o) +* Improved internal handling so that now button text is set correctly either when the number of buttons is set or user styles are set so now "/but2 blah" will always set the second buttons text and not just a few cases as beforehand +* Altered the order of the parameters from earlier versions to make some internals easier to do :o) +* The 4th / Help button will now close the MessageBox in ALL cases - would not close correctly if there was not a 'cancel' button in earlier versions +* Buffers are now allocated to the NSIS buffer sizes passed to the dll on use for better compatibility between dll and installer +* When the button numbers are set, the function will map the returned value now to the button selected instead of the normal wndows defined return value +* some other bits and bobs that i've forgotten on the way + +v0.9 +* Added in support for displaying custom icons on the messagebox ( along with standard icons which can be shown ) either in the installer or from other files +* Altered the example script to show off some more bits of what it can do + +v0.95 beta +* Added in support for resizing of buttons based on the text set into the button ( use the /trim before the text to be set ) +* Messagebox is now limited to approximately 80% of the screen size ( as the messagebox normally does ) +* The resizing of button texts will also update the width of the text width to ensure it keeps to the size of the messagebox +* Support is not complete for /trim ( still need to update the graduating of the width increment ) +* When the 80% width is reached, currently buttons will disappear off the messagebox ( handling for a double height button will come to cope with this soon ) +* Altered the example script to show off some more bits of what it can do + +v0.98 beta +* Removed the passing in of a hwnd parameter - is always owned by the installer +* Altered the custom icon option to be a single parameter now in the form 'module,id' where module can be 0 to use the installer +* All return values are now mapped to the button number pressed ie 1,2,etc +* Now the number of buttons to show is based on the button string texts passed in to the function :o) +* Altered the order of parameters to work in a top to bottom order with respect to the messagebox layout and to match closer to the NSIS setup +[ a good suggestion from n0On3 - nice ] +- now goes: style title usericon text but1 [ but2 but3 but4 ] +* Altered the button texts to be set in the order passed and will also convert the default ids too! eg IDYES -> "Yes", IDIGNORE -> "Ignore" +* Fixed the graduating of the button trim feature to appear 'natural' +[ adds approxiamately 3 character widths either side when the text won't fit fully in the button ] +* Fixed a few bugs in the code introduced in the changes made +* Support for MB_DEFBUTTON? is broken when a button has to be resized ( will fix this soon - already worked out how to but not why this happens ) + +v0.98 beta 2 +* Fixed the MB_DEFBUTTON? issue ( needed to prevent the wm_active message being handled ) +* Verified the installer will show icons correctly if the installer is run silently ( no code changes were made ) +* Added in checking of the defined buttons to ensure that duplicates are not allowed (only the first occurrance is allowed) +* Checked that all strings are verified for having data before being used +* A few code tidy-ups introduced to the code +* Typo fix in the example +* Added in stripping out of the icon definitions if a user icon is specified (otherwise no icon will appear!) +* Updated the readme file to reflect the changes made to the plug-in's functionality since v0.98 beta and to clarify things in better detail now ( i hope ) +* Added in a reference to the archive page for the plugin ( will upload majority of this file to the archive ) +* All internal buffers are now set to the buffer size passed into the plugin when it is called and altered how they are referenced +* Fixed how the module string is cleared, should fix a potential crash issue i hope +* Partially fixed the resizing of the text area when using long button strings to correctly limit out when the 80% limit is reached ( fine when now icon is used at the moment ) +* Added a silent installer option to the example script, just !define SILENT to get the silent version (should show that the function works fine either in a normal or silent installer) + +v0.98 beta 3 +* Fixed a crash when a silent installer is run ( pointed out by n0On3 ) - not checking the string length when getting the installer title if ""is the pased caption value, doh! \ No newline at end of file diff --git a/packaging/win32/plugins/md5dll.dll b/packaging/win32/plugins/md5dll.dll new file mode 100644 index 000000000..abefbb038 Binary files /dev/null and b/packaging/win32/plugins/md5dll.dll differ diff --git a/packaging/win32/plugins/md5dll.txt b/packaging/win32/plugins/md5dll.txt new file mode 100644 index 000000000..a8d3572c7 --- /dev/null +++ b/packaging/win32/plugins/md5dll.txt @@ -0,0 +1,68 @@ +Calculates the md5sum of a file or string. +Has been tested to work with NSIS 2.0+ + + +Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm + +[Md5Dll] +Matthew "IGx89" Lieder + -Original plugin Author + +Sunjammer (12th May 2002) + -Original usage notes and example script + +[Md5Dll.0.1] +KJD (2004) + -Modified to reduce size and use exdll.h + (reduced to about 6KB uncompressed, by removing CRTL dependency) + +[Md5dll.0.2] +Davy Durham (2004) + -MD5.cpp fix (correct for loop used to replace memset, exceeded bounds) + +[Md5dll.0.3] +Shengalts Aleksander aka Instructor (2005) + -New command: "GetMD5Random" + -Changed names: "GetFileMD5" -> "GetMD5File", "GetMD5" -> "GetMD5String" + -Fixed: string length error + +[Md5dll.0.4] +KJD (2005) + -Added dual name to exports for backwards compatibility + + +-------------------------------- + +Usage: + +Push $1 ;string +CallInstDll "md5dll" GetMD5String +Pop $1 ;md5 of string + +-or- + +Push $1 ;filename +CallInstDll "md5dll" GetMD5File +Pop $1 ;md5 of file + +-------------------------------- + +Example usage in recent NSIS versions + +OutFile "md5test.exe" +Section "" + #generate MD5sum of a string + md5dll::GetMD5String "md5me" + Pop $0 + DetailPrint "md5: [$0]" + + # generate MD5sum of a file + md5dll::GetMD5File "${NSISDIR}\makensis.exe" + Pop $0 + DetailPrint "md5: [$0]" + + #generate random MD5sum + md5dll::GetMD5Random + Pop $0 + DetailPrint "md5: [$0]" +SectionEnd diff --git a/packaging/win32/plugins/messagebox.dll b/packaging/win32/plugins/messagebox.dll new file mode 100644 index 000000000..97407fa1a Binary files /dev/null and b/packaging/win32/plugins/messagebox.dll differ -- cgit v1.2.3