diff options
author | kuchhal@chromium.org <kuchhal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-24 23:08:05 +0000 |
---|---|---|
committer | kuchhal@chromium.org <kuchhal@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-24 23:08:05 +0000 |
commit | faeea9b136c583ed39da832e3fdb793a5faa1507 (patch) | |
tree | a69e119a23060f983a17546dc93429d32afa47c8 /chrome/installer/setup | |
parent | 613a03b2415686990248a3058575a4504e2f0ec3 (diff) | |
download | chromium_src-faeea9b136c583ed39da832e3fdb793a5faa1507.zip chromium_src-faeea9b136c583ed39da832e3fdb793a5faa1507.tar.gz chromium_src-faeea9b136c583ed39da832e3fdb793a5faa1507.tar.bz2 |
Add a command line option to installer that will let user set Chrome as
default browser.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@3961 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/installer/setup')
-rwxr-xr-x[-rw-r--r--] | chrome/installer/setup/setup.cc | 489 |
1 files changed, 253 insertions, 236 deletions
diff --git a/chrome/installer/setup/setup.cc b/chrome/installer/setup/setup.cc index 9b375be..493a519 100644..100755 --- a/chrome/installer/setup/setup.cc +++ b/chrome/installer/setup/setup.cc @@ -1,236 +1,253 @@ -// Copyright (c) 2006-2008 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 <shlobj.h> - -#include "chrome/installer/setup/setup.h" - -#include "base/command_line.h" -#include "base/file_util.h" -#include "base/path_service.h" -#include "base/registry.h" -#include "base/string_util.h" -#include "chrome/common/chrome_constants.h" -#include "chrome/installer/setup/setup_constants.h" -#include "chrome/installer/util/browser_distribution.h" -#include "chrome/installer/util/create_reg_key_work_item.h" -#include "chrome/installer/util/helper.h" -#include "chrome/installer/util/install_util.h" -#include "chrome/installer/util/shell_util.h" -#include "chrome/installer/util/util_constants.h" -#include "chrome/installer/util/version.h" -#include "chrome/installer/util/work_item_list.h" - -#include "installer_util_strings.h" - -namespace { - -void AddChromeToMediaPlayerList() { - std::wstring reg_path(installer::kMediaPlayerRegPath); - // registry paths can also be appended like file system path - file_util::AppendToPath(®_path, installer_util::kChromeExe); - LOG(INFO) << "Adding Chrome to Media player list at " << reg_path; - scoped_ptr<WorkItem> work_item(WorkItem::CreateCreateRegKeyWorkItem( - HKEY_LOCAL_MACHINE, reg_path)); - - // if the operation fails we log the error but still continue - if (!work_item.get()->Do()) - LOG(ERROR) << "Could not add Chrome to media player inclusion list."; - -} - -// This method creates Chrome shortcuts in Start->Programs for all users or -// only for current user depending on whether it is system wide install or -// user only install. -// -// If first_install is true, it creates shortcuts for launching and -// uninstalling chrome. -// If first_install is false, the function only updates the shortcut for -// uninstalling chrome. According to -// http://blogs.msdn.com/oldnewthing/archive/2005/11/24/496690.aspx, -// updating uninstall shortcut should not trigger Windows "new application -// installed" notification. -// -// If the shortcuts do not exist, the function does not recreate them during -// update. -bool CreateOrUpdateChromeShortcuts(const std::wstring& exe_path, - bool system_install, - installer_util::InstallStatus install_status, - const std::wstring& install_path, - const std::wstring& new_version) { - std::wstring shortcut_path; - int dir_enum = (system_install) ? base::DIR_COMMON_START_MENU : - base::DIR_START_MENU; - if (!PathService::Get(dir_enum, &shortcut_path)) { - LOG(ERROR) << "Failed to get location for shortcut."; - return false; - } - - // The location of Start->Programs->Google Chrome folder - BrowserDistribution* dist = BrowserDistribution::GetDistribution(); - const std::wstring& product_name = dist->GetApplicationName(); - file_util::AppendToPath(&shortcut_path, product_name); - - // Create/update Chrome link (points to chrome.exe) & Uninstall Chrome link - // (which points to setup.exe) under this folder only if: - // - This is a new install or install repair - // OR - // - The shortcut already exists in case of updates (user may have deleted - // shortcuts since our install. So on updates we only update if shortcut - // already exists) - bool ret = true; - std::wstring chrome_link(shortcut_path); // Chrome link (launches Chrome) - file_util::AppendToPath(&chrome_link, product_name + L".lnk"); - std::wstring chrome_exe(install_path); // Chrome link target - file_util::AppendToPath(&chrome_exe, installer_util::kChromeExe); - - if ((install_status == installer_util::FIRST_INSTALL_SUCCESS) || - (install_status == installer_util::INSTALL_REPAIRED)) { - if (!file_util::PathExists(shortcut_path)) - file_util::CreateDirectoryW(shortcut_path); - - LOG(INFO) << "Creating shortcut to " << chrome_exe << " at " << chrome_link; - ret = ret && ShellUtil::UpdateChromeShortcut(chrome_exe, chrome_link, true); - } else if (file_util::PathExists(chrome_link)) { - LOG(INFO) << "Updating shortcut at " << chrome_link - << " to point to " << chrome_exe; - ret = ret && ShellUtil::UpdateChromeShortcut(chrome_exe, - chrome_link, - false); // do not create new - } - - // Create/update uninstall link - std::wstring uninstall_link(shortcut_path); // Uninstall Chrome link - file_util::AppendToPath(&uninstall_link, - dist->GetUninstallLinkName() + L".lnk"); - if ((install_status == installer_util::FIRST_INSTALL_SUCCESS) || - (install_status == installer_util::INSTALL_REPAIRED) || - (file_util::PathExists(uninstall_link))) { - if (!file_util::PathExists(shortcut_path)) - file_util::CreateDirectoryW(shortcut_path); - std::wstring setup_exe(installer::GetInstallerPathUnderChrome(install_path, - new_version)); - file_util::AppendToPath(&setup_exe, - file_util::GetFilenameFromPath(exe_path)); - std::wstring arguments(L" --"); - arguments.append(installer_util::switches::kUninstall); - if (system_install) { - arguments.append(L" --"); - arguments.append(installer_util::switches::kSystemLevel); - } - - LOG(INFO) << "Creating/updating uninstall link at " << uninstall_link; - std::wstring target_folder = file_util::GetDirectoryFromPath(install_path); - ret = ret && file_util::CreateShortcutLink(setup_exe.c_str(), - uninstall_link.c_str(), - target_folder.c_str(), - arguments.c_str(), - NULL, setup_exe.c_str(), 0); - } - - // Update Desktop and Quick Launch shortcuts. If --create-new-shortcuts - // is specified we want to create them, otherwise we update them only if - // they exist. - bool create = false; // Only update; do not create, if they do not exist - CommandLine cmd_line; - if (cmd_line.HasSwitch(installer_util::switches::kCreateAllShortcuts)) - create = true; - if (system_install) { - ret = ret && ShellUtil::CreateChromeDesktopShortcut(chrome_exe, - ShellUtil::SYSTEM_LEVEL, create); - ret = ret && ShellUtil::CreateChromeQuickLaunchShortcut(chrome_exe, - ShellUtil::CURRENT_USER | ShellUtil::SYSTEM_LEVEL, create); - } else { - ret = ret && ShellUtil::CreateChromeDesktopShortcut(chrome_exe, - ShellUtil::CURRENT_USER, create); - ret = ret && ShellUtil::CreateChromeQuickLaunchShortcut(chrome_exe, - ShellUtil::CURRENT_USER, create); - } - - return ret; -} -} // namespace - - -std::wstring installer::GetInstallerPathUnderChrome( - const std::wstring& install_path, const std::wstring& new_version) { - std::wstring installer_path(install_path); - file_util::AppendToPath(&installer_path, new_version); - file_util::AppendToPath(&installer_path, installer::kInstallerDir); - return installer_path; -} - - -installer_util::InstallStatus installer::InstallOrUpdateChrome( - const std::wstring& exe_path, const std::wstring& archive_path, - const std::wstring& install_temp_path, bool system_install, - const Version& new_version, const Version* installed_version) { - - std::wstring install_path(GetChromeInstallPath(system_install)); - if (install_path.empty()) { - LOG(ERROR) << "Could not get installation destination path."; - InstallUtil::SetInstallerError(system_install, - installer_util::INSTALL_FAILED, - IDS_INSTALL_FAILED_BASE); - return installer_util::INSTALL_FAILED; - } else { - LOG(INFO) << "install destination path: " << install_path; - } - - std::wstring src_path(install_temp_path); - file_util::AppendToPath(&src_path, std::wstring(kInstallSourceDir)); - file_util::AppendToPath(&src_path, std::wstring(kInstallSourceChromeDir)); - - HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; - bool install_success = InstallNewVersion(exe_path, archive_path, src_path, - install_path, install_temp_path, reg_root, new_version); - - installer_util::InstallStatus result; - if (!install_success) { - LOG(ERROR) << "Install failed."; - InstallUtil::SetInstallerError(system_install, - installer_util::INSTALL_FAILED, - IDS_INSTALL_FAILED_BASE); - result = installer_util::INSTALL_FAILED; - } else { - if (!installed_version) { - LOG(INFO) << "First install of version " << new_version.GetString(); - result = installer_util::FIRST_INSTALL_SUCCESS; - } else if (new_version.GetString() == installed_version->GetString()) { - LOG(INFO) << "Install repaired of version " << new_version.GetString(); - result = installer_util::INSTALL_REPAIRED; - } else if (new_version.IsHigherThan(installed_version)) { - LOG(INFO) << "Version updated to " << new_version.GetString(); - result = installer_util::NEW_VERSION_UPDATED; - } else { - NOTREACHED(); - } - - if (!CreateOrUpdateChromeShortcuts(exe_path, system_install, result, - install_path, new_version.GetString())) - LOG(WARNING) << "Failed to create/update start menu shortcut."; - - std::wstring chrome_exe(install_path); - file_util::AppendToPath(&chrome_exe, installer_util::kChromeExe); - if (result == installer_util::FIRST_INSTALL_SUCCESS || - result == installer_util::INSTALL_REPAIRED) { - // Try to add Chrome to Media Player shim inclusion list. We don't do any - // error checking here because this operation will fail if user doesn't - // have admin rights and we want to ignore the error. - AddChromeToMediaPlayerList(); - - // We try to register Chrome as a valid browser on local machine. This - // will work only if current user has admin rights. - LOG(INFO) << "Registering Chrome as browser"; - ShellUtil::RegisterStatus ret = - ShellUtil::AddChromeToSetAccessDefaults(chrome_exe, true); - LOG(INFO) << "Return status of Chrome browser registration " << ret; - } else { - RemoveOldVersionDirs(install_path, new_version.GetString()); - } - } - - return result; -} - +// Copyright (c) 2006-2008 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 <shlobj.h>
+
+#include "chrome/installer/setup/setup.h"
+
+#include "base/command_line.h"
+#include "base/file_util.h"
+#include "base/path_service.h"
+#include "base/registry.h"
+#include "base/string_util.h"
+#include "chrome/common/chrome_constants.h"
+#include "chrome/installer/setup/setup_constants.h"
+#include "chrome/installer/util/browser_distribution.h"
+#include "chrome/installer/util/create_reg_key_work_item.h"
+#include "chrome/installer/util/helper.h"
+#include "chrome/installer/util/install_util.h"
+#include "chrome/installer/util/shell_util.h"
+#include "chrome/installer/util/util_constants.h"
+#include "chrome/installer/util/version.h"
+#include "chrome/installer/util/work_item_list.h"
+
+#include "installer_util_strings.h"
+
+namespace {
+
+void AddChromeToMediaPlayerList() {
+ std::wstring reg_path(installer::kMediaPlayerRegPath);
+ // registry paths can also be appended like file system path
+ file_util::AppendToPath(®_path, installer_util::kChromeExe);
+ LOG(INFO) << "Adding Chrome to Media player list at " << reg_path;
+ scoped_ptr<WorkItem> work_item(WorkItem::CreateCreateRegKeyWorkItem(
+ HKEY_LOCAL_MACHINE, reg_path));
+
+ // if the operation fails we log the error but still continue
+ if (!work_item.get()->Do())
+ LOG(ERROR) << "Could not add Chrome to media player inclusion list.";
+
+}
+
+void DoFirstInstallTasks(std::wstring install_path, bool system_level) {
+ // Try to add Chrome to Media Player shim inclusion list. We don't do any
+ // error checking here because this operation will fail if user doesn't
+ // have admin rights and we want to ignore the error.
+ AddChromeToMediaPlayerList();
+
+ // We try to register Chrome as a valid browser on local machine. This
+ // will work only if current user has admin rights.
+ std::wstring chrome_exe(install_path);
+ file_util::AppendToPath(&chrome_exe, installer_util::kChromeExe);
+ CommandLine cmd_line;
+ LOG(INFO) << "Registering Chrome as browser";
+ ShellUtil::RegisterStatus ret = ShellUtil::FAILURE;
+ if (cmd_line.HasSwitch(installer_util::switches::kMakeChromeDefault)) {
+ ret = ShellUtil::AddChromeToSetAccessDefaults(chrome_exe, false);
+ if (ret == ShellUtil::SUCCESS) {
+ if (system_level) {
+ ShellUtil::MakeChromeDefault(
+ ShellUtil::CURRENT_USER | ShellUtil::SYSTEM_LEVEL, chrome_exe);
+ } else {
+ ShellUtil::MakeChromeDefault(ShellUtil::CURRENT_USER, chrome_exe);
+ }
+ }
+ } else {
+ ret = ShellUtil::AddChromeToSetAccessDefaults(chrome_exe, true);
+ }
+ LOG(INFO) << "Return status of Chrome browser registration " << ret;
+}
+
+// This method creates Chrome shortcuts in Start->Programs for all users or
+// only for current user depending on whether it is system wide install or
+// user only install.
+//
+// If first_install is true, it creates shortcuts for launching and
+// uninstalling chrome.
+// If first_install is false, the function only updates the shortcut for
+// uninstalling chrome. According to
+// http://blogs.msdn.com/oldnewthing/archive/2005/11/24/496690.aspx,
+// updating uninstall shortcut should not trigger Windows "new application
+// installed" notification.
+//
+// If the shortcuts do not exist, the function does not recreate them during
+// update.
+bool CreateOrUpdateChromeShortcuts(const std::wstring& exe_path,
+ bool system_install,
+ installer_util::InstallStatus install_status,
+ const std::wstring& install_path,
+ const std::wstring& new_version) {
+ std::wstring shortcut_path;
+ int dir_enum = (system_install) ? base::DIR_COMMON_START_MENU :
+ base::DIR_START_MENU;
+ if (!PathService::Get(dir_enum, &shortcut_path)) {
+ LOG(ERROR) << "Failed to get location for shortcut.";
+ return false;
+ }
+
+ // The location of Start->Programs->Google Chrome folder
+ BrowserDistribution* dist = BrowserDistribution::GetDistribution();
+ const std::wstring& product_name = dist->GetApplicationName();
+ file_util::AppendToPath(&shortcut_path, product_name);
+
+ // Create/update Chrome link (points to chrome.exe) & Uninstall Chrome link
+ // (which points to setup.exe) under this folder only if:
+ // - This is a new install or install repair
+ // OR
+ // - The shortcut already exists in case of updates (user may have deleted
+ // shortcuts since our install. So on updates we only update if shortcut
+ // already exists)
+ bool ret = true;
+ std::wstring chrome_link(shortcut_path); // Chrome link (launches Chrome)
+ file_util::AppendToPath(&chrome_link, product_name + L".lnk");
+ std::wstring chrome_exe(install_path); // Chrome link target
+ file_util::AppendToPath(&chrome_exe, installer_util::kChromeExe);
+
+ if ((install_status == installer_util::FIRST_INSTALL_SUCCESS) ||
+ (install_status == installer_util::INSTALL_REPAIRED)) {
+ if (!file_util::PathExists(shortcut_path))
+ file_util::CreateDirectoryW(shortcut_path);
+
+ LOG(INFO) << "Creating shortcut to " << chrome_exe << " at " << chrome_link;
+ ret = ret && ShellUtil::UpdateChromeShortcut(chrome_exe, chrome_link, true);
+ } else if (file_util::PathExists(chrome_link)) {
+ LOG(INFO) << "Updating shortcut at " << chrome_link
+ << " to point to " << chrome_exe;
+ ret = ret && ShellUtil::UpdateChromeShortcut(chrome_exe,
+ chrome_link,
+ false); // do not create new
+ }
+
+ // Create/update uninstall link
+ std::wstring uninstall_link(shortcut_path); // Uninstall Chrome link
+ file_util::AppendToPath(&uninstall_link,
+ dist->GetUninstallLinkName() + L".lnk");
+ if ((install_status == installer_util::FIRST_INSTALL_SUCCESS) ||
+ (install_status == installer_util::INSTALL_REPAIRED) ||
+ (file_util::PathExists(uninstall_link))) {
+ if (!file_util::PathExists(shortcut_path))
+ file_util::CreateDirectoryW(shortcut_path);
+ std::wstring setup_exe(installer::GetInstallerPathUnderChrome(install_path,
+ new_version));
+ file_util::AppendToPath(&setup_exe,
+ file_util::GetFilenameFromPath(exe_path));
+ std::wstring arguments(L" --");
+ arguments.append(installer_util::switches::kUninstall);
+ if (system_install) {
+ arguments.append(L" --");
+ arguments.append(installer_util::switches::kSystemLevel);
+ }
+
+ LOG(INFO) << "Creating/updating uninstall link at " << uninstall_link;
+ std::wstring target_folder = file_util::GetDirectoryFromPath(install_path);
+ ret = ret && file_util::CreateShortcutLink(setup_exe.c_str(),
+ uninstall_link.c_str(),
+ target_folder.c_str(),
+ arguments.c_str(),
+ NULL, setup_exe.c_str(), 0);
+ }
+
+ // Update Desktop and Quick Launch shortcuts. If --create-new-shortcuts
+ // is specified we want to create them, otherwise we update them only if
+ // they exist.
+ bool create = false; // Only update; do not create, if they do not exist
+ CommandLine cmd_line;
+ if (cmd_line.HasSwitch(installer_util::switches::kCreateAllShortcuts))
+ create = true;
+ if (system_install) {
+ ret = ret && ShellUtil::CreateChromeDesktopShortcut(chrome_exe,
+ ShellUtil::SYSTEM_LEVEL, create);
+ ret = ret && ShellUtil::CreateChromeQuickLaunchShortcut(chrome_exe,
+ ShellUtil::CURRENT_USER | ShellUtil::SYSTEM_LEVEL, create);
+ } else {
+ ret = ret && ShellUtil::CreateChromeDesktopShortcut(chrome_exe,
+ ShellUtil::CURRENT_USER, create);
+ ret = ret && ShellUtil::CreateChromeQuickLaunchShortcut(chrome_exe,
+ ShellUtil::CURRENT_USER, create);
+ }
+
+ return ret;
+}
+} // namespace
+
+
+std::wstring installer::GetInstallerPathUnderChrome(
+ const std::wstring& install_path, const std::wstring& new_version) {
+ std::wstring installer_path(install_path);
+ file_util::AppendToPath(&installer_path, new_version);
+ file_util::AppendToPath(&installer_path, installer::kInstallerDir);
+ return installer_path;
+}
+
+
+installer_util::InstallStatus installer::InstallOrUpdateChrome(
+ const std::wstring& exe_path, const std::wstring& archive_path,
+ const std::wstring& install_temp_path, bool system_install,
+ const Version& new_version, const Version* installed_version) {
+
+ std::wstring install_path(GetChromeInstallPath(system_install));
+ if (install_path.empty()) {
+ LOG(ERROR) << "Could not get installation destination path.";
+ InstallUtil::SetInstallerError(system_install,
+ installer_util::INSTALL_FAILED,
+ IDS_INSTALL_FAILED_BASE);
+ return installer_util::INSTALL_FAILED;
+ } else {
+ LOG(INFO) << "install destination path: " << install_path;
+ }
+
+ std::wstring src_path(install_temp_path);
+ file_util::AppendToPath(&src_path, std::wstring(kInstallSourceDir));
+ file_util::AppendToPath(&src_path, std::wstring(kInstallSourceChromeDir));
+
+ HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
+ bool install_success = InstallNewVersion(exe_path, archive_path, src_path,
+ install_path, install_temp_path, reg_root, new_version);
+
+ installer_util::InstallStatus result;
+ if (!install_success) {
+ LOG(ERROR) << "Install failed.";
+ InstallUtil::SetInstallerError(system_install,
+ installer_util::INSTALL_FAILED,
+ IDS_INSTALL_FAILED_BASE);
+ result = installer_util::INSTALL_FAILED;
+ } else {
+ if (!installed_version) {
+ LOG(INFO) << "First install of version " << new_version.GetString();
+ result = installer_util::FIRST_INSTALL_SUCCESS;
+ } else if (new_version.GetString() == installed_version->GetString()) {
+ LOG(INFO) << "Install repaired of version " << new_version.GetString();
+ result = installer_util::INSTALL_REPAIRED;
+ } else if (new_version.IsHigherThan(installed_version)) {
+ LOG(INFO) << "Version updated to " << new_version.GetString();
+ result = installer_util::NEW_VERSION_UPDATED;
+ } else {
+ NOTREACHED();
+ }
+
+ if (!CreateOrUpdateChromeShortcuts(exe_path, system_install, result,
+ install_path, new_version.GetString()))
+ LOG(WARNING) << "Failed to create/update start menu shortcut.";
+
+ if (result == installer_util::FIRST_INSTALL_SUCCESS ||
+ result == installer_util::INSTALL_REPAIRED) {
+ DoFirstInstallTasks(install_path, system_install);
+ } else {
+ RemoveOldVersionDirs(install_path, new_version.GetString());
+ }
+ }
+
+ return result;
+}
+
|