OLD | NEW |
| (Empty) |
1 #!/usr/bin/python2.4 | |
2 # | |
3 # Copyright 2010 Google Inc. | |
4 # | |
5 # Licensed under the Apache License, Version 2.0 (the "License"); | |
6 # you may not use this file except in compliance with the License. | |
7 # You may obtain a copy of the License at | |
8 # | |
9 # http://www.apache.org/licenses/LICENSE-2.0 | |
10 # | |
11 # Unless required by applicable law or agreed to in writing, software | |
12 # distributed under the License is distributed on an "AS IS" BASIS, | |
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 # See the License for the specific language governing permissions and | |
15 # limitations under the License. | |
16 # ======================================================================== | |
17 | |
18 """Constants and utilities related to Omaha versions.""" | |
19 | |
20 _ONECLICK_PLUGIN_NAME = 'npGoogleOneClick' | |
21 _UPDATE_PLUGIN_NAME = 'npGoogleUpdate' | |
22 _BHO_NAME = 'GoopdateBho' | |
23 _CRASH_HANDLER_NAME = 'GoogleCrashHandler' | |
24 | |
25 # List of languages that are fully supported in the current build. | |
26 _OMAHA_LANGUAGES = [ | |
27 'am', | |
28 'ar', | |
29 'bg', | |
30 'bn', | |
31 'ca', | |
32 'cs', | |
33 'da', | |
34 'de', | |
35 'el', | |
36 'en', | |
37 'en-GB', | |
38 'es', | |
39 'es-419', | |
40 'et', | |
41 'fa', | |
42 'fi', | |
43 'fil', | |
44 'fr', | |
45 'gu', | |
46 'hi', | |
47 'hr', | |
48 'hu', | |
49 'id', | |
50 'is', | |
51 'it', | |
52 'iw', | |
53 'ja', | |
54 'kn', | |
55 'ko', | |
56 'lt', | |
57 'lv', | |
58 'ml', | |
59 'mr', | |
60 'ms', | |
61 'nl', | |
62 'no', | |
63 'pl', | |
64 'pt-BR', | |
65 'pt-PT', | |
66 'ro', | |
67 'ru', | |
68 'sk', | |
69 'sl', | |
70 'sr', | |
71 'sv', | |
72 'sw', | |
73 'ta', | |
74 'te', | |
75 'th', | |
76 'tr', | |
77 'uk', | |
78 'ur', | |
79 'vi', | |
80 'zh-CN', | |
81 'zh-TW', | |
82 ] | |
83 | |
84 # The shell and goopdate.dll contain additional languages. | |
85 # 'userdefault' addresses apps that don't look up the resource for the OS | |
86 # language. See http://b/1328652. | |
87 _ADDITIONAL_SHELL_LANGUAGES = [ | |
88 'or', | |
89 'userdefault', | |
90 'zh-HK', | |
91 ] | |
92 | |
93 | |
94 def _IsSupportedOmaha2Version(omaha_version): | |
95 """Returns true if omaha_version is an Omaha 2 version and is supported.""" | |
96 return (omaha_version[0] == 1 and | |
97 omaha_version[1] == 2 and | |
98 omaha_version[2] >= 183) | |
99 | |
100 | |
101 # All languages supported by this script currently have the same set of | |
102 # languages, so the omaha_version_info parameter is unused. | |
103 def _GetMetainstallerPayloadFilenames(prefix, | |
104 update_plugin_filename, | |
105 bho_filename, | |
106 languages, | |
107 omaha_version): | |
108 """Returns list of metainstaller payload files for specified Omaha version.""" | |
109 plugin_dll_name = '%s%s' % (prefix, update_plugin_filename) | |
110 bho_dll_name = '%s%s' % (prefix, bho_filename) | |
111 | |
112 # The list of files below needs to be kept in sync with the list in | |
113 # SetupFiles::BuildFileLists(). | |
114 # TODO(omaha): Move the other filename defines in main.scons into this file | |
115 # and allow all filenames to be customized. At the moment, while the plugin | |
116 # names are generated in one place due to version numbers, most of the other | |
117 # files (googleupdate.exe, goopdateres_*.dll, etc.) are hardcoded all over | |
118 # the place, and require a ton of point fixes to customize. | |
119 payload_files = [ | |
120 'GoogleUpdate.exe', | |
121 '%s.exe' % _CRASH_HANDLER_NAME, | |
122 '%sgoopdate.dll' % (prefix), | |
123 plugin_dll_name, | |
124 bho_dll_name, | |
125 'GoogleUpdateHelper.msi', | |
126 'GoogleUpdateBroker.exe', | |
127 'GoogleUpdateOnDemand.exe', | |
128 '%spsmachine.dll' % (prefix), | |
129 '%spsuser.dll' % (prefix), | |
130 ] | |
131 | |
132 if (omaha_version[0] == 1 and | |
133 omaha_version[1] == 3 and | |
134 omaha_version[2] >= 13): | |
135 # The BHO is not built yet. | |
136 payload_files.remove(bho_dll_name) | |
137 elif _IsSupportedOmaha2Version(omaha_version): | |
138 payload_files.remove(plugin_dll_name) | |
139 payload_files.remove('GoogleUpdateBroker.exe') | |
140 payload_files.remove('GoogleUpdateOnDemand.exe') | |
141 payload_files.remove('psmachine.dll') | |
142 payload_files.remove('psuser.dll') | |
143 else: | |
144 raise Exception('Unsupported version: ' + | |
145 ConvertVersionToString(omaha_version)) | |
146 | |
147 for language in languages: | |
148 payload_files += ['%sgoopdateres_%s.dll' % (prefix, language)] | |
149 | |
150 return payload_files | |
151 | |
152 | |
153 def ConvertVersionToString(version): | |
154 """Converts a four-element version list to a version string.""" | |
155 return '%d.%d.%d.%d' % (version[0], version[1], version[2], version[3]) | |
156 | |
157 | |
158 def GetONECLICK_PLUGIN_NAME(): # pylint: disable-msg=C6409 | |
159 """Returns the value of the ONECLICK_PLUGIN_NAME define for the C++ code.""" | |
160 return _ONECLICK_PLUGIN_NAME | |
161 | |
162 | |
163 def GetUPDATE_PLUGIN_NAME(): # pylint: disable-msg=C6409 | |
164 """Returns the value of the UPDATE_PLUGIN_NAME define for the C++ code.""" | |
165 return _UPDATE_PLUGIN_NAME | |
166 | |
167 | |
168 def GetBHO_NAME(): # pylint: disable-msg=C6409 | |
169 """Returns the value of the BHO_NAME define for the C++ code.""" | |
170 return _BHO_NAME | |
171 | |
172 | |
173 def GetCRASH_HANDLER_NAME(): # pylint: disable-msg=C6409 | |
174 """Returns the value of the CRASH_HANDLER_NAME define for the C++ code.""" | |
175 return _CRASH_HANDLER_NAME | |
176 | |
177 | |
178 def GetLanguagesForVersion(omaha_version): | |
179 """Returns a list of languages supported by omaha_version.""" | |
180 # Make a copy in case the list is modified below. | |
181 supported_languages = list(_OMAHA_LANGUAGES) | |
182 | |
183 # When languages are added, add a version check for older versions without the | |
184 # new languages and remove the new languages from supported_languages. | |
185 | |
186 if (omaha_version[0] == 1 and | |
187 omaha_version[1] == 3 and | |
188 omaha_version[2] >= 21): | |
189 # All languages are supported. | |
190 pass | |
191 elif _IsSupportedOmaha2Version(omaha_version): | |
192 # All current languages are supported. 'or' was also supported. | |
193 supported_languages += ['or'] | |
194 supported_languages.remove('am') | |
195 supported_languages.remove('sw') | |
196 else: | |
197 raise Exception('Unsupported version: ' + | |
198 ConvertVersionToString(omaha_version)) | |
199 | |
200 return supported_languages | |
201 | |
202 | |
203 def GetShellLanguagesForVersion(omaha_version): | |
204 """Returns a list of languages supported by the omaha_version shell.""" | |
205 | |
206 # Silence PyLint. All languages supported by this script currently have the | |
207 # same set of languages, so this variable is unused. | |
208 omaha_version = omaha_version | |
209 | |
210 return _OMAHA_LANGUAGES + _ADDITIONAL_SHELL_LANGUAGES | |
211 | |
212 | |
213 class OmahaVersionInfo(object): | |
214 """Contains information about a specific version of Omaha. | |
215 | |
216 Attributes: | |
217 filename_prefix: Prefix to use for all output files. | |
218 version_major: Major version. | |
219 version_minor: Minor version. | |
220 version_build: Build version. | |
221 version_patch: Patch version. | |
222 oneclick_plugin_version: Version of the OneClick plug-in. | |
223 oneclick_plugin_filename: Name of the signed OneClick DLL. | |
224 update_plugin_version: Version of the Omaha 3 plug-in. | |
225 update_plugin_filename: Name of the signed Omaha 3 plug-in DLL. | |
226 bho_filename: Name of the signed BHO DLL. | |
227 crash_handler_filename: Name of the Crash Handler EXE. | |
228 oneclick_signed_file_info: SignedFileInfo object for the OneClick DLL. | |
229 bho_signed_file_info: SignedFileInfo object for the BHO DLL. | |
230 | |
231 """ | |
232 | |
233 def __init__(self, version_file): | |
234 """Initializes the class based on data from a VERSION file.""" | |
235 self._ReadFile(version_file) | |
236 | |
237 self.filename_prefix = '' | |
238 | |
239 # Objects containing more properties used to build the file. | |
240 self.oneclick_signed_file_info = SignedFileInfo( | |
241 _ONECLICK_PLUGIN_NAME, | |
242 'dll', | |
243 self.oneclick_plugin_version) | |
244 self.plugin_signed_file_info = SignedFileInfo( | |
245 _UPDATE_PLUGIN_NAME, | |
246 'dll', | |
247 self.update_plugin_version) | |
248 self.bho_signed_file_info = SignedFileInfo(_BHO_NAME, 'dll') | |
249 | |
250 # Simple properties for callers that only need the final filename. Not | |
251 # affected by internal build changes. | |
252 self.oneclick_plugin_filename = self.oneclick_signed_file_info.filename | |
253 self.update_plugin_filename = self.plugin_signed_file_info.filename | |
254 self.bho_filename = self.bho_signed_file_info.filename | |
255 self.crash_handler_filename = _CRASH_HANDLER_NAME | |
256 | |
257 def _ReadFile(self, version_file): | |
258 """Reads and stores data from a VERSION file.""" | |
259 | |
260 execfile(version_file, globals()) | |
261 | |
262 # Silence Pylint. Values from version_file are not defined in this file. | |
263 # E0602: Undefined variable. | |
264 # pylint: disable-msg=E0602 | |
265 | |
266 if version_patch > 0: | |
267 incrementing_value = version_patch | |
268 incrementing_value_name = 'patch' | |
269 else: | |
270 incrementing_value = version_build | |
271 incrementing_value_name = 'build' | |
272 if 0 == incrementing_value % 2: | |
273 raise Exception('ERROR: By convention, the %s number in VERSION ' | |
274 '(currently %d) should be odd.' % | |
275 (incrementing_value_name, incrementing_value)) | |
276 | |
277 self.version_major = version_major | |
278 self.version_minor = version_minor | |
279 self.version_build = version_build | |
280 self.version_patch = version_patch | |
281 | |
282 self.oneclick_plugin_version = oneclick_plugin_version | |
283 | |
284 # update_plugin_version does not exist in Omaha 2 VERSION file. Handle this. | |
285 try: | |
286 self.update_plugin_version = update_plugin_version | |
287 except NameError: | |
288 if _IsSupportedOmaha2Version(self.GetVersion()): | |
289 self.update_plugin_version = -1 | |
290 else: | |
291 raise | |
292 | |
293 # pylint: enable-msg=E0602 | |
294 | |
295 def MakeTestVersion(self, delta=1): | |
296 """Changes this object to be for a TEST version of Omaha.""" | |
297 | |
298 if delta <= 0: | |
299 raise Exception('Delta must be greater than 0.') | |
300 | |
301 # If we're doing a patch, increment patch; else, increment build. | |
302 if self.version_patch > 0: | |
303 self.version_patch += delta | |
304 else: | |
305 self.version_build += delta | |
306 | |
307 self.filename_prefix = 'TEST_' | |
308 | |
309 def GetVersion(self): | |
310 """Returns the version elements as a list.""" | |
311 return [self.version_major, | |
312 self.version_minor, | |
313 self.version_build, | |
314 self.version_patch | |
315 ] | |
316 | |
317 def GetVersionString(self): | |
318 """Returns the version as a string.""" | |
319 return ConvertVersionToString(self.GetVersion()) | |
320 | |
321 def GetSupportedLanguages(self): | |
322 """Returns a list of languages supported by this version.""" | |
323 return GetLanguagesForVersion(self.GetVersion()) | |
324 | |
325 def GetMetainstallerPayloadFilenames(self): | |
326 """Returns list of metainstaller payload files for this version of Omaha.""" | |
327 return _GetMetainstallerPayloadFilenames(self.filename_prefix, | |
328 self.update_plugin_filename, | |
329 self.bho_filename, | |
330 self.GetSupportedLanguages(), | |
331 self.GetVersion()) | |
332 | |
333 | |
334 class SignedFileInfo(object): | |
335 """Contains information, including intermediate names, for signed file.""" | |
336 | |
337 def __init__(self, unversioned_name, extension, file_version=None): | |
338 """Initializes the class members based on the parameters.""" | |
339 | |
340 if file_version: | |
341 base_name = '%s%d' % (unversioned_name, file_version) | |
342 else: | |
343 base_name = unversioned_name | |
344 | |
345 self.filename_base = base_name | |
346 self.filename = '%s.%s' % (self.filename_base, extension) | |
347 | |
348 self.unsigned_filename_base = '%s_unsigned' % base_name | |
349 self.unsigned_filename = '%s.%s' % (self.unsigned_filename_base, extension) | |
OLD | NEW |