| Index: chrome/installer/util/installer_state.h
|
| ===================================================================
|
| --- chrome/installer/util/installer_state.h (revision 72487)
|
| +++ chrome/installer/util/installer_state.h (working copy)
|
| @@ -7,47 +7,183 @@
|
| #pragma once
|
|
|
| #include <string>
|
| +#include <vector>
|
|
|
| #include "base/basictypes.h"
|
| +#include "base/file_path.h"
|
| +#include "base/logging.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "base/scoped_vector.h"
|
| #include "chrome/installer/util/browser_distribution.h"
|
| +#include "chrome/installer/util/product.h"
|
|
|
| +#if defined(OS_WIN)
|
| +#include <windows.h> // NOLINT
|
| +#endif
|
| +
|
| +class CommandLine;
|
| +class Version;
|
| +
|
| namespace installer {
|
|
|
| +class ChannelInfo;
|
| class InstallationState;
|
| class MasterPreferences;
|
|
|
| +class ProductState;
|
| +
|
| +typedef std::vector<Product*> Products;
|
| +
|
| // Encapsulates the state of the current installation operation. Only valid
|
| -// for installs and upgrades (not for uninstalls or non-install commands)
|
| +// for installs and upgrades (not for uninstalls or non-install commands).
|
| +// TODO(grt): Rename to InstallerEngine/Conductor or somesuch?
|
| class InstallerState {
|
| public:
|
| + enum Level {
|
| + UNKNOWN_LEVEL,
|
| + USER_LEVEL,
|
| + SYSTEM_LEVEL
|
| + };
|
| +
|
| + enum PackageType {
|
| + UNKNOWN_PACKAGE_TYPE,
|
| + SINGLE_PACKAGE,
|
| + MULTI_PACKAGE
|
| + };
|
| +
|
| enum Operation {
|
| UNINITIALIZED,
|
| SINGLE_INSTALL_OR_UPDATE,
|
| MULTI_INSTALL,
|
| MULTI_UPDATE,
|
| + UNINSTALL
|
| };
|
|
|
| + // Constructs an uninitialized instance; see Initialize().
|
| InstallerState();
|
|
|
| - // Initializes |this| based on the current operation.
|
| - void Initialize(const MasterPreferences& prefs,
|
| + // Constructs an initialized but empty instance.
|
| + explicit InstallerState(Level level);
|
| +
|
| + // Initializes this object based on the current operation.
|
| + void Initialize(const CommandLine& command_line,
|
| + const MasterPreferences& prefs,
|
| const InstallationState& machine_state);
|
|
|
| - // true if system-level, false if user-level.
|
| - bool system_install() const { return system_install_; }
|
| + // Adds a product constructed on the basis of |state|, setting this object's
|
| + // msi flag if |state| is msi-installed. Returns the product that was added,
|
| + // or NULL if |state| is incompatible with this object. Ownership is not
|
| + // passed to the caller.
|
| + Product* AddProductFromState(BrowserDistribution::Type type,
|
| + const ProductState& state);
|
|
|
| + // Returns the product that was added, or NULL if |product| is incompatible
|
| + // with this object. Ownership of |product| is taken by this object, while
|
| + // ownership of the return value is not passed to the caller.
|
| + Product* AddProduct(scoped_ptr<Product>* product);
|
| +
|
| + // Removes |product| from the set of products to be operated on. The object
|
| + // pointed to by |product| is freed. Returns false if |product| is not
|
| + // present in the set.
|
| + bool RemoveProduct(const Product* product);
|
| +
|
| + // The level (user or system) of this operation.
|
| + Level level() const { return level_; }
|
| +
|
| + // The package type (single or multi) of this operation.
|
| + PackageType package_type() const { return package_type_; }
|
| +
|
| + // An identifier of this operation.
|
| Operation operation() const { return operation_; }
|
|
|
| + // A convenience method returning level() == SYSTEM_LEVEL.
|
| + // TODO(grt): Eradicate the bool in favor of the enum.
|
| + bool system_install() const;
|
| +
|
| + // A convenience method returning package_type() == MULTI_PACKAGE.
|
| + // TODO(grt): Eradicate the bool in favor of the enum.
|
| + bool is_multi_install() const;
|
| +
|
| + // The full path to the place where the operand resides.
|
| + const FilePath& target_path() const { return target_path_; }
|
| +
|
| + // True if the "msi" preference is set or if a product with the "msi" state
|
| + // flag is set is to be operated on.
|
| + bool is_msi() const { return msi_; }
|
| +
|
| + // True if the --verbose-logging command-line flag is set or if the
|
| + // verbose_logging master preferences option is true.
|
| + bool verbose_logging() const { return verbose_logging_; }
|
| +
|
| +#if defined(OS_WIN)
|
| + HKEY root_key() const { return root_key_; }
|
| +#endif
|
| +
|
| // The ClientState key by which we interact with Google Update.
|
| const std::wstring& state_key() const { return state_key_; }
|
|
|
| + // Returns the BrowserDistribution instance corresponding to the binaries for
|
| + // this run if we're operating on a multi-package product.
|
| + BrowserDistribution* multi_package_binaries_distribution() const {
|
| + DCHECK(package_type_ == MULTI_PACKAGE);
|
| + DCHECK(multi_package_distribution_ != NULL);
|
| + return multi_package_distribution_;
|
| + }
|
| +
|
| + const Products& products() const { return products_.get(); }
|
| +
|
| + // Returns the product of the desired type, or NULL if none found.
|
| + const Product* FindProduct(BrowserDistribution::Type distribution_type) const;
|
| +
|
| + // Returns the currently installed version in |target_path|, or NULL if no
|
| + // products are installed. Ownership is passed to the caller.
|
| + Version* GetCurrentVersion(const InstallationState& machine_state) const;
|
| +
|
| + // Returns the path to the installer under Chrome version folder
|
| + // (for example <target_path>\Google\Chrome\Application\<Version>\Installer)
|
| + FilePath GetInstallerDirectory(const Version& version) const;
|
| +
|
| + // Try to delete all directories whose versions are lower than
|
| + // |latest_version|.
|
| + void RemoveOldVersionDirectories(const Version& latest_version) const;
|
| +
|
| + // Adds to |com_dll_list| the list of COM DLLs that are to be registered
|
| + // and/or unregistered. The list may be empty.
|
| + void AddComDllList(std::vector<FilePath>* com_dll_list) const;
|
| +
|
| + bool SetChannelFlags(bool set, ChannelInfo* channel_info) const;
|
| +
|
| protected:
|
| + FilePath GetDefaultProductInstallPath(BrowserDistribution* dist) const;
|
| + bool CanAddProduct(const Product& product, const FilePath* product_dir) const;
|
| + Product* AddProductInDirectory(const FilePath* product_dir,
|
| + scoped_ptr<Product>* product);
|
| + Product* AddProductFromPreferences(
|
| + BrowserDistribution::Type distribution_type,
|
| + const MasterPreferences& prefs,
|
| + const InstallationState& machine_state);
|
| bool IsMultiInstallUpdate(const MasterPreferences& prefs,
|
| const InstallationState& machine_state);
|
|
|
| + // Sets this object's level and updates the root_key_ accordingly.
|
| + void set_level(Level level);
|
| +
|
| + // Sets this object's package type and updates the multi_package_distribution_
|
| + // accordingly.
|
| + void set_package_type(PackageType type);
|
| +
|
| Operation operation_;
|
| + FilePath target_path_;
|
| std::wstring state_key_;
|
| - bool system_install_;
|
| + ScopedVector<Product> products_;
|
| + BrowserDistribution* multi_package_distribution_;
|
| + Level level_;
|
| + PackageType package_type_;
|
| +#if defined(OS_WIN)
|
| + HKEY root_key_;
|
| +#endif
|
| + bool msi_;
|
| + bool verbose_logging_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(InstallerState);
|
|
|