OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // See the corresponding header file for description of the functions in this | 5 // See the corresponding header file for description of the functions in this |
6 // file. | 6 // file. |
7 | 7 |
8 #include "chrome/installer/util/install_util.h" | 8 #include "chrome/installer/util/install_util.h" |
9 | 9 |
10 #include <shellapi.h> | 10 #include <shellapi.h> |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 } else { | 118 } else { |
119 NOTREACHED() << "Unable to get default monitor"; | 119 NOTREACHED() << "Unable to get default monitor"; |
120 } | 120 } |
121 ::SetForegroundWindow(foreground_window); | 121 ::SetForegroundWindow(foreground_window); |
122 } | 122 } |
123 return foreground_window; | 123 return foreground_window; |
124 } | 124 } |
125 | 125 |
126 } // namespace | 126 } // namespace |
127 | 127 |
128 string16 InstallUtil::GetActiveSetupPath(BrowserDistribution* dist) { | 128 base::string16 InstallUtil::GetActiveSetupPath(BrowserDistribution* dist) { |
129 static const wchar_t kInstalledComponentsPath[] = | 129 static const wchar_t kInstalledComponentsPath[] = |
130 L"Software\\Microsoft\\Active Setup\\Installed Components\\"; | 130 L"Software\\Microsoft\\Active Setup\\Installed Components\\"; |
131 return kInstalledComponentsPath + dist->GetActiveSetupGuid(); | 131 return kInstalledComponentsPath + dist->GetActiveSetupGuid(); |
132 } | 132 } |
133 | 133 |
134 void InstallUtil::TriggerActiveSetupCommand() { | 134 void InstallUtil::TriggerActiveSetupCommand() { |
135 string16 active_setup_reg( | 135 base::string16 active_setup_reg( |
136 GetActiveSetupPath(BrowserDistribution::GetDistribution())); | 136 GetActiveSetupPath(BrowserDistribution::GetDistribution())); |
137 base::win::RegKey active_setup_key( | 137 base::win::RegKey active_setup_key( |
138 HKEY_LOCAL_MACHINE, active_setup_reg.c_str(), KEY_QUERY_VALUE); | 138 HKEY_LOCAL_MACHINE, active_setup_reg.c_str(), KEY_QUERY_VALUE); |
139 string16 cmd_str; | 139 base::string16 cmd_str; |
140 LONG read_status = active_setup_key.ReadValue(L"StubPath", &cmd_str); | 140 LONG read_status = active_setup_key.ReadValue(L"StubPath", &cmd_str); |
141 if (read_status != ERROR_SUCCESS) { | 141 if (read_status != ERROR_SUCCESS) { |
142 LOG(ERROR) << active_setup_reg << ", " << read_status; | 142 LOG(ERROR) << active_setup_reg << ", " << read_status; |
143 // This should never fail if Chrome is registered at system-level, but if it | 143 // This should never fail if Chrome is registered at system-level, but if it |
144 // does there is not much else to be done. | 144 // does there is not much else to be done. |
145 return; | 145 return; |
146 } | 146 } |
147 | 147 |
148 CommandLine cmd(CommandLine::FromString(cmd_str)); | 148 CommandLine cmd(CommandLine::FromString(cmd_str)); |
149 // Force creation of shortcuts as the First Run beacon might land between now | 149 // Force creation of shortcuts as the First Run beacon might land between now |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 | 214 |
215 void InstallUtil::GetChromeVersion(BrowserDistribution* dist, | 215 void InstallUtil::GetChromeVersion(BrowserDistribution* dist, |
216 bool system_install, | 216 bool system_install, |
217 Version* version) { | 217 Version* version) { |
218 DCHECK(dist); | 218 DCHECK(dist); |
219 RegKey key; | 219 RegKey key; |
220 HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 220 HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
221 LONG result = key.Open(reg_root, dist->GetVersionKey().c_str(), | 221 LONG result = key.Open(reg_root, dist->GetVersionKey().c_str(), |
222 KEY_QUERY_VALUE); | 222 KEY_QUERY_VALUE); |
223 | 223 |
224 string16 version_str; | 224 base::string16 version_str; |
225 if (result == ERROR_SUCCESS) | 225 if (result == ERROR_SUCCESS) |
226 result = key.ReadValue(google_update::kRegVersionField, &version_str); | 226 result = key.ReadValue(google_update::kRegVersionField, &version_str); |
227 | 227 |
228 *version = Version(); | 228 *version = Version(); |
229 if (result == ERROR_SUCCESS && !version_str.empty()) { | 229 if (result == ERROR_SUCCESS && !version_str.empty()) { |
230 VLOG(1) << "Existing " << dist->GetDisplayName() << " version found " | 230 VLOG(1) << "Existing " << dist->GetDisplayName() << " version found " |
231 << version_str; | 231 << version_str; |
232 *version = Version(WideToASCII(version_str)); | 232 *version = Version(WideToASCII(version_str)); |
233 } else { | 233 } else { |
234 DCHECK_EQ(ERROR_FILE_NOT_FOUND, result); | 234 DCHECK_EQ(ERROR_FILE_NOT_FOUND, result); |
235 VLOG(1) << "No existing " << dist->GetDisplayName() | 235 VLOG(1) << "No existing " << dist->GetDisplayName() |
236 << " install found."; | 236 << " install found."; |
237 } | 237 } |
238 } | 238 } |
239 | 239 |
240 void InstallUtil::GetCriticalUpdateVersion(BrowserDistribution* dist, | 240 void InstallUtil::GetCriticalUpdateVersion(BrowserDistribution* dist, |
241 bool system_install, | 241 bool system_install, |
242 Version* version) { | 242 Version* version) { |
243 DCHECK(dist); | 243 DCHECK(dist); |
244 RegKey key; | 244 RegKey key; |
245 HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 245 HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
246 LONG result = | 246 LONG result = |
247 key.Open(reg_root, dist->GetVersionKey().c_str(), KEY_QUERY_VALUE); | 247 key.Open(reg_root, dist->GetVersionKey().c_str(), KEY_QUERY_VALUE); |
248 | 248 |
249 string16 version_str; | 249 base::string16 version_str; |
250 if (result == ERROR_SUCCESS) | 250 if (result == ERROR_SUCCESS) |
251 result = key.ReadValue(google_update::kRegCriticalVersionField, | 251 result = key.ReadValue(google_update::kRegCriticalVersionField, |
252 &version_str); | 252 &version_str); |
253 | 253 |
254 *version = Version(); | 254 *version = Version(); |
255 if (result == ERROR_SUCCESS && !version_str.empty()) { | 255 if (result == ERROR_SUCCESS && !version_str.empty()) { |
256 VLOG(1) << "Critical Update version for " << dist->GetDisplayName() | 256 VLOG(1) << "Critical Update version for " << dist->GetDisplayName() |
257 << " found " << version_str; | 257 << " found " << version_str; |
258 *version = Version(WideToASCII(version_str)); | 258 *version = Version(WideToASCII(version_str)); |
259 } else { | 259 } else { |
260 DCHECK_EQ(ERROR_FILE_NOT_FOUND, result); | 260 DCHECK_EQ(ERROR_FILE_NOT_FOUND, result); |
261 VLOG(1) << "No existing " << dist->GetDisplayName() | 261 VLOG(1) << "No existing " << dist->GetDisplayName() |
262 << " install found."; | 262 << " install found."; |
263 } | 263 } |
264 } | 264 } |
265 | 265 |
266 bool InstallUtil::IsOSSupported() { | 266 bool InstallUtil::IsOSSupported() { |
267 // We do not support Win2K or older, or XP without service pack 2. | 267 // We do not support Win2K or older, or XP without service pack 2. |
268 VLOG(1) << base::SysInfo::OperatingSystemName() << ' ' | 268 VLOG(1) << base::SysInfo::OperatingSystemName() << ' ' |
269 << base::SysInfo::OperatingSystemVersion(); | 269 << base::SysInfo::OperatingSystemVersion(); |
270 base::win::Version version = base::win::GetVersion(); | 270 base::win::Version version = base::win::GetVersion(); |
271 return (version > base::win::VERSION_XP) || | 271 return (version > base::win::VERSION_XP) || |
272 ((version == base::win::VERSION_XP) && | 272 ((version == base::win::VERSION_XP) && |
273 (base::win::OSInfo::GetInstance()->service_pack().major >= 2)); | 273 (base::win::OSInfo::GetInstance()->service_pack().major >= 2)); |
274 } | 274 } |
275 | 275 |
276 void InstallUtil::AddInstallerResultItems(bool system_install, | 276 void InstallUtil::AddInstallerResultItems( |
277 const string16& state_key, | 277 bool system_install, |
278 installer::InstallStatus status, | 278 const base::string16& state_key, |
279 int string_resource_id, | 279 installer::InstallStatus status, |
280 const string16* const launch_cmd, | 280 int string_resource_id, |
281 WorkItemList* install_list) { | 281 const base::string16* const launch_cmd, |
| 282 WorkItemList* install_list) { |
282 DCHECK(install_list); | 283 DCHECK(install_list); |
283 const HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 284 const HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
284 DWORD installer_result = (GetInstallReturnCode(status) == 0) ? 0 : 1; | 285 DWORD installer_result = (GetInstallReturnCode(status) == 0) ? 0 : 1; |
285 install_list->AddCreateRegKeyWorkItem(root, state_key); | 286 install_list->AddCreateRegKeyWorkItem(root, state_key); |
286 install_list->AddSetRegValueWorkItem(root, state_key, | 287 install_list->AddSetRegValueWorkItem(root, state_key, |
287 installer::kInstallerResult, | 288 installer::kInstallerResult, |
288 installer_result, true); | 289 installer_result, true); |
289 install_list->AddSetRegValueWorkItem(root, state_key, | 290 install_list->AddSetRegValueWorkItem(root, state_key, |
290 installer::kInstallerError, | 291 installer::kInstallerError, |
291 static_cast<DWORD>(status), true); | 292 static_cast<DWORD>(status), true); |
292 if (string_resource_id != 0) { | 293 if (string_resource_id != 0) { |
293 string16 msg = installer::GetLocalizedString(string_resource_id); | 294 base::string16 msg = installer::GetLocalizedString(string_resource_id); |
294 install_list->AddSetRegValueWorkItem(root, state_key, | 295 install_list->AddSetRegValueWorkItem(root, state_key, |
295 installer::kInstallerResultUIString, msg, true); | 296 installer::kInstallerResultUIString, msg, true); |
296 } | 297 } |
297 if (launch_cmd != NULL && !launch_cmd->empty()) { | 298 if (launch_cmd != NULL && !launch_cmd->empty()) { |
298 install_list->AddSetRegValueWorkItem(root, state_key, | 299 install_list->AddSetRegValueWorkItem(root, state_key, |
299 installer::kInstallerSuccessLaunchCmdLine, *launch_cmd, true); | 300 installer::kInstallerSuccessLaunchCmdLine, *launch_cmd, true); |
300 } | 301 } |
301 } | 302 } |
302 | 303 |
303 void InstallUtil::UpdateInstallerStage(bool system_install, | 304 void InstallUtil::UpdateInstallerStage(bool system_install, |
304 const string16& state_key_path, | 305 const base::string16& state_key_path, |
305 installer::InstallerStage stage) { | 306 installer::InstallerStage stage) { |
306 DCHECK_LE(static_cast<installer::InstallerStage>(0), stage); | 307 DCHECK_LE(static_cast<installer::InstallerStage>(0), stage); |
307 DCHECK_GT(installer::NUM_STAGES, stage); | 308 DCHECK_GT(installer::NUM_STAGES, stage); |
308 const HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 309 const HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
309 RegKey state_key; | 310 RegKey state_key; |
310 LONG result = state_key.Open(root, state_key_path.c_str(), | 311 LONG result = state_key.Open(root, state_key_path.c_str(), |
311 KEY_QUERY_VALUE | KEY_SET_VALUE); | 312 KEY_QUERY_VALUE | KEY_SET_VALUE); |
312 if (result == ERROR_SUCCESS) { | 313 if (result == ERROR_SUCCESS) { |
313 if (stage == installer::NO_STAGE) { | 314 if (stage == installer::NO_STAGE) { |
314 result = state_key.DeleteValue(installer::kInstallerExtraCode1); | 315 result = state_key.DeleteValue(installer::kInstallerExtraCode1); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 bool CheckIsChromeSxSProcess() { | 361 bool CheckIsChromeSxSProcess() { |
361 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 362 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
362 CHECK(command_line); | 363 CHECK(command_line); |
363 | 364 |
364 if (command_line->HasSwitch(installer::switches::kChromeSxS)) | 365 if (command_line->HasSwitch(installer::switches::kChromeSxS)) |
365 return true; | 366 return true; |
366 | 367 |
367 // Also return true if we are running from Chrome SxS installed path. | 368 // Also return true if we are running from Chrome SxS installed path. |
368 base::FilePath exe_dir; | 369 base::FilePath exe_dir; |
369 PathService::Get(base::DIR_EXE, &exe_dir); | 370 PathService::Get(base::DIR_EXE, &exe_dir); |
370 string16 chrome_sxs_dir(installer::kGoogleChromeInstallSubDir2); | 371 base::string16 chrome_sxs_dir(installer::kGoogleChromeInstallSubDir2); |
371 chrome_sxs_dir.append(installer::kSxSSuffix); | 372 chrome_sxs_dir.append(installer::kSxSSuffix); |
372 | 373 |
373 // This is SxS if current EXE is in or under (possibly multiple levels under) | 374 // This is SxS if current EXE is in or under (possibly multiple levels under) |
374 // |chrome_sxs_dir|\|installer::kInstallBinaryDir| | 375 // |chrome_sxs_dir|\|installer::kInstallBinaryDir| |
375 std::vector<base::FilePath::StringType> components; | 376 std::vector<base::FilePath::StringType> components; |
376 exe_dir.GetComponents(&components); | 377 exe_dir.GetComponents(&components); |
377 // We need at least 1 element in the array for the behavior of the following | 378 // We need at least 1 element in the array for the behavior of the following |
378 // loop to be defined. This should always be true, since we're splitting the | 379 // loop to be defined. This should always be true, since we're splitting the |
379 // path to our executable and one of the components will be the drive letter. | 380 // path to our executable and one of the components will be the drive letter. |
380 DCHECK(!components.empty()); | 381 DCHECK(!components.empty()); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 } | 433 } |
433 | 434 |
434 *path = path->Append(file); | 435 *path = path->Append(file); |
435 return true; | 436 return true; |
436 } | 437 } |
437 | 438 |
438 // This method tries to delete a registry key and logs an error message | 439 // This method tries to delete a registry key and logs an error message |
439 // in case of failure. It returns true if deletion is successful (or the key did | 440 // in case of failure. It returns true if deletion is successful (or the key did |
440 // not exist), otherwise false. | 441 // not exist), otherwise false. |
441 bool InstallUtil::DeleteRegistryKey(HKEY root_key, | 442 bool InstallUtil::DeleteRegistryKey(HKEY root_key, |
442 const string16& key_path) { | 443 const base::string16& key_path) { |
443 VLOG(1) << "Deleting registry key " << key_path; | 444 VLOG(1) << "Deleting registry key " << key_path; |
444 LONG result = ::SHDeleteKey(root_key, key_path.c_str()); | 445 LONG result = ::SHDeleteKey(root_key, key_path.c_str()); |
445 if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) { | 446 if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) { |
446 LOG(ERROR) << "Failed to delete registry key: " << key_path | 447 LOG(ERROR) << "Failed to delete registry key: " << key_path |
447 << " error: " << result; | 448 << " error: " << result; |
448 return false; | 449 return false; |
449 } | 450 } |
450 return true; | 451 return true; |
451 } | 452 } |
452 | 453 |
453 // This method tries to delete a registry value and logs an error message | 454 // This method tries to delete a registry value and logs an error message |
454 // in case of failure. It returns true if deletion is successful (or the key did | 455 // in case of failure. It returns true if deletion is successful (or the key did |
455 // not exist), otherwise false. | 456 // not exist), otherwise false. |
456 bool InstallUtil::DeleteRegistryValue(HKEY reg_root, | 457 bool InstallUtil::DeleteRegistryValue(HKEY reg_root, |
457 const string16& key_path, | 458 const base::string16& key_path, |
458 const string16& value_name) { | 459 const base::string16& value_name) { |
459 RegKey key; | 460 RegKey key; |
460 LONG result = key.Open(reg_root, key_path.c_str(), KEY_SET_VALUE); | 461 LONG result = key.Open(reg_root, key_path.c_str(), KEY_SET_VALUE); |
461 if (result == ERROR_SUCCESS) | 462 if (result == ERROR_SUCCESS) |
462 result = key.DeleteValue(value_name.c_str()); | 463 result = key.DeleteValue(value_name.c_str()); |
463 if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) { | 464 if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) { |
464 LOG(ERROR) << "Failed to delete registry value: " << value_name | 465 LOG(ERROR) << "Failed to delete registry value: " << value_name |
465 << " error: " << result; | 466 << " error: " << result; |
466 return false; | 467 return false; |
467 } | 468 } |
468 return true; | 469 return true; |
469 } | 470 } |
470 | 471 |
471 // static | 472 // static |
472 InstallUtil::ConditionalDeleteResult InstallUtil::DeleteRegistryKeyIf( | 473 InstallUtil::ConditionalDeleteResult InstallUtil::DeleteRegistryKeyIf( |
473 HKEY root_key, | 474 HKEY root_key, |
474 const string16& key_to_delete_path, | 475 const base::string16& key_to_delete_path, |
475 const string16& key_to_test_path, | 476 const base::string16& key_to_test_path, |
476 const wchar_t* value_name, | 477 const wchar_t* value_name, |
477 const RegistryValuePredicate& predicate) { | 478 const RegistryValuePredicate& predicate) { |
478 DCHECK(root_key); | 479 DCHECK(root_key); |
479 ConditionalDeleteResult delete_result = NOT_FOUND; | 480 ConditionalDeleteResult delete_result = NOT_FOUND; |
480 RegKey key; | 481 RegKey key; |
481 string16 actual_value; | 482 base::string16 actual_value; |
482 if (key.Open(root_key, key_to_test_path.c_str(), | 483 if (key.Open(root_key, key_to_test_path.c_str(), |
483 KEY_QUERY_VALUE) == ERROR_SUCCESS && | 484 KEY_QUERY_VALUE) == ERROR_SUCCESS && |
484 key.ReadValue(value_name, &actual_value) == ERROR_SUCCESS && | 485 key.ReadValue(value_name, &actual_value) == ERROR_SUCCESS && |
485 predicate.Evaluate(actual_value)) { | 486 predicate.Evaluate(actual_value)) { |
486 key.Close(); | 487 key.Close(); |
487 delete_result = DeleteRegistryKey(root_key, key_to_delete_path) | 488 delete_result = DeleteRegistryKey(root_key, key_to_delete_path) |
488 ? DELETED : DELETE_FAILED; | 489 ? DELETED : DELETE_FAILED; |
489 } | 490 } |
490 return delete_result; | 491 return delete_result; |
491 } | 492 } |
492 | 493 |
493 // static | 494 // static |
494 InstallUtil::ConditionalDeleteResult InstallUtil::DeleteRegistryValueIf( | 495 InstallUtil::ConditionalDeleteResult InstallUtil::DeleteRegistryValueIf( |
495 HKEY root_key, | 496 HKEY root_key, |
496 const wchar_t* key_path, | 497 const wchar_t* key_path, |
497 const wchar_t* value_name, | 498 const wchar_t* value_name, |
498 const RegistryValuePredicate& predicate) { | 499 const RegistryValuePredicate& predicate) { |
499 DCHECK(root_key); | 500 DCHECK(root_key); |
500 DCHECK(key_path); | 501 DCHECK(key_path); |
501 ConditionalDeleteResult delete_result = NOT_FOUND; | 502 ConditionalDeleteResult delete_result = NOT_FOUND; |
502 RegKey key; | 503 RegKey key; |
503 string16 actual_value; | 504 base::string16 actual_value; |
504 if (key.Open(root_key, key_path, | 505 if (key.Open(root_key, key_path, |
505 KEY_QUERY_VALUE | KEY_SET_VALUE) == ERROR_SUCCESS && | 506 KEY_QUERY_VALUE | KEY_SET_VALUE) == ERROR_SUCCESS && |
506 key.ReadValue(value_name, &actual_value) == ERROR_SUCCESS && | 507 key.ReadValue(value_name, &actual_value) == ERROR_SUCCESS && |
507 predicate.Evaluate(actual_value)) { | 508 predicate.Evaluate(actual_value)) { |
508 LONG result = key.DeleteValue(value_name); | 509 LONG result = key.DeleteValue(value_name); |
509 if (result != ERROR_SUCCESS) { | 510 if (result != ERROR_SUCCESS) { |
510 LOG(ERROR) << "Failed to delete registry value: " | 511 LOG(ERROR) << "Failed to delete registry value: " |
511 << (value_name ? value_name : L"(Default)") | 512 << (value_name ? value_name : L"(Default)") |
512 << " error: " << result; | 513 << " error: " << result; |
513 delete_result = DELETE_FAILED; | 514 delete_result = DELETE_FAILED; |
514 } | 515 } |
515 delete_result = DELETED; | 516 delete_result = DELETED; |
516 } | 517 } |
517 return delete_result; | 518 return delete_result; |
518 } | 519 } |
519 | 520 |
520 bool InstallUtil::ValueEquals::Evaluate(const string16& value) const { | 521 bool InstallUtil::ValueEquals::Evaluate(const base::string16& value) const { |
521 return value == value_to_match_; | 522 return value == value_to_match_; |
522 } | 523 } |
523 | 524 |
524 // static | 525 // static |
525 int InstallUtil::GetInstallReturnCode(installer::InstallStatus status) { | 526 int InstallUtil::GetInstallReturnCode(installer::InstallStatus status) { |
526 switch (status) { | 527 switch (status) { |
527 case installer::FIRST_INSTALL_SUCCESS: | 528 case installer::FIRST_INSTALL_SUCCESS: |
528 case installer::INSTALL_REPAIRED: | 529 case installer::INSTALL_REPAIRED: |
529 case installer::NEW_VERSION_UPDATED: | 530 case installer::NEW_VERSION_UPDATED: |
530 case installer::IN_USE_UPDATED: | 531 case installer::IN_USE_UPDATED: |
531 case installer::UNUSED_BINARIES_UNINSTALLED: | 532 case installer::UNUSED_BINARIES_UNINSTALLED: |
532 return 0; | 533 return 0; |
533 default: | 534 default: |
534 return status; | 535 return status; |
535 } | 536 } |
536 } | 537 } |
537 | 538 |
538 // static | 539 // static |
539 void InstallUtil::MakeUninstallCommand(const string16& program, | 540 void InstallUtil::MakeUninstallCommand(const base::string16& program, |
540 const string16& arguments, | 541 const base::string16& arguments, |
541 CommandLine* command_line) { | 542 CommandLine* command_line) { |
542 *command_line = CommandLine::FromString(L"\"" + program + L"\" " + arguments); | 543 *command_line = CommandLine::FromString(L"\"" + program + L"\" " + arguments); |
543 } | 544 } |
544 | 545 |
545 // static | 546 // static |
546 string16 InstallUtil::GetCurrentDate() { | 547 base::string16 InstallUtil::GetCurrentDate() { |
547 static const wchar_t kDateFormat[] = L"yyyyMMdd"; | 548 static const wchar_t kDateFormat[] = L"yyyyMMdd"; |
548 wchar_t date_str[arraysize(kDateFormat)] = {0}; | 549 wchar_t date_str[arraysize(kDateFormat)] = {0}; |
549 int len = GetDateFormatW(LOCALE_INVARIANT, 0, NULL, kDateFormat, | 550 int len = GetDateFormatW(LOCALE_INVARIANT, 0, NULL, kDateFormat, |
550 date_str, arraysize(date_str)); | 551 date_str, arraysize(date_str)); |
551 if (len) { | 552 if (len) { |
552 --len; // Subtract terminating \0. | 553 --len; // Subtract terminating \0. |
553 } else { | 554 } else { |
554 PLOG(DFATAL) << "GetDateFormat"; | 555 PLOG(DFATAL) << "GetDateFormat"; |
555 } | 556 } |
556 | 557 |
557 return string16(date_str, len); | 558 return base::string16(date_str, len); |
558 } | 559 } |
559 | 560 |
560 // Open |path| with minimal access to obtain information about it, returning | 561 // Open |path| with minimal access to obtain information about it, returning |
561 // true and populating |handle| on success. | 562 // true and populating |handle| on success. |
562 // static | 563 // static |
563 bool InstallUtil::ProgramCompare::OpenForInfo(const base::FilePath& path, | 564 bool InstallUtil::ProgramCompare::OpenForInfo(const base::FilePath& path, |
564 base::win::ScopedHandle* handle) { | 565 base::win::ScopedHandle* handle) { |
565 DCHECK(handle); | 566 DCHECK(handle); |
566 handle->Set(base::CreatePlatformFile(path, base::PLATFORM_FILE_OPEN, NULL, | 567 handle->Set(base::CreatePlatformFile(path, base::PLATFORM_FILE_OPEN, NULL, |
567 NULL)); | 568 NULL)); |
(...skipping 21 matching lines...) Expand all Loading... |
589 PLOG(WARNING) << "Failed getting information for " | 590 PLOG(WARNING) << "Failed getting information for " |
590 << path_to_match_.value() | 591 << path_to_match_.value() |
591 << "; falling back to path string comparisons."; | 592 << "; falling back to path string comparisons."; |
592 file_handle_.Close(); | 593 file_handle_.Close(); |
593 } | 594 } |
594 } | 595 } |
595 | 596 |
596 InstallUtil::ProgramCompare::~ProgramCompare() { | 597 InstallUtil::ProgramCompare::~ProgramCompare() { |
597 } | 598 } |
598 | 599 |
599 bool InstallUtil::ProgramCompare::Evaluate(const string16& value) const { | 600 bool InstallUtil::ProgramCompare::Evaluate(const base::string16& value) const { |
600 // Suss out the exe portion of the value, which is expected to be a command | 601 // Suss out the exe portion of the value, which is expected to be a command |
601 // line kinda (or exactly) like: | 602 // line kinda (or exactly) like: |
602 // "c:\foo\bar\chrome.exe" -- "%1" | 603 // "c:\foo\bar\chrome.exe" -- "%1" |
603 base::FilePath program(CommandLine::FromString(value).GetProgram()); | 604 base::FilePath program(CommandLine::FromString(value).GetProgram()); |
604 if (program.empty()) { | 605 if (program.empty()) { |
605 LOG(WARNING) << "Failed to parse an executable name from command line: \"" | 606 LOG(WARNING) << "Failed to parse an executable name from command line: \"" |
606 << value << "\""; | 607 << value << "\""; |
607 return false; | 608 return false; |
608 } | 609 } |
609 | 610 |
(...skipping 15 matching lines...) Expand all Loading... |
625 // Open the program and see if it references the expected file. | 626 // Open the program and see if it references the expected file. |
626 base::win::ScopedHandle handle; | 627 base::win::ScopedHandle handle; |
627 BY_HANDLE_FILE_INFORMATION info = {}; | 628 BY_HANDLE_FILE_INFORMATION info = {}; |
628 | 629 |
629 return (OpenForInfo(path, &handle) && | 630 return (OpenForInfo(path, &handle) && |
630 GetInfo(handle, &info) && | 631 GetInfo(handle, &info) && |
631 info.dwVolumeSerialNumber == file_info_.dwVolumeSerialNumber && | 632 info.dwVolumeSerialNumber == file_info_.dwVolumeSerialNumber && |
632 info.nFileIndexHigh == file_info_.nFileIndexHigh && | 633 info.nFileIndexHigh == file_info_.nFileIndexHigh && |
633 info.nFileIndexLow == file_info_.nFileIndexLow); | 634 info.nFileIndexLow == file_info_.nFileIndexLow); |
634 } | 635 } |
OLD | NEW |