gtk/win32/nsis/gaim-plugin.nsh

changeset 14253
b63ebf84c42b
parent 11578
70230c5dded2
child 14512
7584322a65a2
equal deleted inserted replaced
14252:d10dda2777a9 14253:b63ebf84c42b
1 ;;
2 ;; Windows Gaim NSIS installer plugin helper utilities
3 ;; Copyright 2005, Daniel Atallah <daniel_atallah@yahoo.com>
4 ;;
5 ;; Include in plugin installer scripts using:
6 ;; !addincludedir "${PATH_TO_GAIM_SRC}\src\win32\nsis"
7 ;; !include "gaim-plugin.nsh"
8 ;;
9
10 !define GAIM_REG_KEY "SOFTWARE\gaim"
11
12 !define GAIM_VERSION_OK 0
13 !define GAIM_VERSION_INCOMPATIBLE 1
14 !define GAIM_VERSION_UNDEFINED 2
15
16 ; Extract the Gaim Version from the registry
17 ; This will set the Error flag if unable to determine the value
18 ; Pop the value of the stack after calling this to get the value (unless Error Flag is set)
19 Function GetGaimVersion
20 Push $R0
21
22 ; Read the gaim version
23 ClearErrors
24 ReadRegStr $R0 HKLM ${GAIM_REG_KEY} "Version"
25 IfErrors +1 GetGaimVersion_found
26 ; fall back to the HKCU registry key
27 ReadRegStr $R0 HKCU ${GAIM_REG_KEY} "Version"
28 IfErrors GetGaimVersion_done ; Keep the error flag set
29
30 GetGaimVersion_found:
31 Push $R0 ; Push the value onto the stack
32 Exch
33
34 GetGaimVersion_done:
35 ; restore $R0
36 Pop $R0
37 FunctionEnd
38
39 ; Check that the currently installed gaim version is compatible
40 ; with the plugin version we are installing
41 ; Push the Plugin's Gaim Version onto the Stack before calling
42 ; After calling, the top of the Stack will contain the result of the check:
43 ; GAIM_VERSION_OK - If the installed gaim version is compatible w/ the version specified
44 ; GAIM_VERSION_INCOMPATIBLE - If the installed gaim version isn't compatible w/ the ersion specified
45 ; GAIM_VERSION_UNDEFINED - If the installed gaim version can't be determined
46 Function CheckGaimVersion
47 ; Save the Variable values that we will use in the stack
48 Push $R4
49 Exch
50 Pop $R4 ; Get the plugin's Gaim Version
51 Push $R0
52 Push $R1
53 Push $R2
54
55 ; Read the gaim version
56 Call GetGaimVersion
57 IfErrors checkGaimVersion_noGaimInstallFound
58 Pop $R0
59
60 ;If they are exactly the same, we don't need to look at anything else
61 StrCmp $R0 $R4 checkGaimVersion_VersionOK
62
63 ; Versions are in the form of X.Y.Z
64 ; If X is different or plugin's Y > gaim's Y, then we shouldn't install
65
66 ;Check the Major Version
67 Push $R0
68 Push 0
69 Call GetVersionComponent
70 IfErrors checkGaimVersion_noGaimInstallFound ;We couldn't extract 'X' from the installed gaim version
71 Pop $R2
72 Push $R4
73 Push 0
74 Call GetVersionComponent
75 IfErrors checkGaimVersion_BadVersion ; this isn't a valid version, so don't bother even checking
76 Pop $R1
77 ;Check that both versions' X is the same
78 StrCmp $R1 $R2 +1 checkGaimVersion_BadVersion
79
80 ;Check the Minor Version
81 Push $R0
82 Push 1
83 Call GetVersionComponent
84 IfErrors checkGaimVersion_noGaimInstallFound ;We couldn't extract 'Y' from the installed gaim version
85 Pop $R2
86 Push $R4
87 Push 1
88 Call GetVersionComponent
89 IfErrors checkGaimVersion_BadVersion ; this isn't a valid version, so don't bother even checking
90 Pop $R1
91 ;Check that plugin's Y <= gaim's Y
92 IntCmp $R1 $R2 checkGaimVersion_VersionOK checkGaimVersion_VersionOK checkGaimVersion_BadVersion
93
94 checkGaimVersion_BadVersion:
95 Push ${GAIM_VERSION_INCOMPATIBLE}
96 goto checkGaimVersion_done
97 checkGaimVersion_noGaimInstallFound:
98 Push ${GAIM_VERSION_UNDEFINED}
99 goto checkGaimVersion_done
100 checkGaimVersion_VersionOK:
101 Push ${GAIM_VERSION_OK}
102
103 checkGaimVersion_done:
104 ; Restore the Variables that we used
105 Exch
106 Pop $R2
107 Exch
108 Pop $R1
109 Exch
110 Pop $R0
111 Exch
112 Pop $R4
113 FunctionEnd
114
115 ; Extract the part of a string prior to "." (or the whole string if there is no ".")
116 ; If no "." was found, the ErrorFlag will be set
117 ; Before this is called, Push ${VERSION_STRING} must be called, and then Push 0 for Major, 1 for Minor, etc
118 ; Pop should be called after to retrieve the new value
119 Function GetVersionComponent
120 ClearErrors
121
122 ; Save the Variable values that we will use in the stack
123 Push $1
124 Exch
125 Pop $1 ;The version component which we want to extract (0, 1, 2)
126 Exch
127 Push $0
128 Exch
129 Pop $0 ;The string from which to extract the version component
130
131 Push $2
132 Push $3
133 Push $4
134 Push $5
135 Push $6
136 Push $7
137
138 StrCpy $2 "0" ;Initialize our string index counter
139 StrCpy $7 "0" ;Index of last "."
140 StrCpy $3 "0" ;Initialize our version index counter
141
142 startGetVersionComponentLoop:
143 ;avoid infinite loop (if we have gotten the whole initial string, exit the loop and set the error flag)
144 StrCmp $6 $0 GetVersionComponentSetErrorFlag
145 IntOp $2 $2 + 1
146 StrCpy $6 $0 $2 ;Update the infinite loop preventing string
147 ;Determine the correct substring (only the current index component)
148 IntOp $5 $2 - $7
149 StrCpy $4 $0 $5 $7 ;Append the current character in $0 to $4
150 StrCpy $5 $0 1 $2 ;store the next character in $5
151
152 ;if the next character is ".", $4 will contain the version component prior to "."
153 StrCmp $5 "." +1 startGetVersionComponentLoop
154 StrCmp $3 $1 doneGetVersionComponent ;If it is the version component we're looking for, stop
155 IntOp $3 $3 + 1 ;Increment the version index counter
156 IntOp $2 $2 + 1 ;Increment the version string index to "." (so it will be skipped)
157 StrCpy $7 $2 ;Keep track of the index of the last "."
158 StrCpy $6 $0 $2 ;Update the infinite loop preventing string
159 goto startGetVersionComponentLoop
160
161 GetVersionComponentSetErrorFlag:
162 SetErrors
163
164 doneGetVersionComponent:
165 ; Restore the Variables that we used
166 Pop $7
167 Pop $6
168 Pop $5
169 Push $4 ;This is the value we're returning
170 Exch
171 Pop $4
172 Exch
173 Pop $3
174 Exch
175 Pop $2
176 Exch
177 Pop $0
178 Exch
179 Pop $1
180 FunctionEnd
181

mercurial