pidgin/pidgin
Clone
Summary
Browse
Changes
Graph
closing merged branch
port-changes-from-branch-2.x.y-to-default
2020-02-03, Gary Kramlich
2f836435c33c
closing merged branch
;;
;; Windows Pidgin NSIS installer plugin helper utilities
;; Copyright 2005, Daniel Atallah <daniel_atallah@yahoo.com>
;;
;; Include in plugin installer scripts using:
;; !addincludedir "${PATH_TO_PIDGIN_SRC}\pidgin\win32\nsis"
;; !include "pidgin-plugin.nsh"
;;
!define
PIDGIN_REG_KEY
"SOFTWARE\pidgin"
!define
PIDGIN_VERSION_OK
0
!define
PIDGIN_VERSION_INCOMPATIBLE
1
!define
PIDGIN_VERSION_UNDEFINED
2
; Extract the Pidgin Version from the registry
; This will set the Error flag if unable to determine the value
; Pop the value of the stack after calling this to get the value (unless Error Flag is set)
Function
GetPidginVersion
Push
$R0
; Read the pidgin version
ClearErrors
ReadRegStr
$R0
HKLM
${PIDGIN_REG_KEY}
"Version"
IfErrors
+
1
GetPidginVersion_found
; fall back to the HKCU registry key
ReadRegStr
$R0
HKCU
${PIDGIN_REG_KEY}
"Version"
IfErrors
GetPidginVersion_done
; Keep the error flag set
GetPidginVersion_found
:
Push
$R0
; Push the value onto the stack
Exch
GetPidginVersion_done
:
; restore $R0
Pop
$R0
FunctionEnd
; Check that the currently installed Pidgin version is compatible
; with the plugin version we are installing
; Push the Plugin's Pidgin Version onto the Stack before calling
; After calling, the top of the Stack will contain the result of the check:
; PIDGIN_VERSION_OK - If the installed Pidgin version is compatible w/ the version specified
; PIDGIN_VERSION_INCOMPATIBLE - If the installed Pidgin version isn't compatible w/ the version specified
; PIDGIN_VERSION_UNDEFINED - If the installed Pidgin version can't be determined
Function
CheckPidginVersion
; Save the Variable values that we will use in the stack
Push
$R4
Exch
Pop
$R4
; Get the plugin's Pidgin Version
Push
$R0
Push
$R1
Push
$R2
; Read the pidgin version
Call
GetPidginVersion
IfErrors
checkPidginVersion_noPidginInstallFound
Pop
$R0
;If they are exactly the same, we don't need to look at anything else
StrCmp
$R0
$R4
checkPidginVersion_VersionOK
; Versions are in the form of X.Y.Z
; If X is different or plugin's Y > pidgin's Y, then we shouldn't install
;Check the Major Version
Push
$R0
Push
0
Call
GetVersionComponent
IfErrors
checkPidginVersion_noPidginInstallFound
;We couldn't extract 'X' from the installed pidgin version
Pop
$R2
Push
$R4
Push
0
Call
GetVersionComponent
IfErrors
checkPidginVersion_BadVersion
; this isn't a valid version, so don't bother even checking
Pop
$R1
;Check that both versions' X is the same
StrCmp
$R1
$R2
+
1
checkPidginVersion_BadVersion
;Check the Minor Version
Push
$R0
Push
1
Call
GetVersionComponent
IfErrors
checkPidginVersion_noPidginInstallFound
;We couldn't extract 'Y' from the installed pidgin version
Pop
$R2
Push
$R4
Push
1
Call
GetVersionComponent
IfErrors
checkPidginVersion_BadVersion
; this isn't a valid version, so don't bother even checking
Pop
$R1
;Check that plugin's Y <= pidgin's Y
IntCmp
$R1
$R2
checkPidginVersion_VersionOK
checkPidginVersion_VersionOK
checkPidginVersion_BadVersion
checkPidginVersion_BadVersion
:
Push
${PIDGIN_VERSION_INCOMPATIBLE}
goto
checkPidginVersion_done
checkPidginVersion_noPidginInstallFound
:
Push
${PIDGIN_VERSION_UNDEFINED}
goto
checkPidginVersion_done
checkPidginVersion_VersionOK
:
Push
${PIDGIN_VERSION_OK}
checkPidginVersion_done
:
; Restore the Variables that we used
Exch
Pop
$R2
Exch
Pop
$R1
Exch
Pop
$R0
Exch
Pop
$R4
FunctionEnd
; Extract the part of a string prior to "." (or the whole string if there is no ".")
; If no "." was found, the ErrorFlag will be set
; Before this is called, Push ${VERSION_STRING} must be called, and then Push 0 for Major, 1 for Minor, etc
; Pop should be called after to retrieve the new value
Function
GetVersionComponent
ClearErrors
; Save the Variable values that we will use in the stack
Push
$1
Exch
Pop
$1
;The version component which we want to extract (0, 1, 2)
Exch
Push
$0
Exch
Pop
$0
;The string from which to extract the version component
Push
$2
Push
$3
Push
$4
Push
$5
Push
$6
Push
$7
StrCpy
$2
"0"
;Initialize our string index counter
StrCpy
$7
"0"
;Index of last "."
StrCpy
$3
"0"
;Initialize our version index counter
startGetVersionComponentLoop
:
;avoid infinite loop (if we have gotten the whole initial string, exit the loop and set the error flag)
StrCmp
$6
$0
GetVersionComponentSetErrorFlag
IntOp
$2
$2
+
1
StrCpy
$6
$0
$2
;Update the infinite loop preventing string
;Determine the correct substring (only the current index component)
IntOp
$5
$2
-
$7
StrCpy
$4
$0
$5
$7
;Append the current character in $0 to $4
StrCpy
$5
$0
1
$2
;store the next character in $5
;if the next character is ".", $4 will contain the version component prior to "."
StrCmp
$5
"."
+
1
startGetVersionComponentLoop
StrCmp
$3
$1
doneGetVersionComponent
;If it is the version component we're looking for, stop
IntOp
$3
$3
+
1
;Increment the version index counter
IntOp
$2
$2
+
1
;Increment the version string index to "." (so it will be skipped)
StrCpy
$7
$2
;Keep track of the index of the last "."
StrCpy
$6
$0
$2
;Update the infinite loop preventing string
goto
startGetVersionComponentLoop
GetVersionComponentSetErrorFlag
:
SetErrors
doneGetVersionComponent
:
; Restore the Variables that we used
Pop
$7
Pop
$6
Pop
$5
Push
$4
;This is the value we're returning
Exch
Pop
$4
Exch
Pop
$3
Exch
Pop
$2
Exch
Pop
$0
Exch
Pop
$1
FunctionEnd