Mercurial > pidgin
diff gtk/win32/nsis/gaim-plugin.nsh @ 14191:009db0b357b5
This is a hand-crafted commit to migrate across subversion revisions
16854:16861, due to some vagaries of the way the original renames were
done. Witness that monotone can do in one revision what svn had to
spread across several.
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Sat, 16 Dec 2006 04:59:55 +0000 |
parents | |
children | 1a01b1dae517 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gtk/win32/nsis/gaim-plugin.nsh Sat Dec 16 04:59:55 2006 +0000 @@ -0,0 +1,181 @@ +;; +;; Windows Gaim NSIS installer plugin helper utilities +;; Copyright 2005, Daniel Atallah <daniel_atallah@yahoo.com> +;; +;; Include in plugin installer scripts using: +;; !addincludedir "${PATH_TO_GAIM_SRC}\src\win32\nsis" +;; !include "gaim-plugin.nsh" +;; + +!define GAIM_REG_KEY "SOFTWARE\gaim" + +!define GAIM_VERSION_OK 0 +!define GAIM_VERSION_INCOMPATIBLE 1 +!define GAIM_VERSION_UNDEFINED 2 + +; Extract the Gaim 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 GetGaimVersion + Push $R0 + + ; Read the gaim version + ClearErrors + ReadRegStr $R0 HKLM ${GAIM_REG_KEY} "Version" + IfErrors +1 GetGaimVersion_found + ; fall back to the HKCU registry key + ReadRegStr $R0 HKCU ${GAIM_REG_KEY} "Version" + IfErrors GetGaimVersion_done ; Keep the error flag set + + GetGaimVersion_found: + Push $R0 ; Push the value onto the stack + Exch + + GetGaimVersion_done: + ; restore $R0 + Pop $R0 +FunctionEnd + +; Check that the currently installed gaim version is compatible +; with the plugin version we are installing +; Push the Plugin's Gaim Version onto the Stack before calling +; After calling, the top of the Stack will contain the result of the check: +; GAIM_VERSION_OK - If the installed gaim version is compatible w/ the version specified +; GAIM_VERSION_INCOMPATIBLE - If the installed gaim version isn't compatible w/ the ersion specified +; GAIM_VERSION_UNDEFINED - If the installed gaim version can't be determined +Function CheckGaimVersion + ; Save the Variable values that we will use in the stack + Push $R4 + Exch + Pop $R4 ; Get the plugin's Gaim Version + Push $R0 + Push $R1 + Push $R2 + + ; Read the gaim version + Call GetGaimVersion + IfErrors checkGaimVersion_noGaimInstallFound + Pop $R0 + + ;If they are exactly the same, we don't need to look at anything else + StrCmp $R0 $R4 checkGaimVersion_VersionOK + + ; Versions are in the form of X.Y.Z + ; If X is different or plugin's Y > gaim's Y, then we shouldn't install + + ;Check the Major Version + Push $R0 + Push 0 + Call GetVersionComponent + IfErrors checkGaimVersion_noGaimInstallFound ;We couldn't extract 'X' from the installed gaim version + Pop $R2 + Push $R4 + Push 0 + Call GetVersionComponent + IfErrors checkGaimVersion_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 checkGaimVersion_BadVersion + + ;Check the Minor Version + Push $R0 + Push 1 + Call GetVersionComponent + IfErrors checkGaimVersion_noGaimInstallFound ;We couldn't extract 'Y' from the installed gaim version + Pop $R2 + Push $R4 + Push 1 + Call GetVersionComponent + IfErrors checkGaimVersion_BadVersion ; this isn't a valid version, so don't bother even checking + Pop $R1 + ;Check that plugin's Y <= gaim's Y + IntCmp $R1 $R2 checkGaimVersion_VersionOK checkGaimVersion_VersionOK checkGaimVersion_BadVersion + + checkGaimVersion_BadVersion: + Push ${GAIM_VERSION_INCOMPATIBLE} + goto checkGaimVersion_done + checkGaimVersion_noGaimInstallFound: + Push ${GAIM_VERSION_UNDEFINED} + goto checkGaimVersion_done + checkGaimVersion_VersionOK: + Push ${GAIM_VERSION_OK} + + checkGaimVersion_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 +