diff options
Diffstat (limited to 'chrome/installer/util/installation_state.cc')
-rw-r--r-- | chrome/installer/util/installation_state.cc | 140 |
1 files changed, 86 insertions, 54 deletions
diff --git a/chrome/installer/util/installation_state.cc b/chrome/installer/util/installation_state.cc index c0ab82d..f766195 100644 --- a/chrome/installer/util/installation_state.cc +++ b/chrome/installer/util/installation_state.cc @@ -9,33 +9,82 @@ #include "base/version.h" #include "base/win/registry.h" #include "chrome/installer/util/google_update_constants.h" -#include "chrome/installer/util/package_properties.h" +#include "chrome/installer/util/install_util.h" namespace installer { -ProductState::ProductState() { +ProductState::ProductState() + : uninstall_command_(CommandLine::NO_PROGRAM), + msi_(false), + multi_install_(false) { } -void ProductState::Initialize(bool system_install, - const std::wstring& version_key, - const std::wstring& state_key) { +bool ProductState::Initialize(bool system_install, + BrowserDistribution::Type type) { + return Initialize(system_install, + BrowserDistribution::GetSpecificDistribution(type)); +} + +bool ProductState::Initialize(bool system_install, + BrowserDistribution* distribution) { + const std::wstring version_key(distribution->GetVersionKey()); + const std::wstring state_key(distribution->GetStateKey()); const HKEY root_key = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; base::win::RegKey key(root_key, version_key.c_str(), KEY_QUERY_VALUE); std::wstring version_str; - if (key.ReadValue(google_update::kRegVersionField, &version_str) - == ERROR_SUCCESS) { + if (key.ReadValue(google_update::kRegVersionField, + &version_str) == ERROR_SUCCESS) { version_.reset(Version::GetVersionFromString(WideToASCII(version_str))); if (version_.get() != NULL) { - // The product is installed. Check for the channel value (absent if not - // installed/managed by Google Update). - if ((key.Open(root_key, state_key.c_str(), KEY_QUERY_VALUE) != - ERROR_SUCCESS) || !channel_.Initialize(key)) { - channel_.set_value(std::wstring()); + // The product is installed. + if (key.ReadValue(google_update::kRegOldVersionField, + &version_str) == ERROR_SUCCESS) { + old_version_.reset( + Version::GetVersionFromString(WideToASCII(version_str))); + } else { + old_version_.reset(); + } + if (key.ReadValue(google_update::kRegRenameCmdField, + &rename_cmd_) != ERROR_SUCCESS) + rename_cmd_.clear(); + // Read from the ClientState key. + channel_.set_value(std::wstring()); + uninstall_command_ = CommandLine(CommandLine::NO_PROGRAM); + msi_ = false; + multi_install_ = false; + if (key.Open(root_key, state_key.c_str(), + KEY_QUERY_VALUE) == ERROR_SUCCESS) { + std::wstring setup_path; + std::wstring uninstall_arguments; + // "ap" will be absent if not managed by Google Update. + channel_.Initialize(key); + // "UninstallString" will be absent for the multi-installer package. + key.ReadValue(kUninstallStringField, &setup_path); + // "UninstallArguments" will be absent for the multi-installer package. + key.ReadValue(kUninstallArgumentsField, &uninstall_arguments); + InstallUtil::MakeUninstallCommand(setup_path, uninstall_arguments, + &uninstall_command_); + // "msi" may be absent, 0 or 1 + DWORD dw_value = 0; + msi_ = (key.ReadValueDW(google_update::kRegMSIField, + &dw_value) == ERROR_SUCCESS) && (dw_value != 0); + // Multi-install is implied or is derived from the command-line. + if (distribution->GetType() == BrowserDistribution::CHROME_BINARIES) { + multi_install_ = true; + } else { + multi_install_ = uninstall_command_.HasSwitch( + switches::kMultiInstall); + } } } } else { version_.reset(); } + return version_.get() != NULL; +} + +FilePath ProductState::GetSetupPath() const { + return uninstall_command_.GetProgram(); } const Version& ProductState::version() const { @@ -43,12 +92,17 @@ const Version& ProductState::version() const { return *version_; } -void ProductState::CopyFrom(const ProductState& other) { +ProductState& ProductState::CopyFrom(const ProductState& other) { channel_.set_value(other.channel_.value()); - if (other.version_.get() == NULL) - version_.reset(); - else - version_.reset(other.version_->Clone()); + version_.reset(other.version_.get() == NULL ? NULL : other.version_->Clone()); + old_version_.reset( + other.old_version_.get() == NULL ? NULL : other.old_version_->Clone()); + rename_cmd_ = other.rename_cmd_; + uninstall_command_ = other.uninstall_command_; + msi_ = other.msi_; + multi_install_ = other.multi_install_; + + return *this; } InstallationState::InstallationState() { @@ -60,53 +114,31 @@ int InstallationState::IndexFromDistType(BrowserDistribution::Type type) { unexpected_chrome_browser_distribution_value_); COMPILE_ASSERT(BrowserDistribution::CHROME_FRAME == CHROME_FRAME_INDEX, unexpected_chrome_frame_distribution_value_); + COMPILE_ASSERT(BrowserDistribution::CHROME_BINARIES == CHROME_BINARIES_INDEX, + unexpected_chrome_frame_distribution_value_); DCHECK(type == BrowserDistribution::CHROME_BROWSER || - type == BrowserDistribution::CHROME_FRAME); + type == BrowserDistribution::CHROME_FRAME || + type == BrowserDistribution::CHROME_BINARIES); return type; } -void InstallationState::Initialize(const MasterPreferences& prefs) { +void InstallationState::Initialize() { BrowserDistribution* distribution; distribution = BrowserDistribution::GetSpecificDistribution( - BrowserDistribution::CHROME_BROWSER, prefs); - InitializeProduct(false, distribution, &user_products_[CHROME_BROWSER_INDEX]); - InitializeProduct(true, distribution, - &system_products_[CHROME_BROWSER_INDEX]); + BrowserDistribution::CHROME_BROWSER); + user_products_[CHROME_BROWSER_INDEX].Initialize(false, distribution); + system_products_[CHROME_BROWSER_INDEX].Initialize(true, distribution); distribution = BrowserDistribution::GetSpecificDistribution( - BrowserDistribution::CHROME_FRAME, prefs); - InitializeProduct(false, distribution, &user_products_[CHROME_FRAME_INDEX]); - InitializeProduct(true, distribution, &system_products_[CHROME_FRAME_INDEX]); - - ActivePackageProperties package_properties; - InitializeMultiPackage(false, package_properties, - &user_products_[MULTI_PACKAGE_INDEX]); - InitializeMultiPackage(true, package_properties, - &system_products_[MULTI_PACKAGE_INDEX]); -} + BrowserDistribution::CHROME_FRAME); + user_products_[CHROME_FRAME_INDEX].Initialize(false, distribution); + system_products_[CHROME_FRAME_INDEX].Initialize(true, distribution); -// static -void InstallationState::InitializeProduct(bool system_install, - BrowserDistribution* distribution, - ProductState* product) { - product->Initialize(system_install, distribution->GetVersionKey(), - distribution->GetStateKey()); -} - -// static -void InstallationState::InitializeMultiPackage(bool system_install, - PackageProperties& properties, - ProductState* product) { - product->Initialize(system_install, properties.GetVersionKey(), - properties.GetStateKey()); -} - -const ProductState* InstallationState::GetMultiPackageState( - bool system_install) const { - const ProductState& product_state = - (system_install ? system_products_ : user_products_)[MULTI_PACKAGE_INDEX]; - return product_state.version_.get() == NULL ? NULL : &product_state; + distribution = BrowserDistribution::GetSpecificDistribution( + BrowserDistribution::CHROME_BINARIES); + user_products_[CHROME_BINARIES_INDEX].Initialize(false, distribution); + system_products_[CHROME_BINARIES_INDEX].Initialize(true, distribution); } const ProductState* InstallationState::GetProductState( |