installation_state.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// Use of this source code is governed by a BSD-style license that can be 3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// found in the LICENSE file. 4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#ifndef CHROME_INSTALLER_UTIL_INSTALLATION_STATE_H_ 6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#define CHROME_INSTALLER_UTIL_INSTALLATION_STATE_H_ 7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include <string> 9902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 10902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/basictypes.h" 11902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/command_line.h" 12902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/files/file_path.h" 13902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/memory/scoped_ptr.h" 14902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "chrome/installer/util/app_commands.h" 15902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "chrome/installer/util/browser_distribution.h" 16e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com#include "chrome/installer/util/channel_info.h" 17902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 18902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comnamespace base { 19902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comclass Version; 20902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comnamespace win { 21902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comclass RegKey; 22902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 23902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} 24902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 25902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comnamespace installer { 26902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 27902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comclass InstallationState; 28902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 29902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// A representation of a product's state on the machine based on the contents 30902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// of the Windows registry. 31902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// TODO(grt): Pull this out into its own file. 32902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comclass ProductState { 33902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com public: 34902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com ProductState(); 35902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 36902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns true if the product is installed (i.e., the product's Clients key 37902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // exists and has a "pv" value); false otherwise. 38902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool Initialize(bool system_install, 39902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com BrowserDistribution::Type type); 40902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool Initialize(bool system_install, 41902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com BrowserDistribution* distribution); 42902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 43902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns the product's channel info (i.e., the Google Update "ap" value). 44902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com const ChannelInfo& channel() const { return channel_; } 45902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 46e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com // Returns the path to the product's "setup.exe"; may be empty. 47902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com base::FilePath GetSetupPath() const; 48902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 49902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns the product's version. This method may only be called on an 50902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // instance that has been initialized for an installed product. 51902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com const base::Version& version() const; 52902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 53902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns the current version of the product if a new version is awaiting 54902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // update; may be NULL. Ownership of a returned value is not passed to the 55902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // caller. 56902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com const base::Version* old_version() const { return old_version_.get(); } 57902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 58902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns the brand code the product is currently installed with. 59902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com const std::wstring& brand() const { return brand_; } 60902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 617e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com // Returns the command to be used to update to the new version that is 627e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com // awaiting update; may be empty. 637e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com const std::wstring& rename_cmd() const { return rename_cmd_; } 647e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com 657e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com // Returns true and populates |eula_accepted| if the product has such a value; 667e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com // otherwise, returns false and does not modify |eula_accepted|. Expected 67902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // values are 0 (false) and 1 (true), although |eula_accepted| is given 68902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // whatever is found. 69902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool GetEulaAccepted(DWORD* eula_accepted) const; 70902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 71902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns true and populates |oem_install| if the product has such a value; 72902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // otherwise, returns false and does not modify |oem_install|. Expected 73902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // value is "1", although |oem_install| is given whatever is found. 74902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool GetOemInstall(std::wstring* oem_install) const; 75902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 76902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns true and populates |usagestats| if the product has such a value; 77e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com // otherwise, returns false and does not modify |usagestats|. Expected values 78e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com // are 0 (false) and 1 (true), although |usagestats| is given whatever is 79e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com // found. 80e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com bool GetUsageStats(DWORD* usagestats) const; 81e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com 82e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com // True if the "msi" value in the ClientState key is present and non-zero. 83e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com bool is_msi() const { return msi_; } 84e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com 85e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com // The command to uninstall the product; may be empty. 86e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com const CommandLine& uninstall_command() const { return uninstall_command_; } 87e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com 88e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com // True if |uninstall_command| contains --multi-install. 89e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com bool is_multi_install() const { return multi_install_; } 90e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com 91e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com // Returns the set of Google Update commands. 92f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com const AppCommands& commands() const { return commands_; } 93f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com 94f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com // Returns this object a la operator=(). 95f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com ProductState& CopyFrom(const ProductState& other); 96f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com 97f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com // Clears the state of this object. 98e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com void Clear(); 99e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com 100e606d6e210b17dd9dd582d4d3ec70acb4f3213d5chudy@google.com protected: 101902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com static bool InitializeCommands(const base::win::RegKey& version_key, 102902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com AppCommands* commands); 103902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 104902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com ChannelInfo channel_; 105902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com scoped_ptr<Version> version_; 106902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com scoped_ptr<Version> old_version_; 107902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com std::wstring brand_; 108b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com std::wstring rename_cmd_; 109b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com std::wstring oem_install_; 110b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com CommandLine uninstall_command_; 111b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com AppCommands commands_; 112b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com DWORD eula_accepted_; 113902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com DWORD usagestats_; 114902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool msi_ : 1; 115902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool multi_install_ : 1; 116902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool has_eula_accepted_ : 1; 117902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool has_oem_install_ : 1; 118902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool has_usagestats_ : 1; 119902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 120902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com private: 121902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com friend class InstallationState; 122902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 123902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com DISALLOW_COPY_AND_ASSIGN(ProductState); 124902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}; // class ProductState 125902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 126902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// Encapsulates the state of all products on the system. 127902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// TODO(grt): Rename this to MachineState and put it in its own file. 128902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comclass InstallationState { 129902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com public: 130902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com InstallationState(); 131902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 132902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Initializes this object with the machine's current state. 133902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com void Initialize(); 134902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 135902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns the state of a product or NULL if not installed. 136902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Caller does NOT assume ownership of returned pointer. 137902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com const ProductState* GetProductState(bool system_install, 138902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com BrowserDistribution::Type type) const; 139902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 140902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Returns the state of a product, even one that has not yet been installed. 141902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // This is useful during first install, when some but not all ProductState 142902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // information has been written by Omaha. Notably absent from the 143902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // ProductState returned here are the version numbers. Do NOT try to access 144902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // the version numbers from a ProductState returned by this method. 145902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // Caller does NOT assume ownership of returned pointer. This method will 146902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com // never return NULL. 147902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com const ProductState* GetNonVersionedProductState( 148902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com bool system_install, BrowserDistribution::Type type) const; 149902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 150902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com protected: 151902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com enum { 152902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com CHROME_BROWSER_INDEX, 153902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com CHROME_FRAME_INDEX, 154902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com CHROME_BINARIES_INDEX, 155902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com CHROME_APP_HOST_INDEX, 156902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com NUM_PRODUCTS 157902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com }; 158902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 159902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com static int IndexFromDistType(BrowserDistribution::Type type); 160902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 161902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com ProductState user_products_[NUM_PRODUCTS]; 162902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com ProductState system_products_[NUM_PRODUCTS]; 163902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 164902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com private: 165902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com DISALLOW_COPY_AND_ASSIGN(InstallationState); 166902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}; // class InstallationState 167902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 168902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com} // namespace installer 169902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com 170902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#endif // CHROME_INSTALLER_UTIL_INSTALLATION_STATE_H_ 171902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com