OSDN Git Service

Added support for /Force to uninstaller. Required some tweaks for the 'parameters...
authorlordmulder <mulder2@gmx.de>
Fri, 7 Oct 2011 14:06:48 +0000 (16:06 +0200)
committerlordmulder <mulder2@gmx.de>
Fri, 7 Oct 2011 14:06:48 +0000 (16:06 +0200)
etc/NSIS/parameters.nsh
etc/NSIS/setup.nsi
src/Config.h
src/Dialog_MainWindow.cpp

index 72c175b..ae1060a 100644 (file)
@@ -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<cmorgan@alum.wpi.edu> 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__
index 483bed8..6d0fb6f 100644 (file)
 !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
index ac2153c..a9527e7 100644 (file)
@@ -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
index 7c487ce..ec52cfe 100644 (file)
@@ -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<int>(res) > 32) break;
                                }
                        }