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 #include "chrome/installer/util/chrome_frame_operations.h"
6
7 #include "base/command_line.h"
8 #include "base/files/file_path.h"
9 #include "base/logging.h"
10 #include "chrome/installer/util/channel_info.h"
11 #include "chrome/installer/util/helper.h"
12 #include "chrome/installer/util/master_preferences.h"
13 #include "chrome/installer/util/master_preferences_constants.h"
14 #include "chrome/installer/util/util_constants.h"
15
16 namespace installer {
17
ReadOptions(const MasterPreferences & prefs,std::set<base::string16> * options) const18 void ChromeFrameOperations::ReadOptions(const MasterPreferences& prefs,
19 std::set<base::string16>* options)
20 const {
21 DCHECK(options);
22
23 static const struct PrefToOption {
24 const char* pref_name;
25 const wchar_t* option_name;
26 } map[] = {
27 { master_preferences::kMultiInstall, kOptionMultiInstall }
28 };
29
30 bool pref_value;
31
32 for (const PrefToOption* scan = &map[0], *end = &map[arraysize(map)];
33 scan != end; ++scan) {
34 if (prefs.GetBool(scan->pref_name, &pref_value) && pref_value)
35 options->insert(scan->option_name);
36 }
37 }
38
ReadOptions(const CommandLine & uninstall_command,std::set<base::string16> * options) const39 void ChromeFrameOperations::ReadOptions(const CommandLine& uninstall_command,
40 std::set<base::string16>* options)
41 const {
42 DCHECK(options);
43
44 static const struct FlagToOption {
45 const char* flag_name;
46 const wchar_t* option_name;
47 } map[] = {
48 { switches::kMultiInstall, kOptionMultiInstall }
49 };
50
51 for (const FlagToOption* scan = &map[0], *end = &map[arraysize(map)];
52 scan != end; ++scan) {
53 if (uninstall_command.HasSwitch(scan->flag_name))
54 options->insert(scan->option_name);
55 }
56 }
57
AddKeyFiles(const std::set<base::string16> & options,std::vector<base::FilePath> * key_files) const58 void ChromeFrameOperations::AddKeyFiles(
59 const std::set<base::string16>& options,
60 std::vector<base::FilePath>* key_files) const {
61 DCHECK(key_files);
62 key_files->push_back(base::FilePath(installer::kChromeFrameDll));
63 key_files->push_back(base::FilePath(installer::kChromeFrameHelperExe));
64 }
65
AddComDllList(const std::set<base::string16> & options,std::vector<base::FilePath> * com_dll_list) const66 void ChromeFrameOperations::AddComDllList(
67 const std::set<base::string16>& options,
68 std::vector<base::FilePath>* com_dll_list) const {
69 DCHECK(com_dll_list);
70 com_dll_list->push_back(base::FilePath(installer::kChromeFrameDll));
71 }
72
AppendProductFlags(const std::set<base::string16> & options,CommandLine * cmd_line) const73 void ChromeFrameOperations::AppendProductFlags(
74 const std::set<base::string16>& options,
75 CommandLine* cmd_line) const {
76 DCHECK(cmd_line);
77 bool is_multi_install = options.find(kOptionMultiInstall) != options.end();
78
79 // Add --multi-install if it isn't already there.
80 if (is_multi_install && !cmd_line->HasSwitch(switches::kMultiInstall))
81 cmd_line->AppendSwitch(switches::kMultiInstall);
82
83 // --chrome-frame is always needed.
84 cmd_line->AppendSwitch(switches::kChromeFrame);
85 }
86
AppendRenameFlags(const std::set<base::string16> & options,CommandLine * cmd_line) const87 void ChromeFrameOperations::AppendRenameFlags(
88 const std::set<base::string16>& options,
89 CommandLine* cmd_line) const {
90 DCHECK(cmd_line);
91 bool is_multi_install = options.find(kOptionMultiInstall) != options.end();
92
93 // Add --multi-install if it isn't already there.
94 if (is_multi_install && !cmd_line->HasSwitch(switches::kMultiInstall))
95 cmd_line->AppendSwitch(switches::kMultiInstall);
96
97 // --chrome-frame is needed for single installs.
98 if (!is_multi_install)
99 cmd_line->AppendSwitch(switches::kChromeFrame);
100 }
101
SetChannelFlags(const std::set<base::string16> & options,bool set,ChannelInfo * channel_info) const102 bool ChromeFrameOperations::SetChannelFlags(
103 const std::set<base::string16>& options,
104 bool set,
105 ChannelInfo* channel_info) const {
106 #if defined(GOOGLE_CHROME_BUILD)
107 DCHECK(channel_info);
108 bool modified = channel_info->SetChromeFrame(set);
109
110 // Unconditionally remove the legacy -readymode flag.
111 modified |= channel_info->SetReadyMode(false);
112
113 return modified;
114 #else
115 return false;
116 #endif
117 }
118
ShouldCreateUninstallEntry(const std::set<base::string16> & options) const119 bool ChromeFrameOperations::ShouldCreateUninstallEntry(
120 const std::set<base::string16>& options) const {
121 return true;
122 }
123
AddDefaultShortcutProperties(BrowserDistribution * dist,const base::FilePath & target_exe,ShellUtil::ShortcutProperties * properties) const124 void ChromeFrameOperations::AddDefaultShortcutProperties(
125 BrowserDistribution* dist,
126 const base::FilePath& target_exe,
127 ShellUtil::ShortcutProperties* properties) const {
128 NOTREACHED() << "Chrome Frame does not create shortcuts.";
129 }
130
LaunchUserExperiment(const base::FilePath & setup_path,const std::set<base::string16> & options,InstallStatus status,bool system_level) const131 void ChromeFrameOperations::LaunchUserExperiment(
132 const base::FilePath& setup_path,
133 const std::set<base::string16>& options,
134 InstallStatus status,
135 bool system_level) const {
136 // No experiments yet. If adding some in the future, need to have
137 // ChromeFrameDistribution::HasUserExperiments() return true.
138 NOTREACHED();
139 }
140
141 } // namespace installer
142