OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/util/installer_state.h" | 5 #include "chrome/installer/util/installer_state.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/file_util.h" | 12 #include "base/file_util.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
15 #include "base/string_util.h" | 15 #include "base/string_util.h" |
16 #include "base/utf_string_conversions.h" | 16 #include "base/utf_string_conversions.h" |
17 #include "base/win/registry.h" | 17 #include "base/win/registry.h" |
| 18 #include "base/win/scoped_handle.h" |
18 #include "chrome/installer/util/delete_tree_work_item.h" | 19 #include "chrome/installer/util/delete_tree_work_item.h" |
19 #include "chrome/installer/util/helper.h" | 20 #include "chrome/installer/util/helper.h" |
20 #include "chrome/installer/util/install_util.h" | 21 #include "chrome/installer/util/install_util.h" |
21 #include "chrome/installer/util/installation_state.h" | 22 #include "chrome/installer/util/installation_state.h" |
22 #include "chrome/installer/util/master_preferences.h" | 23 #include "chrome/installer/util/master_preferences.h" |
23 #include "chrome/installer/util/master_preferences_constants.h" | 24 #include "chrome/installer/util/master_preferences_constants.h" |
24 #include "chrome/installer/util/product.h" | 25 #include "chrome/installer/util/product.h" |
25 #include "chrome/installer/util/work_item.h" | 26 #include "chrome/installer/util/work_item.h" |
26 #include "chrome/installer/util/work_item_list.h" | 27 #include "chrome/installer/util/work_item_list.h" |
27 | 28 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 } | 69 } |
69 | 70 |
70 InstallerState::InstallerState() | 71 InstallerState::InstallerState() |
71 : operation_(UNINITIALIZED), | 72 : operation_(UNINITIALIZED), |
72 multi_package_distribution_(NULL), | 73 multi_package_distribution_(NULL), |
73 level_(UNKNOWN_LEVEL), | 74 level_(UNKNOWN_LEVEL), |
74 package_type_(UNKNOWN_PACKAGE_TYPE), | 75 package_type_(UNKNOWN_PACKAGE_TYPE), |
75 state_type_(BrowserDistribution::CHROME_BROWSER), | 76 state_type_(BrowserDistribution::CHROME_BROWSER), |
76 root_key_(NULL), | 77 root_key_(NULL), |
77 msi_(false), | 78 msi_(false), |
78 verbose_logging_(false) { | 79 verbose_logging_(false), |
| 80 is_chrome_frame_running_(false) { |
79 } | 81 } |
80 | 82 |
81 InstallerState::InstallerState(Level level) | 83 InstallerState::InstallerState(Level level) |
82 : operation_(UNINITIALIZED), | 84 : operation_(UNINITIALIZED), |
83 multi_package_distribution_(NULL), | 85 multi_package_distribution_(NULL), |
84 level_(UNKNOWN_LEVEL), | 86 level_(UNKNOWN_LEVEL), |
85 package_type_(UNKNOWN_PACKAGE_TYPE), | 87 package_type_(UNKNOWN_PACKAGE_TYPE), |
86 state_type_(BrowserDistribution::CHROME_BROWSER), | 88 state_type_(BrowserDistribution::CHROME_BROWSER), |
87 root_key_(NULL), | 89 root_key_(NULL), |
88 msi_(false), | 90 msi_(false), |
89 verbose_logging_(false) { | 91 verbose_logging_(false), |
| 92 is_chrome_frame_running_(false) { |
90 // Use set_level() so that root_key_ is updated properly. | 93 // Use set_level() so that root_key_ is updated properly. |
91 set_level(level); | 94 set_level(level); |
92 } | 95 } |
93 | 96 |
94 void InstallerState::Initialize(const CommandLine& command_line, | 97 void InstallerState::Initialize(const CommandLine& command_line, |
95 const MasterPreferences& prefs, | 98 const MasterPreferences& prefs, |
96 const InstallationState& machine_state) { | 99 const InstallationState& machine_state) { |
97 bool pref_bool; | 100 bool pref_bool; |
98 if (!prefs.GetBool(master_preferences::kSystemLevel, &pref_bool)) | 101 if (!prefs.GetBool(master_preferences::kSystemLevel, &pref_bool)) |
99 pref_bool = false; | 102 pref_bool = false; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 | 151 |
149 if (operand == NULL) { | 152 if (operand == NULL) { |
150 operand = BrowserDistribution::GetSpecificDistribution( | 153 operand = BrowserDistribution::GetSpecificDistribution( |
151 prefs.install_chrome() ? | 154 prefs.install_chrome() ? |
152 BrowserDistribution::CHROME_BROWSER : | 155 BrowserDistribution::CHROME_BROWSER : |
153 BrowserDistribution::CHROME_FRAME); | 156 BrowserDistribution::CHROME_FRAME); |
154 } | 157 } |
155 | 158 |
156 state_key_ = operand->GetStateKey(); | 159 state_key_ = operand->GetStateKey(); |
157 state_type_ = operand->GetType(); | 160 state_type_ = operand->GetType(); |
| 161 |
| 162 is_chrome_frame_running_ = DetectChromeFrameInUse(machine_state); |
158 } | 163 } |
159 | 164 |
160 void InstallerState::set_level(Level level) { | 165 void InstallerState::set_level(Level level) { |
161 level_ = level; | 166 level_ = level; |
162 switch (level) { | 167 switch (level) { |
163 case USER_LEVEL: | 168 case USER_LEVEL: |
164 root_key_ = HKEY_CURRENT_USER; | 169 root_key_ = HKEY_CURRENT_USER; |
165 break; | 170 break; |
166 case SYSTEM_LEVEL: | 171 case SYSTEM_LEVEL: |
167 root_key_ = HKEY_LOCAL_MACHINE; | 172 root_key_ = HKEY_LOCAL_MACHINE; |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 } | 415 } |
411 | 416 |
412 return current_version.release(); | 417 return current_version.release(); |
413 } | 418 } |
414 | 419 |
415 FilePath InstallerState::GetInstallerDirectory(const Version& version) const { | 420 FilePath InstallerState::GetInstallerDirectory(const Version& version) const { |
416 return target_path().Append(ASCIIToWide(version.GetString())) | 421 return target_path().Append(ASCIIToWide(version.GetString())) |
417 .Append(kInstallerDir); | 422 .Append(kInstallerDir); |
418 } | 423 } |
419 | 424 |
| 425 // static |
| 426 bool InstallerState::IsFileInUse(const FilePath& file) { |
| 427 // Call CreateFile with a share mode of 0 which should cause this to fail |
| 428 // with ERROR_SHARING_VIOLATION if the file exists and is in-use. |
| 429 return !base::win::ScopedHandle(CreateFile(file.value().c_str(), |
| 430 GENERIC_WRITE, 0, NULL, |
| 431 OPEN_EXISTING, 0, 0)).IsValid(); |
| 432 } |
| 433 |
| 434 bool InstallerState::DetectChromeFrameInUse( |
| 435 const InstallationState& machine_state) { |
| 436 // We check only for the current version (e.g. the version we are upgrading |
| 437 // _from_). We don't need to check interstitial versions if any (as would |
| 438 // occur in the case of multiple updates) since if they are in use, we are |
| 439 // guaranteed that the current version is in use too. |
| 440 bool in_use = false; |
| 441 scoped_ptr<Version> current_version(GetCurrentVersion(machine_state)); |
| 442 if (current_version != NULL) { |
| 443 FilePath cf_install_path( |
| 444 target_path().AppendASCII(current_version->GetString()) |
| 445 .Append(kChromeFrameDll)); |
| 446 in_use = IsFileInUse(cf_install_path); |
| 447 } |
| 448 return in_use; |
| 449 } |
| 450 |
420 void InstallerState::RemoveOldVersionDirectories( | 451 void InstallerState::RemoveOldVersionDirectories( |
421 const Version& new_version, | 452 const Version& new_version, |
422 Version* existing_version, | 453 Version* existing_version, |
423 const FilePath& temp_path) const { | 454 const FilePath& temp_path) const { |
424 file_util::FileEnumerator version_enum(target_path(), false, | 455 file_util::FileEnumerator version_enum(target_path(), false, |
425 file_util::FileEnumerator::DIRECTORIES); | 456 file_util::FileEnumerator::DIRECTORIES); |
426 scoped_ptr<Version> version; | 457 scoped_ptr<Version> version; |
427 std::vector<FilePath> key_files; | 458 std::vector<FilePath> key_files; |
428 | 459 |
429 // We try to delete all directories whose versions are lower than | 460 // We try to delete all directories whose versions are lower than |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 if (is_multi_install()) { | 610 if (is_multi_install()) { |
580 InstallUtil::AddInstallerResultItems( | 611 InstallUtil::AddInstallerResultItems( |
581 system_install, multi_package_binaries_distribution()->GetStateKey(), | 612 system_install, multi_package_binaries_distribution()->GetStateKey(), |
582 status, string_resource_id, launch_cmd, install_list.get()); | 613 status, string_resource_id, launch_cmd, install_list.get()); |
583 } | 614 } |
584 if (!install_list->Do()) | 615 if (!install_list->Do()) |
585 LOG(ERROR) << "Failed to record installer error information in registry."; | 616 LOG(ERROR) << "Failed to record installer error information in registry."; |
586 } | 617 } |
587 | 618 |
588 } // namespace installer | 619 } // namespace installer |
OLD | NEW |