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