| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "chrome/installer/setup/install.h" | 5 #include "chrome/installer/setup/install.h" |
| 6 | 6 |
| 7 #include <shlobj.h> | 7 #include <shlobj.h> |
| 8 #include <time.h> | 8 #include <time.h> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 install_list->AddCopyTreeWorkItem(exe_path, exe_dst, temp_path, | 75 install_list->AddCopyTreeWorkItem(exe_path, exe_dst, temp_path, |
| 76 WorkItem::ALWAYS); | 76 WorkItem::ALWAYS); |
| 77 if (system_level) { | 77 if (system_level) { |
| 78 install_list->AddCopyTreeWorkItem(archive_path, archive_dst, temp_path, | 78 install_list->AddCopyTreeWorkItem(archive_path, archive_dst, temp_path, |
| 79 WorkItem::ALWAYS); | 79 WorkItem::ALWAYS); |
| 80 } else { | 80 } else { |
| 81 install_list->AddMoveTreeWorkItem(archive_path, archive_dst, temp_path); | 81 install_list->AddMoveTreeWorkItem(archive_path, archive_dst, temp_path); |
| 82 } | 82 } |
| 83 } | 83 } |
| 84 | 84 |
| 85 // A little helper function to save on tons of WideToASCII call sites. | |
| 86 void AppendWideSwitch(CommandLine* cmd, const wchar_t* switch_name) { | |
| 87 cmd->AppendSwitch(WideToASCII(switch_name)); | |
| 88 } | |
| 89 | |
| 90 void AppendUninstallCommandLineFlags(CommandLine* uninstall_cmd, | 85 void AppendUninstallCommandLineFlags(CommandLine* uninstall_cmd, |
| 91 bool is_system) { | 86 bool is_system) { |
| 92 DCHECK(uninstall_cmd); | 87 DCHECK(uninstall_cmd); |
| 93 AppendWideSwitch(uninstall_cmd, installer_util::switches::kUninstall); | 88 uninstall_cmd->AppendSwitch(installer_util::switches::kUninstall); |
| 94 | 89 |
| 95 // TODO(tommi): In case of multiple installations, we need to create multiple | 90 // TODO(tommi): In case of multiple installations, we need to create multiple |
| 96 // uninstall entries, and not one magic one for all. | 91 // uninstall entries, and not one magic one for all. |
| 97 const installer_util::MasterPreferences& prefs = | 92 const installer_util::MasterPreferences& prefs = |
| 98 InstallUtil::GetMasterPreferencesForCurrentProcess(); | 93 InstallUtil::GetMasterPreferencesForCurrentProcess(); |
| 99 DCHECK(!prefs.is_multi_install()); | 94 DCHECK(!prefs.is_multi_install()); |
| 100 | 95 |
| 101 if (prefs.install_chrome_frame()) { | 96 if (prefs.install_chrome_frame()) { |
| 102 AppendWideSwitch(uninstall_cmd, installer_util::switches::kDeleteProfile); | 97 uninstall_cmd->AppendSwitch(installer_util::switches::kDeleteProfile); |
| 103 AppendWideSwitch(uninstall_cmd, installer_util::switches::kChromeFrame); | 98 uninstall_cmd->AppendSwitch(installer_util::switches::kChromeFrame); |
| 104 } | 99 } |
| 105 | 100 |
| 106 if (InstallUtil::IsChromeSxSProcess()) { | 101 if (InstallUtil::IsChromeSxSProcess()) { |
| 107 AppendWideSwitch(uninstall_cmd, installer_util::switches::kChromeSxS); | 102 uninstall_cmd->AppendSwitch(installer_util::switches::kChromeSxS); |
| 108 } | 103 } |
| 109 | 104 |
| 110 if (InstallUtil::IsMSIProcess(is_system)) { | 105 if (InstallUtil::IsMSIProcess(is_system)) { |
| 111 AppendWideSwitch(uninstall_cmd, installer_util::switches::kMsi); | 106 uninstall_cmd->AppendSwitch(installer_util::switches::kMsi); |
| 112 } | 107 } |
| 113 | 108 |
| 114 // Propagate the verbose logging switch to uninstalls too. | 109 // Propagate the verbose logging switch to uninstalls too. |
| 115 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | 110 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
| 116 if (command_line.HasSwitch(installer_util::switches::kVerboseLogging)) { | 111 if (command_line.HasSwitch(installer_util::switches::kVerboseLogging)) { |
| 117 AppendWideSwitch(uninstall_cmd, installer_util::switches::kVerboseLogging); | 112 uninstall_cmd->AppendSwitch(installer_util::switches::kVerboseLogging); |
| 118 } | 113 } |
| 119 | 114 |
| 120 if (is_system) { | 115 if (is_system) { |
| 121 AppendWideSwitch(uninstall_cmd, installer_util::switches::kSystemLevel); | 116 uninstall_cmd->AppendSwitch(installer_util::switches::kSystemLevel); |
| 122 } | 117 } |
| 123 } | 118 } |
| 124 | 119 |
| 125 // This method adds work items to create (or update) Chrome uninstall entry in | 120 // This method adds work items to create (or update) Chrome uninstall entry in |
| 126 // either the Control Panel->Add/Remove Programs list or in the Omaha client | 121 // either the Control Panel->Add/Remove Programs list or in the Omaha client |
| 127 // state key if running under an MSI installer. | 122 // state key if running under an MSI installer. |
| 128 void AddUninstallShortcutWorkItems(HKEY reg_root, | 123 void AddUninstallShortcutWorkItems(HKEY reg_root, |
| 129 const std::wstring& exe_path, | 124 const std::wstring& exe_path, |
| 130 const std::wstring& install_path, | 125 const std::wstring& install_path, |
| 131 const std::wstring& product_name, | 126 const std::wstring& product_name, |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 if (current_version.empty()) { | 408 if (current_version.empty()) { |
| 414 LOG(ERROR) << "New chrome.exe exists but current version is empty!"; | 409 LOG(ERROR) << "New chrome.exe exists but current version is empty!"; |
| 415 return false; | 410 return false; |
| 416 } | 411 } |
| 417 scoped_ptr<WorkItemList> inuse_list(WorkItem::CreateWorkItemList()); | 412 scoped_ptr<WorkItemList> inuse_list(WorkItem::CreateWorkItemList()); |
| 418 inuse_list->AddSetRegValueWorkItem(reg_root, | 413 inuse_list->AddSetRegValueWorkItem(reg_root, |
| 419 version_key, | 414 version_key, |
| 420 google_update::kRegOldVersionField, | 415 google_update::kRegOldVersionField, |
| 421 current_version.c_str(), | 416 current_version.c_str(), |
| 422 true); | 417 true); |
| 418 FilePath installer_path(installer::GetInstallerPathUnderChrome(install_path, |
| 419 new_version.GetString())); |
| 420 installer_path = installer_path.Append( |
| 421 file_util::GetFilenameFromPath(exe_path)); |
| 423 | 422 |
| 424 std::wstring rename_cmd(installer::GetInstallerPathUnderChrome( | 423 CommandLine rename_cmd(installer_path); |
| 425 install_path, new_version.GetString())); | 424 rename_cmd.AppendSwitch(installer_util::switches::kRenameChromeExe); |
| 426 file_util::AppendToPath(&rename_cmd, | |
| 427 file_util::GetFilenameFromPath(exe_path)); | |
| 428 rename_cmd = L"\"" + rename_cmd + | |
| 429 L"\" --" + installer_util::switches::kRenameChromeExe; | |
| 430 if (is_system_install) | 425 if (is_system_install) |
| 431 rename_cmd = rename_cmd + L" --" + installer_util::switches::kSystemLevel; | 426 rename_cmd.AppendSwitch(installer_util::switches::kSystemLevel); |
| 432 | 427 |
| 433 if (prefs.install_chrome_frame()) { | 428 if (prefs.install_chrome_frame()) |
| 434 rename_cmd += L" --"; | 429 rename_cmd.AppendSwitch(installer_util::switches::kChromeFrame); |
| 435 rename_cmd += installer_util::switches::kChromeFrame; | |
| 436 } | |
| 437 | 430 |
| 438 if (InstallUtil::IsChromeSxSProcess()) { | 431 if (InstallUtil::IsChromeSxSProcess()) |
| 439 rename_cmd += L" --"; | 432 rename_cmd.AppendSwitch(installer_util::switches::kChromeSxS); |
| 440 rename_cmd += installer_util::switches::kChromeSxS; | |
| 441 } | |
| 442 | 433 |
| 443 inuse_list->AddSetRegValueWorkItem(reg_root, | 434 inuse_list->AddSetRegValueWorkItem(reg_root, |
| 444 version_key, | 435 version_key, |
| 445 google_update::kRegRenameCmdField, | 436 google_update::kRegRenameCmdField, |
| 446 rename_cmd.c_str(), | 437 rename_cmd.command_line_string(), |
| 447 true); | 438 true); |
| 448 if (!inuse_list->Do()) { | 439 if (!inuse_list->Do()) { |
| 449 LOG(ERROR) << "Couldn't write opv/cmd values to registry."; | 440 LOG(ERROR) << "Couldn't write opv/cmd values to registry."; |
| 450 inuse_list->Rollback(); | 441 inuse_list->Rollback(); |
| 451 return false; | 442 return false; |
| 452 } | 443 } |
| 453 } else { | 444 } else { |
| 454 // Since this was not in-use-update, delete 'opv' and 'cmd' keys. | 445 // Since this was not in-use-update, delete 'opv' and 'cmd' keys. |
| 455 scoped_ptr<WorkItemList> inuse_list(WorkItem::CreateWorkItemList()); | 446 scoped_ptr<WorkItemList> inuse_list(WorkItem::CreateWorkItemList()); |
| 456 inuse_list->AddDeleteRegValueWorkItem(reg_root, version_key, | 447 inuse_list->AddDeleteRegValueWorkItem(reg_root, version_key, |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 811 } | 802 } |
| 812 | 803 |
| 813 std::wstring latest_version_to_keep(new_version.GetString()); | 804 std::wstring latest_version_to_keep(new_version.GetString()); |
| 814 if (!current_version.empty()) | 805 if (!current_version.empty()) |
| 815 latest_version_to_keep.assign(current_version); | 806 latest_version_to_keep.assign(current_version); |
| 816 RemoveOldVersionDirs(install_path, latest_version_to_keep); | 807 RemoveOldVersionDirs(install_path, latest_version_to_keep); |
| 817 } | 808 } |
| 818 | 809 |
| 819 return result; | 810 return result; |
| 820 } | 811 } |
| OLD | NEW |