1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_INSTALLER_UTIL_INSTALLATION_STATE_H_ 6 #define CHROME_INSTALLER_UTIL_INSTALLATION_STATE_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/command_line.h" 12 #include "base/files/file_path.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "chrome/installer/util/app_commands.h" 15 #include "chrome/installer/util/browser_distribution.h" 16 #include "chrome/installer/util/channel_info.h" 17 18 namespace base { 19 class Version; 20 namespace win { 21 class RegKey; 22 } 23 } 24 25 namespace installer { 26 27 class InstallationState; 28 29 // A representation of a product's state on the machine based on the contents 30 // of the Windows registry. 31 // TODO(grt): Pull this out into its own file. 32 class ProductState { 33 public: 34 ProductState(); 35 36 // Returns true if the product is installed (i.e., the product's Clients key 37 // exists and has a "pv" value); false otherwise. 38 bool Initialize(bool system_install, 39 BrowserDistribution::Type type); 40 bool Initialize(bool system_install, 41 BrowserDistribution* distribution); 42 43 // Returns the product's channel info (i.e., the Google Update "ap" value). 44 const ChannelInfo& channel() const { return channel_; } 45 46 // Returns the path to the product's "setup.exe"; may be empty. 47 base::FilePath GetSetupPath() const; 48 49 // Returns the product's version. This method may only be called on an 50 // instance that has been initialized for an installed product. 51 const base::Version& version() const; 52 53 // Returns the current version of the product if a new version is awaiting 54 // update; may be NULL. Ownership of a returned value is not passed to the 55 // caller. 56 const base::Version* old_version() const { return old_version_.get(); } 57 58 // Returns the brand code the product is currently installed with. 59 const std::wstring& brand() const { return brand_; } 60 61 // Returns the command to be used to update to the new version that is 62 // awaiting update; may be empty. 63 const std::wstring& rename_cmd() const { return rename_cmd_; } 64 65 // Returns true and populates |eula_accepted| if the product has such a value; 66 // otherwise, returns false and does not modify |eula_accepted|. Expected 67 // values are 0 (false) and 1 (true), although |eula_accepted| is given 68 // whatever is found. 69 bool GetEulaAccepted(DWORD* eula_accepted) const; 70 71 // Returns true and populates |oem_install| if the product has such a value; 72 // otherwise, returns false and does not modify |oem_install|. Expected 73 // value is "1", although |oem_install| is given whatever is found. 74 bool GetOemInstall(std::wstring* oem_install) const; 75 76 // Returns true and populates |usagestats| if the product has such a value; 77 // otherwise, returns false and does not modify |usagestats|. Expected values 78 // are 0 (false) and 1 (true), although |usagestats| is given whatever is 79 // found. 80 bool GetUsageStats(DWORD* usagestats) const; 81 82 // True if the "msi" value in the ClientState key is present and non-zero. 83 bool is_msi() const { return msi_; } 84 85 // The command to uninstall the product; may be empty. 86 const base::CommandLine& uninstall_command() const { 87 return uninstall_command_; 88 } 89 90 // True if |uninstall_command| contains --multi-install. 91 bool is_multi_install() const { return multi_install_; } 92 93 // Returns the set of Google Update commands. 94 const AppCommands& commands() const { return commands_; } 95 96 // Returns this object a la operator=(). 97 ProductState& CopyFrom(const ProductState& other); 98 99 // Clears the state of this object. 100 void Clear(); 101 102 protected: 103 static bool InitializeCommands(const base::win::RegKey& version_key, 104 AppCommands* commands); 105 106 ChannelInfo channel_; 107 scoped_ptr<Version> version_; 108 scoped_ptr<Version> old_version_; 109 std::wstring brand_; 110 std::wstring rename_cmd_; 111 std::wstring oem_install_; 112 base::CommandLine uninstall_command_; 113 AppCommands commands_; 114 DWORD eula_accepted_; 115 DWORD usagestats_; 116 bool msi_ : 1; 117 bool multi_install_ : 1; 118 bool has_eula_accepted_ : 1; 119 bool has_oem_install_ : 1; 120 bool has_usagestats_ : 1; 121 122 private: 123 friend class InstallationState; 124 125 DISALLOW_COPY_AND_ASSIGN(ProductState); 126 }; // class ProductState 127 128 // Encapsulates the state of all products on the system. 129 // TODO(grt): Rename this to MachineState and put it in its own file. 130 class InstallationState { 131 public: 132 InstallationState(); 133 134 // Initializes this object with the machine's current state. 135 void Initialize(); 136 137 // Returns the state of a product or NULL if not installed. 138 // Caller does NOT assume ownership of returned pointer. 139 const ProductState* GetProductState(bool system_install, 140 BrowserDistribution::Type type) const; 141 142 // Returns the state of a product, even one that has not yet been installed. 143 // This is useful during first install, when some but not all ProductState 144 // information has been written by Omaha. Notably absent from the 145 // ProductState returned here are the version numbers. Do NOT try to access 146 // the version numbers from a ProductState returned by this method. 147 // Caller does NOT assume ownership of returned pointer. This method will 148 // never return NULL. 149 const ProductState* GetNonVersionedProductState( 150 bool system_install, BrowserDistribution::Type type) const; 151 152 protected: 153 enum { 154 CHROME_BROWSER_INDEX, 155 CHROME_FRAME_INDEX, 156 CHROME_BINARIES_INDEX, 157 CHROME_APP_HOST_INDEX, 158 NUM_PRODUCTS 159 }; 160 161 static int IndexFromDistType(BrowserDistribution::Type type); 162 163 ProductState user_products_[NUM_PRODUCTS]; 164 ProductState system_products_[NUM_PRODUCTS]; 165 166 private: 167 DISALLOW_COPY_AND_ASSIGN(InstallationState); 168 }; // class InstallationState 169 170 } // namespace installer 171 172 #endif // CHROME_INSTALLER_UTIL_INSTALLATION_STATE_H_ 173