From f41da18890d075d126fbef0fc1f4e5b973d2d802 Mon Sep 17 00:00:00 2001 From: "vitalybuka@chromium.org" Date: Tue, 23 Apr 2013 05:48:38 +0000 Subject: Moved more installer related code to cloud_print/common. R=gene Review URL: https://chromiumcodereview.appspot.com/14358018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195734 0039d316-1c4b-4281-b951-d872f2087c98 --- cloud_print/cloud_print.gyp | 11 ------- cloud_print/common/common.gyp | 21 +++++++++++++ cloud_print/common/win/install_utils.cc | 35 +++++++++++++++++++++- cloud_print/common/win/install_utils.h | 6 ++++ cloud_print/service/service.gyp | 1 + cloud_print/virtual_driver/win/install/setup.cc | 33 +------------------- .../win/install/virtual_driver_install.gyp | 2 +- 7 files changed, 64 insertions(+), 45 deletions(-) create mode 100644 cloud_print/common/common.gyp (limited to 'cloud_print') diff --git a/cloud_print/cloud_print.gyp b/cloud_print/cloud_print.gyp index d5740bd..561a51d 100644 --- a/cloud_print/cloud_print.gyp +++ b/cloud_print/cloud_print.gyp @@ -105,16 +105,5 @@ }, }, }, - { - 'target_name': 'cloud_print_install_lib', - 'type': 'static_library', - 'dependencies': [ - '<(DEPTH)/base/base.gyp:base', - ], - 'sources': [ - '<(DEPTH)/cloud_print/common/win/install_utils.cc', - '<(DEPTH)/cloud_print/common/win/install_utils.h', - ], - }, ], } diff --git a/cloud_print/common/common.gyp b/cloud_print/common/common.gyp new file mode 100644 index 0000000..6d33c08 --- /dev/null +++ b/cloud_print/common/common.gyp @@ -0,0 +1,21 @@ +# Copyright 2013 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. +{ + 'variables': { + 'chromium_code': 1, + }, + 'targets': [ + { + 'target_name': 'cloud_print_install_lib', + 'type': 'static_library', + 'dependencies': [ + '<(DEPTH)/base/base.gyp:base', + ], + 'sources': [ + '<(DEPTH)/cloud_print/common/win/install_utils.cc', + '<(DEPTH)/cloud_print/common/win/install_utils.h', + ], + }, + ], +} diff --git a/cloud_print/common/win/install_utils.cc b/cloud_print/common/win/install_utils.cc index 2fdf718..15c55b2 100644 --- a/cloud_print/common/win/install_utils.cc +++ b/cloud_print/common/win/install_utils.cc @@ -7,9 +7,11 @@ #include #include "base/command_line.h" +#include "base/file_util.h" #include "base/file_version_info_win.h" #include "base/files/file_path.h" #include "base/path_service.h" +#include "base/process_util.h" #include "base/win/registry.h" namespace cloud_print { @@ -30,7 +32,9 @@ const wchar_t kRegValueInstallerResultUIString[] = L"InstallerResultUIString"; const wchar_t kUninstallKey[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"; const wchar_t kInstallLocation[] = L"InstallLocation"; +const wchar_t kUninstallString[] = L"UninstallString"; const wchar_t kDisplayVersion[] = L"DisplayVersion"; +const wchar_t kDisplayIcon[] = L"DisplayIcon"; const wchar_t kDisplayName[] = L"DisplayName"; const wchar_t kPublisher[] = L"Publisher"; const wchar_t kNoModify[] = L"NoModify"; @@ -118,7 +122,7 @@ void CreateUninstallKey(const string16& uninstall_id, CommandLine uninstall_command(unstall_binary); uninstall_command.AppendSwitch(uninstall_switch); - key.WriteValue(kUninstallKey, + key.WriteValue(kUninstallString, uninstall_command.GetCommandLineString().c_str()); key.WriteValue(kInstallLocation, unstall_binary.DirName().value().c_str()); @@ -137,6 +141,7 @@ void CreateUninstallKey(const string16& uninstall_id, LOG(ERROR) << "Unable to get version string"; } key.WriteValue(kDisplayName, product_name.c_str()); + key.WriteValue(kDisplayIcon, unstall_binary.value().c_str()); key.WriteValue(kNoModify, 1); key.WriteValue(kNoRepair, 1); } @@ -159,5 +164,33 @@ base::FilePath GetInstallLocation(const string16& uninstall_id) { return base::FilePath(install_path_value); } +void DeleteProgramDir(const std::string& delete_switch) { + base::FilePath installer_source; + if (!PathService::Get(base::FILE_EXE, &installer_source)) + return; + // Deletes only subdirs of program files. + if (!IsProgramsFilesParent(installer_source)) + return; + base::FilePath temp_path; + if (!file_util::CreateTemporaryFile(&temp_path)) + return; + file_util::CopyFile(installer_source, temp_path); + file_util::DeleteAfterReboot(temp_path); + CommandLine command_line(temp_path); + command_line.AppendSwitchPath(delete_switch, installer_source.DirName()); + base::LaunchOptions options; + base::ProcessHandle process_handle; + if (!base::LaunchProcess(command_line, options, &process_handle)) { + LOG(ERROR) << "Unable to launch child uninstall."; + } +} + +bool IsProgramsFilesParent(const base::FilePath& path) { + base::FilePath program_files; + if (!PathService::Get(base::DIR_PROGRAM_FILESX86, &program_files)) + return false; + return program_files.IsParent(path); +} + } // namespace cloud_print diff --git a/cloud_print/common/win/install_utils.h b/cloud_print/common/win/install_utils.h index 054e787..e4387d4 100644 --- a/cloud_print/common/win/install_utils.h +++ b/cloud_print/common/win/install_utils.h @@ -34,6 +34,12 @@ void DeleteUninstallKey(const string16& uninstall_id); // Returns install location retrieved from control panel uninstall key. base::FilePath GetInstallLocation(const string16& uninstall_id); +// Returns install location retrieved from control panel uninstall key. +void DeleteProgramDir(const std::string& delete_switch); + +// Returns true if path is part of program files. +bool IsProgramsFilesParent(const base::FilePath& path); + } // namespace cloud_print #endif // CLOUD_PRINT_COMMON_INSTALL_UTILS_H_ diff --git a/cloud_print/service/service.gyp b/cloud_print/service/service.gyp index 7cbde1b..9b5bb5bef 100644 --- a/cloud_print/service/service.gyp +++ b/cloud_print/service/service.gyp @@ -127,6 +127,7 @@ 'win/service_resources.gypi' ], 'dependencies': [ + '<(DEPTH)/cloud_print/common/common.gyp:cloud_print_install_lib', 'cloud_print_service_lib', ], 'msvs_settings': { diff --git a/cloud_print/virtual_driver/win/install/setup.cc b/cloud_print/virtual_driver/win/install/setup.cc index fbc297e..4cde7a9 100644 --- a/cloud_print/virtual_driver/win/install/setup.cc +++ b/cloud_print/virtual_driver/win/install/setup.cc @@ -453,44 +453,13 @@ HRESULT UnregisterVirtualDriver() { return hr; } -HRESULT DeleteProgramDir(const base::FilePath& installer_source, bool wait) { - base::FilePath temp_path; - if (file_util::CreateTemporaryFile(&temp_path)) { - file_util::CopyFile(installer_source, temp_path); - file_util::DeleteAfterReboot(temp_path); - CommandLine command_line(temp_path); - command_line.AppendSwitchPath(kDelete, installer_source.DirName()); - base::LaunchOptions options; - options.wait = wait; - base::ProcessHandle process_handle; - if (!base::LaunchProcess(command_line, options, &process_handle)) { - LOG(ERROR) << "Unable to launch child uninstall."; - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - } - if (wait) { - int exit_code = -1; - base::TerminationStatus status = - base::GetTerminationStatus(process_handle, &exit_code); - if (status == base::TERMINATION_STATUS_NORMAL_TERMINATION) { - return exit_code; - } else { - LOG(ERROR) << "Improper termination of uninstall. " << status; - return E_FAIL; - } - } - } - return S_OK; -} - HRESULT DoUninstall() { DeleteGoogleUpdateKeys(kGoogleUpdateProductId); HRESULT result = UnregisterVirtualDriver(); if (FAILED(result)) return result; DeleteUninstallKey(kUninstallId); - base::FilePath installer_source; - if (PathService::Get(base::FILE_EXE, &installer_source)) - return DeleteProgramDir(installer_source, false); + DeleteProgramDir(kDelete); return S_OK; } diff --git a/cloud_print/virtual_driver/win/install/virtual_driver_install.gyp b/cloud_print/virtual_driver/win/install/virtual_driver_install.gyp index 35c2b66..6180806 100644 --- a/cloud_print/virtual_driver/win/install/virtual_driver_install.gyp +++ b/cloud_print/virtual_driver/win/install/virtual_driver_install.gyp @@ -22,7 +22,7 @@ 'dependencies': [ '../virtual_driver.gyp:virtual_driver_lib', '<(DEPTH)/base/base.gyp:base', - '<(DEPTH)/cloud_print/cloud_print.gyp:cloud_print_install_lib', + '<(DEPTH)/cloud_print/common/common.gyp:cloud_print_install_lib', '<(DEPTH)/cloud_print/cloud_print.gyp:cloud_print_version_resources', 'virtual_driver_setup_resources', ], -- cgit v1.1