From 9d652fb2e0c85b9ff66dac0943c5933f7d6d9bbf Mon Sep 17 00:00:00 2001 From: lordmulder Date: Fri, 7 Oct 2011 16:06:48 +0200 Subject: [PATCH] Added support for /Force to uninstaller. Required some tweaks for the 'parameters.nsh' include file. --- etc/NSIS/parameters.nsh | 86 +++++++++++++++++++++++++++++------------------ etc/NSIS/setup.nsi | 47 +++++++++++++++++++------- src/Config.h | 2 +- src/Dialog_MainWindow.cpp | 2 +- 4 files changed, 89 insertions(+), 48 deletions(-) diff --git a/etc/NSIS/parameters.nsh b/etc/NSIS/parameters.nsh index 72c175bd..ae1060a8 100644 --- a/etc/NSIS/parameters.nsh +++ b/etc/NSIS/parameters.nsh @@ -1,4 +1,11 @@ -Function StrStr +!ifndef __PREFIX__ + !define __PREFIX__ "" +!endif + + +; StrStr + +Function ${__PREFIX__}StrStr /*After this point: ------------------------------------------ $R0 = SubString (input) @@ -54,13 +61,12 @@ Function StrStr FunctionEnd - ; GetParameters ; input, none ; output, top of stack (replaces, with e.g. whatever) ; modifies no other variables. -Function GetParameters +Function ${__PREFIX__}GetParameters Push $R0 Push $R1 Push $R2 @@ -96,7 +102,6 @@ Function GetParameters FunctionEnd - ; GetParameterValue ; Chris Morgan 5/10/2004 ; -Updated 4/7/2005 to add support for retrieving a command line switch @@ -127,7 +132,7 @@ FunctionEnd ;$R4 - result from StrStr calls ;$R5 - search for ' ' or '"' -Function GetParameterValue +Function ${__PREFIX__}GetParameterValue Exch $R0 ; get the top of the stack(default parameter) into R0 Exch ; exchange the top of the stack(default) with ; the second in the stack(parameter to search for) @@ -141,25 +146,25 @@ Function GetParameterValue Strlen $R2 $R1+2 ; store the length of the search string into R2 - Call GetParameters ; get the command line parameters - Pop $R3 ; store the command line string in R3 + Call ${__PREFIX__}GetParameters ; get the command line parameters + Pop $R3 ; store the command line string in R3 # search for quoted search string StrCpy $R5 '"' ; later on we want to search for a open quote Push $R3 ; push the 'search in' string onto the stack Push '"/$R1=' ; push the 'search for' - Call StrStr ; search for the quoted parameter value + Call ${__PREFIX__}StrStr ; search for the quoted parameter value Pop $R4 StrCpy $R4 $R4 "" 1 ; skip over open quote character, "" means no maxlen StrCmp $R4 "" "" next ; if we didn't find an empty string go to next # search for non-quoted search string - StrCpy $R5 ' ' ; later on we want to search for a space since we - ; didn't start with an open quote '"' we shouldn't - ; look for a close quote '"' - Push $R3 ; push the command line back on the stack for searching - Push '/$R1=' ; search for the non-quoted search string - Call StrStr + StrCpy $R5 ' ' ; later on we want to search for a space since we + ; didn't start with an open quote '"' we shouldn't + ; look for a close quote '"' + Push $R3 ; push the command line back on the stack for searching + Push '/$R1=' ; search for the non-quoted search string + Call ${__PREFIX__}StrStr Pop $R4 ; $R4 now contains the parameter string starting at the search string, @@ -172,13 +177,13 @@ next: StrCpy $R0 $R4 "" $R2 ; copy commandline text beyond parameter into $R0 # search for the next parameter so we can trim this extra text off Push $R0 - Push $R5 ; search for either the first space ' ', or the first - ; quote '"' - ; if we found '"/output' then we want to find the - ; ending ", as in '"/output=somevalue"' - ; if we found '/output' then we want to find the first - ; space after '/output=somevalue' - Call StrStr ; search for the next parameter + Push $R5 ; search for either the first space ' ', or the first + ; quote '"' + ; if we found '"/output' then we want to find the + ; ending ", as in '"/output=somevalue"' + ; if we found '/output' then we want to find the first + ; space after '/output=somevalue' + Call ${__PREFIX__}StrStr ; search for the next parameter Pop $R4 StrCmp $R4 "" done ; if 'somevalue' is missing, we are done StrLen $R4 $R4 ; get the length of 'somevalue' so we can copy this @@ -190,13 +195,13 @@ next: ; See if the parameter was specified as a command line switch, like '/output' check_for_switch: - Push $R3 ; push the command line back on the stack for searching - Push '/$R1' ; search for the non-quoted search string - Call StrStr + Push $R3 ; push the command line back on the stack for searching + Push '/$R1' ; search for the non-quoted search string + Call ${__PREFIX__}StrStr Pop $R4 - StrCmp $R4 "" done ; if we didn't find anything then use the default - StrCpy $R0 "" ; otherwise copy in an empty string since we found the - ; parameter, just didn't find a value + StrCmp $R4 "" done ; if we didn't find anything then use the default + StrCpy $R0 "" ; otherwise copy in an empty string since we found the + ; parameter, just didn't find a value done: Pop $R5 @@ -207,9 +212,24 @@ done: Exch $R0 ; put the value in $R0 at the top of the stack FunctionEnd -!macro GetCommandlineParameter param default var - Push "${param}" ; push the search string onto the stack - Push "${default}" ; push a default value onto the stack - Call GetParameterValue - Pop ${var} -!macroend + +; Wrapper macros + +!if "${__PREFIX__}" != "un." + !macro GetCommandlineParameter param default var + Push "${param}" ; push the search string onto the stack + Push "${default}" ; push a default value onto the stack + Call GetParameterValue + Pop ${var} + !macroend +!else + !macro un.GetCommandlineParameter param default var + Push "${param}" ; push the search string onto the stack + Push "${default}" ; push a default value onto the stack + Call un.GetParameterValue + Pop ${var} + !macroend +!endif + + +!undef __PREFIX__ diff --git a/etc/NSIS/setup.nsi b/etc/NSIS/setup.nsi index 483bed83..6d0fb6f8 100644 --- a/etc/NSIS/setup.nsi +++ b/etc/NSIS/setup.nsi @@ -78,6 +78,10 @@ !include `StdUtils.nsh` !include `parameters.nsh` +;Uninstaller +!define __PREFIX__ "un." +!include `parameters.nsh` + ;-------------------------------- ;Installer Attributes @@ -197,7 +201,9 @@ Page Custom LockedListShow ;Uninstaller !define MUI_WELCOMEPAGE_TITLE_3LINES !define MUI_FINISHPAGE_TITLE_3LINES +!define MUI_PAGE_CUSTOMFUNCTION_PRE un.CheckForcedUninstall !insertmacro MUI_UNPAGE_WELCOME +!define MUI_PAGE_CUSTOMFUNCTION_PRE un.CheckForcedUninstall !insertmacro MUI_UNPAGE_CONFIRM UninstPage Custom un.LockedListShow !insertmacro MUI_UNPAGE_INSTFILES @@ -266,7 +272,10 @@ Function .onInit Quit ${EndIf} - !insertmacro MUI_LANGDLL_DISPLAY + !insertmacro GetCommandlineParameter "Update" "?" $R0 + ${If} "$R0" == "?" + !insertmacro MUI_LANGDLL_DISPLAY + ${EndIf} ; -------- @@ -310,8 +319,11 @@ Function un.onInit Quit ${EndIf} - !insertmacro MUI_LANGDLL_DISPLAY - + !insertmacro un.GetCommandlineParameter "Force" "?" $R0 + ${If} "$R0" == "?" + !insertmacro MUI_LANGDLL_DISPLAY + ${EndIf} + ; -------- UserInfo::GetAccountType @@ -324,7 +336,7 @@ FunctionEnd ;-------------------------------- -;UAC initialization +;GUI initialization ;-------------------------------- Function MyGuiInit @@ -559,16 +571,20 @@ SectionEnd Function CheckForUpdate !insertmacro GetCommandlineParameter "Update" "?" $R0 - StrCmp $R0 "?" 0 EnableUpdateMode + ${IfNotThen} "$R0" == "?" ${|} Goto EnableUpdateMode ${|} + + ${IfThen} "$INSTDIR" == "" ${|} Return ${|} + ${IfThen} "$INSTDIR" == "$EXEDIR" ${|} Return ${|} + ${IfNotThen} ${FileExists} "$INSTDIR\LameXP.exe" ${|} Return ${|} - StrCmp "$INSTDIR" "" 0 +2 - Return - IfFileExists "$INSTDIR\*.*" +2 - Return - StrCmp "$EXEDIR" "$INSTDIR" 0 +2 - Return - IfFileExists "$INSTDIR\LameXP.exe" +2 - Return + ;StrCmp "$INSTDIR" "" 0 +2 + ;Return + ;IfFileExists "$INSTDIR\*.*" +2 + ;Return + ;StrCmp "$EXEDIR" "$INSTDIR" 0 +2 + ;Return + ;IfFileExists "$INSTDIR\LameXP.exe" +2 + ;Return EnableUpdateMode: @@ -581,6 +597,11 @@ Function CheckForUpdate EnableWindow $R1 0 FunctionEnd +Function un.CheckForcedUninstall + !insertmacro un.GetCommandlineParameter "Force" "?" $R0 + ${IfNotThen} "$R0" == "?" ${|} Abort ${|} +FunctionEnd + ;-------------------------------- ;Check For Pre-Release diff --git a/src/Config.h b/src/Config.h index ac2153ca..a9527e75 100644 --- a/src/Config.h +++ b/src/Config.h @@ -30,7 +30,7 @@ #define VER_LAMEXP_MINOR_LO 3 #define VER_LAMEXP_TYPE Beta #define VER_LAMEXP_PATCH 3 -#define VER_LAMEXP_BUILD 716 +#define VER_LAMEXP_BUILD 717 /////////////////////////////////////////////////////////////////////////////// // Tools versions diff --git a/src/Dialog_MainWindow.cpp b/src/Dialog_MainWindow.cpp index 7c487cec..ec52cfe9 100644 --- a/src/Dialog_MainWindow.cpp +++ b/src/Dialog_MainWindow.cpp @@ -935,7 +935,7 @@ void MainWindow::windowShown(void) QString uninstallerPath = uninstallerInfo.canonicalFilePath(); for(int i = 0; i < 3; i++) { - HINSTANCE res = ShellExecuteW(this->winId(), L"open", QWCHAR(QDir::toNativeSeparators(uninstallerPath)), NULL, QWCHAR(QDir::toNativeSeparators(uninstallerDir)), SW_SHOWNORMAL); + HINSTANCE res = ShellExecuteW(this->winId(), L"open", QWCHAR(QDir::toNativeSeparators(uninstallerPath)), L"/Force", QWCHAR(QDir::toNativeSeparators(uninstallerDir)), SW_SHOWNORMAL); if(reinterpret_cast(res) > 32) break; } } -- 2.11.0