| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #ifndef CHROME_INSTALLER_UTIL_PRODUCT_H_ | 5 #ifndef CHROME_INSTALLER_UTIL_PRODUCT_H_ |
| 6 #define CHROME_INSTALLER_UTIL_PRODUCT_H_ | 6 #define CHROME_INSTALLER_UTIL_PRODUCT_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <set> |
| 10 #include <string> |
| 9 #include <vector> | 11 #include <vector> |
| 10 | 12 |
| 11 #include "base/ref_counted.h" | |
| 12 #include "base/scoped_ptr.h" | 13 #include "base/scoped_ptr.h" |
| 13 #include "chrome/installer/util/browser_distribution.h" | 14 #include "chrome/installer/util/browser_distribution.h" |
| 14 #include "chrome/installer/util/package.h" | |
| 15 | 15 |
| 16 class CommandLine; | 16 class CommandLine; |
| 17 | 17 |
| 18 namespace installer { | 18 namespace installer { |
| 19 |
| 19 class MasterPreferences; | 20 class MasterPreferences; |
| 20 } | |
| 21 | |
| 22 namespace installer { | |
| 23 | |
| 24 class Product; | 21 class Product; |
| 25 class Package; | 22 class ProductOperations; |
| 26 class PackageProperties; | |
| 27 | |
| 28 typedef std::vector<scoped_refptr<Package> > Packages; | |
| 29 typedef std::vector<scoped_refptr<const Product> > Products; | |
| 30 | |
| 31 const Product* FindProduct(const Products& products, | |
| 32 BrowserDistribution::Type type); | |
| 33 | 23 |
| 34 // Represents an installation of a specific product which has a one-to-one | 24 // Represents an installation of a specific product which has a one-to-one |
| 35 // relation to a BrowserDistribution. A product has registry settings, related | 25 // relation to a BrowserDistribution. A product has registry settings, related |
| 36 // installation/uninstallation actions and exactly one Package that represents | 26 // installation/uninstallation actions and exactly one Package that represents |
| 37 // the files on disk. The Package may be shared with other Product instances, | 27 // the files on disk. The Package may be shared with other Product instances, |
| 38 // so only the last Product to be uninstalled should remove the package. | 28 // so only the last Product to be uninstalled should remove the package. |
| 39 // Right now there are no classes that derive from Product, but in | 29 // Right now there are no classes that derive from Product, but in |
| 40 // the future, as we move away from global functions and towards a data driven | 30 // the future, as we move away from global functions and towards a data driven |
| 41 // installation, each distribution could derive from this class and provide | 31 // installation, each distribution could derive from this class and provide |
| 42 // distribution specific functionality. | 32 // distribution specific functionality. |
| 43 class Product : public base::RefCounted<Product> { | 33 class Product { |
| 44 public: | 34 public: |
| 45 Product(BrowserDistribution* distribution, Package* installation_package); | 35 explicit Product(BrowserDistribution* distribution); |
| 36 |
| 37 ~Product(); |
| 38 |
| 39 void InitializeFromPreferences(const MasterPreferences& prefs); |
| 40 |
| 41 void InitializeFromUninstallCommand(const CommandLine& uninstall_command); |
| 46 | 42 |
| 47 BrowserDistribution* distribution() const { | 43 BrowserDistribution* distribution() const { |
| 48 return distribution_; | 44 return distribution_; |
| 49 } | 45 } |
| 50 | 46 |
| 51 // Returns the install package object for the installation of this product. | 47 bool is_type(BrowserDistribution::Type type) const { |
| 52 // If the product is installed at system level,the function returns a system | 48 return distribution_->GetType() == type; |
| 53 // wide location (ProgramFiles\Google). Otherwise it returns a package in a | |
| 54 // user specific location (Users\<user>\Local Settings...) | |
| 55 const Package& package() const; | |
| 56 | |
| 57 // Convenience getter for package().system_level(). | |
| 58 bool system_level() const { | |
| 59 return package().system_level(); | |
| 60 } | 49 } |
| 61 | 50 |
| 62 bool is_chrome() const { | 51 bool is_chrome() const { |
| 63 return distribution_->GetType() == BrowserDistribution::CHROME_BROWSER; | 52 return distribution_->GetType() == BrowserDistribution::CHROME_BROWSER; |
| 64 } | 53 } |
| 65 | 54 |
| 66 bool is_chrome_frame() const { | 55 bool is_chrome_frame() const { |
| 67 return distribution_->GetType() == BrowserDistribution::CHROME_FRAME; | 56 return distribution_->GetType() == BrowserDistribution::CHROME_FRAME; |
| 68 } | 57 } |
| 69 | 58 |
| 59 bool HasOption(const std::wstring& option) const { |
| 60 return options_.find(option) != options_.end(); |
| 61 } |
| 62 |
| 63 // Returns true if the set of options is mutated by this operation. |
| 64 bool SetOption(const std::wstring& option, bool set) { |
| 65 if (set) |
| 66 return options_.insert(option).second; |
| 67 else |
| 68 return options_.erase(option) != 0; |
| 69 } |
| 70 |
| 70 // Returns the path to the directory that holds the user data. This is always | 71 // Returns the path to the directory that holds the user data. This is always |
| 71 // inside "Users\<user>\Local Settings". Note that this is the default user | 72 // inside "Users\<user>\Local Settings". Note that this is the default user |
| 72 // data directory and does not take into account that it can be overriden with | 73 // data directory and does not take into account that it can be overriden with |
| 73 // a command line parameter. | 74 // a command line parameter. |
| 74 FilePath GetUserDataPath() const; | 75 FilePath GetUserDataPath() const; |
| 75 | 76 |
| 76 // Launches Chrome without waiting for it to exit. | 77 // Launches Chrome without waiting for it to exit. |
| 77 bool LaunchChrome() const; | 78 bool LaunchChrome(const FilePath& application_path) const; |
| 78 | 79 |
| 79 // Launches Chrome with given command line, waits for Chrome indefinitely | 80 // Launches Chrome with given command line, waits for Chrome indefinitely |
| 80 // (until it terminates), and gets the process exit code if available. | 81 // (until it terminates), and gets the process exit code if available. |
| 81 // The function returns true as long as Chrome is successfully launched. | 82 // The function returns true as long as Chrome is successfully launched. |
| 82 // The status of Chrome at the return of the function is given by exit_code. | 83 // The status of Chrome at the return of the function is given by exit_code. |
| 83 // NOTE: The 'options' CommandLine object should only contain parameters. | 84 // NOTE: The 'options' CommandLine object should only contain parameters. |
| 84 // The program part will be ignored. | 85 // The program part will be ignored. |
| 85 bool LaunchChromeAndWait(const CommandLine& options, int32* exit_code) const; | 86 bool LaunchChromeAndWait(const FilePath& application_path, |
| 86 | 87 const CommandLine& options, |
| 87 // Returns true if this setup process is running as an install managed by an | 88 int32* exit_code) const; |
| 88 // MSI wrapper. There are three things that are checked: | |
| 89 // 1) the presence of --msi on the command line | |
| 90 // 2) the presence of "msi": true in the master preferences file | |
| 91 // 3) the presence of a DWORD value in the ClientState key called msi with | |
| 92 // value 1 | |
| 93 bool IsMsi() const; | |
| 94 | 89 |
| 95 // Sets the boolean MSI marker for this installation if set is true or clears | 90 // Sets the boolean MSI marker for this installation if set is true or clears |
| 96 // it otherwise. The MSI marker is stored in the registry under the | 91 // it otherwise. The MSI marker is stored in the registry under the |
| 97 // ClientState key. | 92 // ClientState key. |
| 98 bool SetMsiMarker(bool set) const; | 93 bool SetMsiMarker(bool system_install, bool set) const; |
| 99 | 94 |
| 100 // Returns true if setup should create an entry in the Add/Remove list | 95 // Returns true if setup should create an entry in the Add/Remove list |
| 101 // of installed applications. | 96 // of installed applications. |
| 102 bool ShouldCreateUninstallEntry() const; | 97 bool ShouldCreateUninstallEntry() const; |
| 103 | 98 |
| 99 // See ProductOperations::AddKeyFiles. |
| 100 void AddKeyFiles(std::vector<FilePath>* key_files) const; |
| 101 |
| 102 // See ProductOperations::AddComDllList. |
| 103 void AddComDllList(std::vector<FilePath>* com_dll_list) const; |
| 104 |
| 105 // See ProductOperations::AppendProductFlags. |
| 106 void AppendProductFlags(CommandLine* command_line) const; |
| 107 |
| 108 // See Productoperations::SetChannelFlags. |
| 109 bool SetChannelFlags(bool set, ChannelInfo* channel_info) const; |
| 110 |
| 104 protected: | 111 protected: |
| 105 enum CacheStateFlags { | 112 enum CacheStateFlags { |
| 106 MSI_STATE = 0x01 | 113 MSI_STATE = 0x01 |
| 107 }; | 114 }; |
| 108 | 115 |
| 109 BrowserDistribution* distribution_; | 116 BrowserDistribution* distribution_; |
| 110 scoped_refptr<Package> package_; | 117 scoped_ptr<ProductOperations> operations_; |
| 111 mutable bool msi_; | 118 std::set<std::wstring> options_; |
| 112 mutable uint8 cache_state_; | |
| 113 | 119 |
| 114 private: | 120 private: |
| 115 friend class base::RefCounted<Product>; | |
| 116 ~Product() { | |
| 117 } | |
| 118 DISALLOW_COPY_AND_ASSIGN(Product); | 121 DISALLOW_COPY_AND_ASSIGN(Product); |
| 119 }; | 122 }; |
| 120 | 123 |
| 121 // A collection of Product objects and related physical installation | |
| 122 // packages. Each Product is associated with a single installation | |
| 123 // package object, and each package object is associated with one or more | |
| 124 // Product objects. | |
| 125 class ProductPackageMapping { | |
| 126 public: | |
| 127 explicit ProductPackageMapping(bool multi_install, bool system_level); | |
| 128 | |
| 129 bool multi_install() const { | |
| 130 return multi_install_; | |
| 131 } | |
| 132 | |
| 133 bool system_level() const { | |
| 134 return system_level_; | |
| 135 } | |
| 136 | |
| 137 const Packages& packages() const; | |
| 138 | |
| 139 const Products& products() const; | |
| 140 | |
| 141 bool AddDistribution(BrowserDistribution::Type type, | |
| 142 const installer::MasterPreferences& prefs); | |
| 143 bool AddDistribution(BrowserDistribution* distribution); | |
| 144 | |
| 145 protected: | |
| 146 bool multi_install_; | |
| 147 bool system_level_; | |
| 148 Packages packages_; | |
| 149 Products products_; | |
| 150 scoped_ptr<PackageProperties> package_properties_; | |
| 151 | |
| 152 private: | |
| 153 DISALLOW_COPY_AND_ASSIGN(ProductPackageMapping); | |
| 154 }; | |
| 155 | |
| 156 } // namespace installer | 124 } // namespace installer |
| 157 | 125 |
| 158 #endif // CHROME_INSTALLER_UTIL_PRODUCT_H_ | 126 #endif // CHROME_INSTALLER_UTIL_PRODUCT_H_ |
| OLD | NEW |