// Copyright (c) 2012 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. // // This file declares util functions for setup project. It also declares a // few functions that the Chrome component updater uses for patching binary // deltas. #ifndef CHROME_INSTALLER_SETUP_SETUP_UTIL_H_ #define CHROME_INSTALLER_SETUP_SETUP_UTIL_H_ #include <windows.h> #include "base/basictypes.h" #include "base/strings/string16.h" #include "base/win/scoped_handle.h" #include "chrome/installer/util/browser_distribution.h" #include "chrome/installer/util/util_constants.h" namespace base { class CommandLine; class FilePath; class Version; } namespace installer { class InstallationState; class InstallerState; class ProductState; // Applies a patch file to source file using Courgette. Returns 0 in case of // success. In case of errors, it returns kCourgetteErrorOffset + a Courgette // status code, as defined in courgette/courgette.h int CourgettePatchFiles(const base::FilePath& src, const base::FilePath& patch, const base::FilePath& dest); // Applies a patch file to source file using bsdiff. This function uses // Courgette's flavor of bsdiff. Returns 0 in case of success, or // kBsdiffErrorOffset + a bsdiff status code in case of errors. // See courgette/third_party/bsdiff.h for details. int BsdiffPatchFiles(const base::FilePath& src, const base::FilePath& patch, const base::FilePath& dest); // Find the version of Chrome from an install source directory. // Chrome_path should contain at least one version folder. // Returns the maximum version found or NULL if no version is found. Version* GetMaxVersionFromArchiveDir(const base::FilePath& chrome_path); // Returns the uncompressed archive of the installed version that serves as the // source for patching. base::FilePath FindArchiveToPatch(const InstallationState& original_state, const InstallerState& installer_state); // Spawns a new process that waits for a specified amount of time before // attempting to delete |path|. This is useful for setup to delete the // currently running executable or a file that we cannot close right away but // estimate that it will be possible after some period of time. // Returns true if a new process was started, false otherwise. Note that // given the nature of this function, it is not possible to know if the // delete operation itself succeeded. bool DeleteFileFromTempProcess(const base::FilePath& path, uint32 delay_before_delete_ms); // Returns true and populates |setup_exe| with the path to an existing product // installer if one is found that is newer than the currently running installer // (|installer_version|). bool GetExistingHigherInstaller(const InstallationState& original_state, bool system_install, const base::Version& installer_version, base::FilePath* setup_exe); // Invokes the pre-existing |setup_exe| to handle the current operation (as // dictated by |command_line|). An installerdata file, if specified, is first // unconditionally copied into place so that it will be in effect in case the // invoked |setup_exe| runs the newly installed product prior to exiting. // Returns true if |setup_exe| was launched, false otherwise. bool DeferToExistingInstall(const base::FilePath& setup_exe, const base::CommandLine& command_line, const InstallerState& installer_state, const base::FilePath& temp_path, InstallStatus* install_status); // Returns true if the product |type| will be installed after the current // setup.exe instance have carried out installation / uninstallation, at // the level specified by |installer_state|. // This function only returns meaningful results for install and update // operations if called after CheckPreInstallConditions (see setup_main.cc). bool WillProductBePresentAfterSetup( const installer::InstallerState& installer_state, const installer::InstallationState& machine_state, BrowserDistribution::Type type); // Drops the process down to background processing mode on supported OSes if it // was launched below the normal process priority. Returns true when background // procesing mode is entered. bool AdjustProcessPriority(); // Makes registry adjustments to migrate the Google Update state of |to_migrate| // from multi-install to single-install. This includes copying the usagestats // value and adjusting the ap values of all multi-install products. void MigrateGoogleUpdateStateMultiToSingle( bool system_level, BrowserDistribution::Type to_migrate, const installer::InstallationState& machine_state); // Returns true if |install_status| represents a successful uninstall code. bool IsUninstallSuccess(InstallStatus install_status); // Returns true if |cmd_line| contains unsupported (legacy) switches. bool ContainsUnsupportedSwitch(const base::CommandLine& cmd_line); // Returns true if the processor is supported by chrome. bool IsProcessorSupported(); // This class will enable the privilege defined by |privilege_name| on the // current process' token. The privilege will be disabled upon the // ScopedTokenPrivilege's destruction (unless it was already enabled when the // ScopedTokenPrivilege object was constructed). // Some privileges might require admin rights to be enabled (check is_enabled() // to know whether |privilege_name| was successfully enabled). class ScopedTokenPrivilege { public: explicit ScopedTokenPrivilege(const wchar_t* privilege_name); ~ScopedTokenPrivilege(); // Always returns true unless the privilege could not be enabled. bool is_enabled() const { return is_enabled_; } private: // Always true unless the privilege could not be enabled. bool is_enabled_; // A scoped handle to the current process' token. This will be closed // preemptively should enabling the privilege fail in the constructor. base::win::ScopedHandle token_; // The previous state of the privilege this object is responsible for. As set // by AdjustTokenPrivileges() upon construction. TOKEN_PRIVILEGES previous_privileges_; DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedTokenPrivilege); }; } // namespace installer #endif // CHROME_INSTALLER_SETUP_SETUP_UTIL_H_