| Index: chrome/installer/util/product.cc
|
| ===================================================================
|
| --- chrome/installer/util/product.cc (revision 71802)
|
| +++ chrome/installer/util/product.cc (working copy)
|
| @@ -10,74 +10,70 @@
|
| #include "base/logging.h"
|
| #include "base/process_util.h"
|
| #include "base/win/registry.h"
|
| +#include "chrome/installer/util/chrome_browser_operations.h"
|
| +#include "chrome/installer/util/chrome_browser_sxs_operations.h"
|
| +#include "chrome/installer/util/chrome_frame_operations.h"
|
| #include "chrome/installer/util/google_update_constants.h"
|
| #include "chrome/installer/util/helper.h"
|
| #include "chrome/installer/util/install_util.h"
|
| #include "chrome/installer/util/master_preferences.h"
|
| #include "chrome/installer/util/master_preferences_constants.h"
|
| -#include "chrome/installer/util/package_properties.h"
|
| +#include "chrome/installer/util/product_operations.h"
|
|
|
| using base::win::RegKey;
|
| using installer::MasterPreferences;
|
|
|
| -namespace {
|
| -class ProductIsOfType {
|
| - public:
|
| - explicit ProductIsOfType(BrowserDistribution::Type type)
|
| - : type_(type) { }
|
| - bool operator()(
|
| - const scoped_refptr<const installer::Product>& pi) const {
|
| - return pi->distribution()->GetType() == type_;
|
| - }
|
| - private:
|
| - BrowserDistribution::Type type_;
|
| -}; // class ProductIsOfType
|
| -} // end namespace
|
| -
|
| namespace installer {
|
|
|
| -const Product* FindProduct(const Products& products,
|
| - BrowserDistribution::Type type) {
|
| - Products::const_iterator i =
|
| - std::find_if(products.begin(), products.end(), ProductIsOfType(type));
|
| - return i == products.end() ? NULL : *i;
|
| +Product::Product(BrowserDistribution* distribution)
|
| + : distribution_(distribution) {
|
| + switch (distribution->GetType()) {
|
| + case BrowserDistribution::CHROME_BROWSER:
|
| + operations_.reset(InstallUtil::IsChromeSxSProcess() ?
|
| + new ChromeBrowserSxSOperations() :
|
| + new ChromeBrowserOperations());
|
| + break;
|
| + case BrowserDistribution::CHROME_FRAME:
|
| + operations_.reset(new ChromeFrameOperations());
|
| + break;
|
| + default:
|
| + NOTREACHED() << "Unsupported BrowserDistribution::Type: "
|
| + << distribution->GetType();
|
| + }
|
| }
|
|
|
| -////////////////////////////////////////////////////////////////////////////////
|
| +Product::~Product() {
|
| +}
|
|
|
| -Product::Product(BrowserDistribution* distribution, Package* package)
|
| - : distribution_(distribution),
|
| - package_(package),
|
| - msi_(false),
|
| - cache_state_(0) {
|
| - package_->AssociateProduct(this);
|
| +void Product::InitializeFromPreferences(const MasterPreferences& prefs) {
|
| + operations_->ReadOptions(prefs, &options_);
|
| }
|
|
|
| -const Package& Product::package() const {
|
| - return *package_.get();
|
| +void Product::InitializeFromUninstallCommand(
|
| + const CommandLine& uninstall_command) {
|
| + operations_->ReadOptions(uninstall_command, &options_);
|
| }
|
|
|
| FilePath Product::GetUserDataPath() const {
|
| return GetChromeUserDataPath(distribution_);
|
| }
|
|
|
| -bool Product::LaunchChrome() const {
|
| - const FilePath& install_package = package_->path();
|
| - bool success = !install_package.empty();
|
| +bool Product::LaunchChrome(const FilePath& application_path) const {
|
| + bool success = !application_path.empty();
|
| if (success) {
|
| - CommandLine cmd(install_package.Append(installer::kChromeExe));
|
| + CommandLine cmd(application_path.Append(installer::kChromeExe));
|
| success = base::LaunchApp(cmd, false, false, NULL);
|
| }
|
| return success;
|
| }
|
|
|
| -bool Product::LaunchChromeAndWait(const CommandLine& options,
|
| +bool Product::LaunchChromeAndWait(const FilePath& application_path,
|
| + const CommandLine& options,
|
| int32* exit_code) const {
|
| - const FilePath& install_package = package_->path();
|
| - if (install_package.empty())
|
| + if (application_path.empty())
|
| return false;
|
|
|
| - CommandLine cmd(install_package.Append(installer::kChromeExe));
|
| + CommandLine cmd(application_path.Append(installer::kChromeExe));
|
| cmd.AppendArguments(options, false);
|
|
|
| bool success = false;
|
| @@ -113,36 +109,8 @@
|
| return success;
|
| }
|
|
|
| -bool Product::IsMsi() const {
|
| - if ((cache_state_ & MSI_STATE) == 0) {
|
| - msi_ = false; // Covers failure cases below.
|
| -
|
| - const MasterPreferences& prefs = MasterPreferences::ForCurrentProcess();
|
| -
|
| - bool is_msi = false;
|
| - prefs.GetBool(installer::master_preferences::kMsi, &is_msi);
|
| -
|
| - if (!is_msi) {
|
| - // We didn't find it in the preferences, try looking in the registry.
|
| - HKEY reg_root = system_level() ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
|
| - RegKey key;
|
| - if (key.Open(reg_root, distribution_->GetStateKey().c_str(),
|
| - KEY_READ) == ERROR_SUCCESS) {
|
| - DWORD msi_value = 0;
|
| - key.ReadValueDW(google_update::kRegMSIField, &msi_value);
|
| - msi_ = msi_value != 0;
|
| - }
|
| - } else {
|
| - msi_ = true;
|
| - }
|
| - cache_state_ |= MSI_STATE;
|
| - }
|
| -
|
| - return msi_;
|
| -}
|
| -
|
| -bool Product::SetMsiMarker(bool set) const {
|
| - HKEY reg_root = system_level() ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
|
| +bool Product::SetMsiMarker(bool system_install, bool set) const {
|
| + HKEY reg_root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
|
| RegKey client_state_key;
|
| LONG result = client_state_key.Open(reg_root,
|
| distribution_->GetStateKey().c_str(), KEY_READ | KEY_WRITE);
|
| @@ -158,92 +126,23 @@
|
| }
|
|
|
| bool Product::ShouldCreateUninstallEntry() const {
|
| - if (IsMsi()) {
|
| - // MSI installations will manage their own uninstall shortcuts.
|
| - return false;
|
| - }
|
| -
|
| - return distribution_->ShouldCreateUninstallEntry();
|
| + return operations_->ShouldCreateUninstallEntry(options_);
|
| }
|
|
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -ProductPackageMapping::ProductPackageMapping(bool multi_install,
|
| - bool system_level)
|
| - : package_properties_(new ActivePackageProperties()),
|
| - multi_install_(multi_install),
|
| - system_level_(system_level) {
|
| +void Product::AddKeyFiles(std::vector<FilePath>* key_files) const {
|
| + operations_->AddKeyFiles(options_, key_files);
|
| }
|
|
|
| -const Packages& ProductPackageMapping::packages() const {
|
| - return packages_;
|
| +void Product::AddComDllList(std::vector<FilePath>* com_dll_list) const {
|
| + operations_->AddComDllList(options_, com_dll_list);
|
| }
|
|
|
| -const Products& ProductPackageMapping::products() const {
|
| - return products_;
|
| +void Product::AppendProductFlags(CommandLine* command_line) const {
|
| + operations_->AppendProductFlags(options_, command_line);
|
| }
|
|
|
| -bool ProductPackageMapping::AddDistribution(BrowserDistribution* distribution) {
|
| - DCHECK(distribution);
|
| - // Each product type can be added exactly once.
|
| - DCHECK(FindProduct(products_, distribution->GetType()) == NULL);
|
| -
|
| - FilePath install_package;
|
| - if (distribution->GetType() == BrowserDistribution::CHROME_BROWSER) {
|
| - install_package = GetChromeInstallPath(system_level_, distribution);
|
| - } else {
|
| - DCHECK_EQ(BrowserDistribution::CHROME_FRAME, distribution->GetType());
|
| - install_package = GetChromeFrameInstallPath(multi_install_, system_level_,
|
| - distribution);
|
| - }
|
| -
|
| - if (install_package.empty()) {
|
| - LOG(ERROR) << "Got an empty installation path for "
|
| - << distribution->GetApplicationName()
|
| - << ". It's likely that there's a conflicting "
|
| - "installation present";
|
| - return false;
|
| - }
|
| -
|
| - scoped_refptr<Package> target_package;
|
| - for (size_t i = 0; i < packages_.size(); ++i) {
|
| - if (packages_[i]->IsEqual(install_package)) {
|
| - // Use an existing Package.
|
| - target_package = packages_[i];
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (!target_package.get()) {
|
| - DCHECK(packages_.empty()) << "Multiple packages per run unsupported.";
|
| - // create new one and add.
|
| - target_package = new Package(multi_install_, system_level_, install_package,
|
| - package_properties_.get());
|
| - packages_.push_back(target_package);
|
| - }
|
| -
|
| - scoped_refptr<Product> product(new Product(distribution, target_package));
|
| -#ifndef NDEBUG
|
| - for (size_t i = 0; i < products_.size(); ++i) {
|
| - DCHECK_EQ(product->IsMsi(), products_[i]->IsMsi());
|
| - }
|
| -#endif
|
| - products_.push_back(product);
|
| -
|
| - return true;
|
| +bool Product::SetChannelFlags(bool set, ChannelInfo* channel_info) const {
|
| + return operations_->SetChannelFlags(options_, set, channel_info);
|
| }
|
|
|
| -bool ProductPackageMapping::AddDistribution(
|
| - BrowserDistribution::Type type,
|
| - const MasterPreferences& prefs) {
|
| - BrowserDistribution* distribution =
|
| - BrowserDistribution::GetSpecificDistribution(type, prefs);
|
| - if (!distribution) {
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -
|
| - return AddDistribution(distribution);
|
| -}
|
| -
|
| } // namespace installer
|
| -
|
|
|