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// This file declares a class that contains various method related to branding.
6
7#ifndef CHROME_INSTALLER_UTIL_BROWSER_DISTRIBUTION_H_
8#define CHROME_INSTALLER_UTIL_BROWSER_DISTRIBUTION_H_
9
10#include <string>
11
12#include "base/basictypes.h"
13#include "base/files/file_path.h"
14#include "base/memory/scoped_ptr.h"
15#include "base/strings/string16.h"
16#include "base/version.h"
17#include "chrome/installer/util/util_constants.h"
18
19#if defined(OS_WIN)
20#include <windows.h>  // NOLINT
21#endif
22
23class AppRegistrationData;
24
25class BrowserDistribution {
26 public:
27  enum Type {
28    CHROME_BROWSER,
29    CHROME_FRAME,
30    CHROME_BINARIES,
31    CHROME_APP_HOST,
32    NUM_TYPES
33  };
34
35  enum ShortcutType {
36    SHORTCUT_CHROME,
37    SHORTCUT_CHROME_ALTERNATE,
38    SHORTCUT_APP_LAUNCHER
39  };
40
41  enum Subfolder {
42    SUBFOLDER_CHROME,
43    SUBFOLDER_APPS,
44  };
45
46  enum DefaultBrowserControlPolicy {
47    DEFAULT_BROWSER_UNSUPPORTED,
48    DEFAULT_BROWSER_OS_CONTROL_ONLY,
49    DEFAULT_BROWSER_FULL_CONTROL
50  };
51
52  virtual ~BrowserDistribution();
53
54  static BrowserDistribution* GetDistribution();
55
56  static BrowserDistribution* GetSpecificDistribution(Type type);
57
58  Type GetType() const { return type_; }
59
60  // Getter and adaptors for the underlying |app_reg_data_|.
61  const AppRegistrationData& GetAppRegistrationData() const;
62  base::string16 GetAppGuid() const;
63  base::string16 GetStateKey() const;
64  base::string16 GetStateMediumKey() const;
65  base::string16 GetVersionKey() const;
66
67  virtual void DoPostUninstallOperations(
68      const Version& version,
69      const base::FilePath& local_data_path,
70      const base::string16& distribution_data);
71
72  // Returns the GUID to be used when registering for Active Setup.
73  virtual base::string16 GetActiveSetupGuid();
74
75  // Returns the unsuffixed application name of this program.
76  // This is the base of the name registered with Default Programs on Windows.
77  // IMPORTANT: This should only be called by the installer which needs to make
78  // decisions on the suffixing of the upcoming install, not by external callers
79  // at run-time.
80  virtual base::string16 GetBaseAppName();
81
82  // Returns the localized display name of this distribution.
83  virtual base::string16 GetDisplayName();
84
85  // Returns the localized name of the shortcut identified by |shortcut_type|
86  // for this distribution.
87  virtual base::string16 GetShortcutName(ShortcutType shortcut_type);
88
89  // Returns the index of the icon for the product identified by
90  // |shortcut_type|, inside the file specified by GetIconFilename().
91  virtual int GetIconIndex(ShortcutType shortcut_type);
92
93  // Returns the executable filename (not path) that contains the product icon.
94  virtual base::string16 GetIconFilename();
95
96  // Returns the localized name of the subfolder in the Start Menu identified by
97  // |subfolder_type| that this distribution should create shortcuts in. For
98  // SUBFOLDER_CHROME this returns GetShortcutName(SHORTCUT_CHROME).
99  virtual base::string16 GetStartMenuShortcutSubfolder(
100      Subfolder subfolder_type);
101
102  // Returns the unsuffixed appid of this program.
103  // The AppUserModelId is a property of Windows programs.
104  // IMPORTANT: This should only be called by ShellUtil::GetAppId as the appid
105  // should be suffixed in all scenarios.
106  virtual base::string16 GetBaseAppId();
107
108  // Returns the Browser ProgId prefix (e.g. ChromeHTML, ChromiumHTM, etc...).
109  // The full id is of the form |prefix|.|suffix| and is limited to a maximum
110  // length of 39 characters including null-terminator.  See
111  // http://msdn.microsoft.com/library/aa911706.aspx for details.  We define
112  // |suffix| as a fixed-length 26-character alphanumeric identifier, therefore
113  // the return value of this function must have a maximum length of
114  // 39 - 1(null-term) - 26(|suffix|) - 1(dot separator) = 11 characters.
115  virtual base::string16 GetBrowserProgIdPrefix();
116
117  // Returns the Browser ProgId description.
118  virtual base::string16 GetBrowserProgIdDesc();
119
120  virtual base::string16 GetInstallSubDir();
121
122  virtual base::string16 GetPublisherName();
123
124  virtual base::string16 GetAppDescription();
125
126  virtual base::string16 GetLongAppDescription();
127
128  virtual std::string GetSafeBrowsingName();
129
130  virtual std::string GetNetworkStatsServer() const;
131
132#if defined(OS_WIN)
133  virtual base::string16 GetDistributionData(HKEY root_key);
134#endif
135
136  virtual base::string16 GetUninstallLinkName();
137
138  virtual base::string16 GetUninstallRegPath();
139
140  // Returns an enum specifying the different ways in which this distribution
141  // is allowed to be set as default.
142  virtual DefaultBrowserControlPolicy GetDefaultBrowserControlPolicy();
143
144  virtual bool CanCreateDesktopShortcuts();
145
146  virtual bool GetChromeChannel(base::string16* channel);
147
148  // Returns true if this distribution includes a DelegateExecute verb handler,
149  // and provides the CommandExecuteImpl class UUID if |handler_class_uuid| is
150  // non-NULL.
151  virtual bool GetCommandExecuteImplClsid(base::string16* handler_class_uuid);
152
153  // Returns true if this distribution uses app_host.exe to run platform apps.
154  virtual bool AppHostIsSupported();
155
156  virtual void UpdateInstallStatus(bool system_install,
157      installer::ArchiveType archive_type,
158      installer::InstallStatus install_status);
159
160  // Returns true if this distribution should set the Omaha experiment_labels
161  // registry value.
162  virtual bool ShouldSetExperimentLabels();
163
164  virtual bool HasUserExperiments();
165
166 protected:
167  BrowserDistribution(Type type, scoped_ptr<AppRegistrationData> app_reg_data);
168
169  template<class DistributionClass>
170  static BrowserDistribution* GetOrCreateBrowserDistribution(
171      BrowserDistribution** dist);
172
173  const Type type_;
174
175  scoped_ptr<AppRegistrationData> app_reg_data_;
176
177 private:
178  BrowserDistribution();
179
180  DISALLOW_COPY_AND_ASSIGN(BrowserDistribution);
181};
182
183#endif  // CHROME_INSTALLER_UTIL_BROWSER_DISTRIBUTION_H_
184