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