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
+