chrome_frame_operations.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/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 16namespace installer { 17 18// Remove ready-mode if not multi-install. 19void ChromeFrameOperations::NormalizeOptions( 20 std::set<std::wstring>* options) const { 21 std::set<std::wstring>::iterator ready_mode(options->find(kOptionReadyMode)); 22 if (ready_mode != options->end() && 23 options->find(kOptionMultiInstall) == options->end()) { 24 LOG(WARNING) << "--ready-mode option does not apply when --multi-install " 25 "is not also specified; ignoring."; 26 options->erase(ready_mode); 27 } 28} 29 30void ChromeFrameOperations::ReadOptions( 31 const MasterPreferences& prefs, 32 std::set<std::wstring>* options) const { 33 DCHECK(options); 34 35 static const struct PrefToOption { 36 const char* pref_name; 37 const wchar_t* option_name; 38 } map[] = { 39 { master_preferences::kChromeFrameReadyMode, kOptionReadyMode }, 40 { master_preferences::kMultiInstall, kOptionMultiInstall } 41 }; 42 43 bool pref_value; 44 45 for (const PrefToOption* scan = &map[0], *end = &map[arraysize(map)]; 46 scan != end; ++scan) { 47 if (prefs.GetBool(scan->pref_name, &pref_value) && pref_value) 48 options->insert(scan->option_name); 49 } 50 51 NormalizeOptions(options); 52} 53 54void ChromeFrameOperations::ReadOptions( 55 const CommandLine& uninstall_command, 56 std::set<std::wstring>* options) const { 57 DCHECK(options); 58 59 static const struct FlagToOption { 60 const char* flag_name; 61 const wchar_t* option_name; 62 } map[] = { 63 { switches::kChromeFrameReadyMode, kOptionReadyMode }, 64 { switches::kMultiInstall, kOptionMultiInstall } 65 }; 66 67 for (const FlagToOption* scan = &map[0], *end = &map[arraysize(map)]; 68 scan != end; ++scan) { 69 if (uninstall_command.HasSwitch(scan->flag_name)) 70 options->insert(scan->option_name); 71 } 72 73 NormalizeOptions(options); 74} 75 76void ChromeFrameOperations::AddKeyFiles( 77 const std::set<std::wstring>& options, 78 std::vector<FilePath>* key_files) const { 79 DCHECK(key_files); 80 key_files->push_back(FilePath(installer::kChromeFrameDll)); 81 key_files->push_back(FilePath(installer::kChromeFrameHelperExe)); 82} 83 84void ChromeFrameOperations::AddComDllList( 85 const std::set<std::wstring>& options, 86 std::vector<FilePath>* com_dll_list) const { 87 DCHECK(com_dll_list); 88 com_dll_list->push_back(FilePath(installer::kChromeFrameDll)); 89} 90 91void ChromeFrameOperations::AppendProductFlags( 92 const std::set<std::wstring>& options, 93 CommandLine* cmd_line) const { 94 DCHECK(cmd_line); 95 bool is_multi_install = options.find(kOptionMultiInstall) != options.end(); 96 97 // Add --multi-install if it isn't already there. 98 if (is_multi_install && !cmd_line->HasSwitch(switches::kMultiInstall)) 99 cmd_line->AppendSwitch(switches::kMultiInstall); 100 101 // --chrome-frame is always needed. 102 cmd_line->AppendSwitch(switches::kChromeFrame); 103 104 // ready-mode is only supported in multi-installs of Chrome Frame. 105 if (is_multi_install && options.find(kOptionReadyMode) != options.end()) 106 cmd_line->AppendSwitch(switches::kChromeFrameReadyMode); 107} 108 109void ChromeFrameOperations::AppendRenameFlags( 110 const std::set<std::wstring>& options, 111 CommandLine* cmd_line) const { 112 DCHECK(cmd_line); 113 bool is_multi_install = options.find(kOptionMultiInstall) != options.end(); 114 115 // Add --multi-install if it isn't already there. 116 if (is_multi_install && !cmd_line->HasSwitch(switches::kMultiInstall)) 117 cmd_line->AppendSwitch(switches::kMultiInstall); 118 119 // --chrome-frame is needed for single installs. 120 if (!is_multi_install) 121 cmd_line->AppendSwitch(switches::kChromeFrame); 122} 123 124bool ChromeFrameOperations::SetChannelFlags( 125 const std::set<std::wstring>& options, 126 bool set, 127 ChannelInfo* channel_info) const { 128#if defined(GOOGLE_CHROME_BUILD) 129 DCHECK(channel_info); 130 bool modified = channel_info->SetChromeFrame(set); 131 132 // Always remove the options if we're called to remove flags or if the 133 // corresponding option isn't set. 134 modified |= channel_info->SetReadyMode( 135 set && options.find(kOptionReadyMode) != options.end()); 136 137 return modified; 138#else 139 return false; 140#endif 141} 142 143bool ChromeFrameOperations::ShouldCreateUninstallEntry( 144 const std::set<std::wstring>& options) const { 145 return options.find(kOptionReadyMode) == options.end(); 146} 147 148void ChromeFrameOperations::AddDefaultShortcutProperties( 149 BrowserDistribution* dist, 150 const FilePath& target_exe, 151 ShellUtil::ShortcutProperties* properties) const { 152 NOTREACHED() << "Chrome Frame does not create shortcuts."; 153} 154 155} // namespace installer 156