| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_INSTALLER_UTIL_PRODUCT_H_ |
| #define CHROME_INSTALLER_UTIL_PRODUCT_H_ |
| |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/installer/util/browser_distribution.h" |
| #include "chrome/installer/util/shell_util.h" |
| #include "chrome/installer/util/util_constants.h" |
| |
| class CommandLine; |
| |
| namespace installer { |
| |
| class ChannelInfo; |
| class MasterPreferences; |
| class Product; |
| class ProductOperations; |
| |
| // Represents an installation of a specific product which has a one-to-one |
| // relation to a BrowserDistribution. A product has registry settings, related |
| // installation/uninstallation actions and exactly one Package that represents |
| // the files on disk. The Package may be shared with other Product instances, |
| // so only the last Product to be uninstalled should remove the package. |
| // Right now there are no classes that derive from Product, but in |
| // the future, as we move away from global functions and towards a data driven |
| // installation, each distribution could derive from this class and provide |
| // distribution specific functionality. |
| class Product { |
| public: |
| explicit Product(BrowserDistribution* distribution); |
| |
| ~Product(); |
| |
| void InitializeFromPreferences(const MasterPreferences& prefs); |
| |
| void InitializeFromUninstallCommand(const CommandLine& uninstall_command); |
| |
| BrowserDistribution* distribution() const { |
| return distribution_; |
| } |
| |
| bool is_type(BrowserDistribution::Type type) const { |
| return distribution_->GetType() == type; |
| } |
| |
| bool is_chrome() const { |
| return distribution_->GetType() == BrowserDistribution::CHROME_BROWSER; |
| } |
| |
| bool is_chrome_frame() const { |
| return distribution_->GetType() == BrowserDistribution::CHROME_FRAME; |
| } |
| |
| bool is_chrome_app_host() const { |
| return distribution_->GetType() == BrowserDistribution::CHROME_APP_HOST; |
| } |
| |
| bool is_chrome_binaries() const { |
| return distribution_->GetType() == BrowserDistribution::CHROME_BINARIES; |
| } |
| |
| bool HasOption(const std::wstring& option) const { |
| return options_.find(option) != options_.end(); |
| } |
| |
| // Returns true if the set of options is mutated by this operation. |
| bool SetOption(const std::wstring& option, bool set) { |
| if (set) |
| return options_.insert(option).second; |
| else |
| return options_.erase(option) != 0; |
| } |
| |
| // Returns the path(s) to the directory that holds the user data (primary |
| // and, if applicable to |dist|, alternate). This is always inside a user's |
| // local application data folder (e.g., "AppData\Local or "Local |
| // Settings\Application Data" in %USERPROFILE%). Note that these are the |
| // defaults and do not take into account that they can be overriden with a |
| // command line parameter. |paths| may be empty on return, but is guaranteed |
| // not to contain empty paths otherwise. If more than one path is returned, |
| // they are guaranteed to be siblings. |
| void GetUserDataPaths(std::vector<base::FilePath>* paths) const; |
| |
| // Launches Chrome without waiting for it to exit. |
| bool LaunchChrome(const base::FilePath& application_path) const; |
| |
| // Launches Chrome with given command line, waits for Chrome indefinitely |
| // (until it terminates), and gets the process exit code if available. |
| // The function returns true as long as Chrome is successfully launched. |
| // The status of Chrome at the return of the function is given by exit_code. |
| // NOTE: The 'options' CommandLine object should only contain parameters. |
| // The program part will be ignored. |
| bool LaunchChromeAndWait(const base::FilePath& application_path, |
| const CommandLine& options, |
| int32* exit_code) const; |
| |
| // Sets the boolean MSI marker for this installation if set is true or clears |
| // it otherwise. The MSI marker is stored in the registry under the |
| // ClientState key. |
| bool SetMsiMarker(bool system_install, bool set) const; |
| |
| // Returns true if setup should create an entry in the Add/Remove list |
| // of installed applications. |
| bool ShouldCreateUninstallEntry() const; |
| |
| // See ProductOperations::AddKeyFiles. |
| void AddKeyFiles(std::vector<base::FilePath>* key_files) const; |
| |
| // See ProductOperations::AddComDllList. |
| void AddComDllList(std::vector<base::FilePath>* com_dll_list) const; |
| |
| // See ProductOperations::AppendProductFlags. |
| void AppendProductFlags(CommandLine* command_line) const; |
| |
| // See ProductOperations::AppendRenameFlags. |
| void AppendRenameFlags(CommandLine* command_line) const; |
| |
| // See Productoperations::SetChannelFlags. |
| bool SetChannelFlags(bool set, ChannelInfo* channel_info) const; |
| |
| // See ProductOperations::AddDefaultShortcutProperties. |
| void AddDefaultShortcutProperties( |
| const base::FilePath& target_exe, |
| ShellUtil::ShortcutProperties* properties) const; |
| |
| void LaunchUserExperiment(const base::FilePath& setup_path, |
| InstallStatus status, |
| bool system_level) const; |
| |
| protected: |
| enum CacheStateFlags { |
| MSI_STATE = 0x01 |
| }; |
| |
| BrowserDistribution* distribution_; |
| scoped_ptr<ProductOperations> operations_; |
| std::set<std::wstring> options_; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(Product); |
| }; |
| |
| } // namespace installer |
| |
| #endif // CHROME_INSTALLER_UTIL_PRODUCT_H_ |