| |
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 |