Chromium Code Reviews| Index: chrome/browser/profiles/profile_shortcut_manager_win.cc |
| =================================================================== |
| --- chrome/browser/profiles/profile_shortcut_manager_win.cc (revision 0) |
| +++ chrome/browser/profiles/profile_shortcut_manager_win.cc (revision 0) |
| @@ -0,0 +1,216 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/profiles/profile_shortcut_manager_win.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/file_path.h" |
| +#include "base/file_util.h" |
| +#include "base/path_service.h" |
| +#include "base/stringprintf.h" |
| +#include "base/utf_string_conversions.h" |
| +#include "chrome/browser/browser_process.h" |
| +#include "chrome/browser/prefs/pref_service.h" |
| +#include "chrome/browser/profiles/profile_info_cache.h" |
| +#include "chrome/browser/profiles/profile_manager.h" |
| +#include "chrome/common/chrome_constants.h" |
| +#include "chrome/common/chrome_switches.h" |
| +#include "chrome/common/pref_names.h" |
| +#include "chrome/installer/util/browser_distribution.h" |
| +#include "chrome/installer/util/shell_util.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "grit/generated_resources.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| + |
| +using content::BrowserThread; |
| + |
| +namespace { |
| + |
| +// Creates the argument to pass to the Windows executable that launches Chrome |
| +// with the profile in |profile_base_dir|. |
| +// For example: --profile-directory="Profile 2" |
| +string16 CreateProfileShortcutSwitch(string16 profile_base_dir) { |
| + string16 profile_directory = base::StringPrintf(L"--%ls=\"%ls\"", |
| + ASCIIToUTF16(switches::kProfileDirectory).c_str(), |
| + profile_base_dir.c_str()); |
| + return profile_directory; |
| +} |
| + |
| +// Wrap a ShellUtil function that returns a bool so it can be posted in a |
| +// task to the FILE thread. |
| +void CallShellUtilBoolFunction( |
| + const base::Callback<bool(void)>& bool_function) { |
| + bool_function.Run(); |
| +} |
| + |
| +} // namespace |
|
Robert Sesek
2011/11/21 16:00:37
nit: two spaces before comments
Miranda Callahan
2011/11/21 18:19:52
Done.
|
| + |
| +ProfileShortcutManagerWin::ProfileShortcutManagerWin() { |
| +} |
| + |
| +ProfileShortcutManagerWin::~ProfileShortcutManagerWin() { |
| +} |
| + |
| +void ProfileShortcutManagerWin::OnProfileAdded( |
| + const string16& profile_name, |
| + const string16& profile_base_dir) { |
| + // Launch task to add shortcut to desktop on Windows. If this is the very |
| + // first profile created, don't add the user name to the shortcut. |
| + // TODO(mirandac): respect master_preferences choice to create no shortcuts |
| + // (see http://crbug.com/104463) |
| + if (g_browser_process->profile_manager()->GetNumberOfProfiles() > 1) { |
| + string16 profile_directory = |
| + CreateProfileShortcutSwitch(profile_base_dir); |
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&CreateChromeDesktopShortcutForProfile, |
| + profile_name, profile_directory, true)); |
| + |
| + // If this is the very first multi-user account created, change the |
| + // original shortcut to launch with the First User profile. |
| + PrefService* local_state = g_browser_process->local_state(); |
| + if (local_state->GetInteger(prefs::kProfilesNumCreated) == 2) { |
| + string16 default_name = l10n_util::GetStringUTF16( |
| + IDS_DEFAULT_PROFILE_NAME); |
| + string16 default_directory = |
| + CreateProfileShortcutSwitch(UTF8ToUTF16(chrome::kInitialProfile)); |
| + BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| + |
| + string16 old_shortcut; |
| + string16 new_shortcut; |
| + if (ShellUtil::GetChromeShortcutName(dist, false, L"", &old_shortcut) && |
| + ShellUtil::GetChromeShortcutName(dist, false, default_name, |
| + &new_shortcut)) { |
| + // Update doesn't allow changing the target, so rename first. |
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&RenameChromeDesktopShortcutForProfile, |
| + old_shortcut, new_shortcut)); |
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&UpdateChromeDesktopShortcutForProfile, |
| + new_shortcut, default_directory)); |
| + } |
| + } |
| + } else { // Only one profile, so create original shortcut. |
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&CreateChromeDesktopShortcutForProfile, |
| + L"", L"", true)); |
| + } |
| +} |
| + |
| +void ProfileShortcutManagerWin::OnProfileRemoved( |
| + const string16& profile_name) { |
| + BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| + string16 shortcut; |
| + if (ShellUtil::GetChromeShortcutName(dist, false, profile_name, &shortcut)) { |
| + std::vector<string16> shortcuts(1, shortcut); |
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&CallShellUtilBoolFunction, |
| + base::Bind( |
| + &ShellUtil::RemoveChromeDesktopShortcutsWithAppendedNames, |
| + shortcuts))); |
| + } |
| +} |
| + |
| +void ProfileShortcutManagerWin::OnProfileNameChanged( |
| + const string16& old_profile_name, |
| + const string16& new_profile_name) { |
| + // Launch task to change name of desktop shortcut on Windows. |
| + // TODO(mirandac): respect master_preferences choice to create no shortcuts |
| + // (see http://crbug.com/104463) |
| + string16 old_shortcut; |
| + string16 new_shortcut; |
| + BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| + if (ShellUtil::GetChromeShortcutName( |
| + dist, false, old_profile_name, &old_shortcut) && |
| + ShellUtil::GetChromeShortcutName( |
| + dist, false, new_profile_name, &new_shortcut)) { |
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&RenameChromeDesktopShortcutForProfile, |
| + old_shortcut, |
| + new_shortcut)); |
| + } |
| +} |
| + |
| +// static |
| +std::vector<string16> ProfileShortcutManagerWin::GenerateShortcutsFromProfiles( |
| + std::vector<string16> profile_names) { |
| + BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| + std::vector<string16> shortcuts; |
| + shortcuts.reserve(profile_names.size()); |
| + for (std::vector<string16>::const_iterator it = profile_names.begin(); |
| + it != profile_names.end(); |
| + ++it) { |
| + string16 shortcut; |
| + if (ShellUtil::GetChromeShortcutName(dist, false, *it, &shortcut)) |
| + shortcuts.push_back(shortcut); |
| + } |
| + return shortcuts; |
| +} |
| + |
| +// static |
| +void ProfileShortcutManagerWin::CreateChromeDesktopShortcutForProfile( |
| + const string16& profile_name, |
| + const string16& directory, |
| + bool create) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + FilePath chrome_exe; |
| + if (!PathService::Get(base::FILE_EXE, &chrome_exe)) |
| + return; |
| + BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| + string16 description; |
| + if (!dist) |
| + return; |
| + else |
| + description = WideToUTF16(dist->GetAppDescription()); |
| + ShellUtil::CreateChromeDesktopShortcut( |
| + dist, |
| + chrome_exe.value(), |
| + description, |
| + profile_name, |
| + directory, |
| + ShellUtil::CURRENT_USER, |
| + false, // Use alternate text. |
| + create); // Create if it doesn't already exist. |
| +} |
| + |
| +// static |
| +void ProfileShortcutManagerWin::RenameChromeDesktopShortcutForProfile( |
| + const string16& old_shortcut, |
| + const string16& new_shortcut) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + FilePath shortcut_path; |
| + if (ShellUtil::GetDesktopPath(false, // User's directory instead of system. |
| + &shortcut_path)) { |
| + FilePath old_profile = shortcut_path.Append(old_shortcut); |
| + FilePath new_profile = shortcut_path.Append(new_shortcut); |
| + file_util::Move(old_profile, new_profile); |
| + } |
| +} |
| + |
| +// static |
| +void ProfileShortcutManagerWin::UpdateChromeDesktopShortcutForProfile( |
| + const string16& shortcut, |
| + const string16& arguments) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| + FilePath shortcut_path; |
| + if (!ShellUtil::GetDesktopPath(false, &shortcut_path)) |
| + return; |
| + |
| + shortcut_path = shortcut_path.Append(shortcut); |
| + FilePath chrome_exe; |
| + if (!PathService::Get(base::FILE_EXE, &chrome_exe)) |
| + return; |
| + BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| + string16 description; |
| + if (!dist) |
| + return; |
| + else |
| + description = WideToUTF16(dist->GetAppDescription()); |
| + ShellUtil::UpdateChromeShortcut( |
| + dist, |
| + chrome_exe.value(), |
| + shortcut_path.value(), |
| + arguments, |
| + description, |
| + false); |
| +} |
| Property changes on: chrome\browser\profiles\profile_shortcut_manager_win.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |