Chromium Code Reviews| Index: chrome/installer/mini_installer/mini_installer.cc |
| diff --git a/chrome/installer/mini_installer/mini_installer.cc b/chrome/installer/mini_installer/mini_installer.cc |
| index 8709455309daf2bd22cc95827ea3688f70241348..495c8381037408482509ed41b35c0e3ba8841ba6 100644 |
| --- a/chrome/installer/mini_installer/mini_installer.cc |
| +++ b/chrome/installer/mini_installer/mini_installer.cc |
| @@ -27,12 +27,14 @@ |
| #include "chrome/installer/mini_installer/appid.h" |
| #include "chrome/installer/mini_installer/configuration.h" |
| #include "chrome/installer/mini_installer/decompress.h" |
| -#include "chrome/installer/mini_installer/mini_installer.h" |
| +#include "chrome/installer/mini_installer/exit_code.h" |
| +#include "chrome/installer/mini_installer/mini_installer_constants.h" |
| #include "chrome/installer/mini_installer/mini_string.h" |
| #include "chrome/installer/mini_installer/pe_resource.h" |
| namespace mini_installer { |
| +typedef DWORD ProcessExitCode; |
| typedef StackString<MAX_PATH> PathString; |
| typedef StackString<MAX_PATH * 4> CommandString; |
| @@ -143,7 +145,7 @@ bool ReadValueFromRegistry(HKEY root_key, const wchar_t *sub_key, |
| bool OpenClientStateKey(HKEY root_key, const wchar_t* app_guid, REGSAM access, |
| RegKey* key) { |
| PathString client_state_key; |
| - return client_state_key.assign(kApRegistryKeyBase) && |
| + return client_state_key.assign(kClientStateKeyBase) && |
| client_state_key.append(app_guid) && |
| (key->Open(root_key, |
| client_state_key.get(), |
| @@ -184,7 +186,7 @@ void SetInstallerFlags(const Configuration& configuration) { |
| if (configuration.is_multi_install()) { |
| if (OpenClientStateKey(root_key, app_guid, key_access, &key)) { |
| // The product has a client state key. See if it's a single-install. |
| - ret = key.ReadValue(kApRegistryValueName, value.get(), value.capacity()); |
| + ret = key.ReadValue(kApRegistryValue, value.get(), value.capacity()); |
| if (ret != ERROR_FILE_NOT_FOUND && |
| (ret != ERROR_SUCCESS || |
| FindTagInStr(value.get(), kMultiInstallTag, NULL))) { |
| @@ -204,7 +206,7 @@ void SetInstallerFlags(const Configuration& configuration) { |
| return; |
| value.clear(); |
| - ret = key.ReadValue(kApRegistryValueName, value.get(), value.capacity()); |
| + ret = key.ReadValue(kApRegistryValue, value.get(), value.capacity()); |
| } |
| // The conditions below are handling two cases: |
| @@ -218,7 +220,7 @@ void SetInstallerFlags(const Configuration& configuration) { |
| if (!StrEndsWith(value.get(), kFullInstallerSuffix) && |
| value.append(kFullInstallerSuffix)) { |
| - key.WriteValue(kApRegistryValueName, value.get()); |
| + key.WriteValue(kApRegistryValue, value.get()); |
| } |
| } |
| } |
| @@ -232,7 +234,7 @@ bool GetSetupExePathForGuidFromRegistry(bool system_level, |
| const HKEY root_key = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| RegKey key; |
| return OpenClientStateKey(root_key, app_guid, KEY_QUERY_VALUE, &key) && |
| - (key.ReadValue(kUninstallRegistryValueName, path, size) == ERROR_SUCCESS); |
| + (key.ReadValue(kUninstallRegistryValue, path, size) == ERROR_SUCCESS); |
| } |
| // Gets the setup.exe path from Registry by looking the value of Uninstall |
| @@ -269,10 +271,11 @@ bool GetSetupExePathFromRegistry(const Configuration& configuration, |
| return false; |
| } |
| -// Calls CreateProcess with good default parameters and waits for the process |
| -// to terminate returning the process exit code. |
| +// Calls CreateProcess with good default parameters and waits for the process to |
| +// terminate returning the process exit code. |exit_code|, if non-NULL, is |
| +// populated with the process exit code. |
| bool RunProcessAndWait(const wchar_t* exe_path, wchar_t* cmdline, |
| - int* exit_code) { |
| + ProcessExitCode* exit_code) { |
| STARTUPINFOW si = {sizeof(si)}; |
| PROCESS_INFORMATION pi = {0}; |
| if (!::CreateProcess(exe_path, cmdline, NULL, NULL, FALSE, CREATE_NO_WINDOW, |
| @@ -287,10 +290,8 @@ bool RunProcessAndWait(const wchar_t* exe_path, wchar_t* cmdline, |
| if (WAIT_OBJECT_0 != wr) { |
| ret = false; |
| } else if (exit_code) { |
| - if (!::GetExitCodeProcess(pi.hProcess, |
| - reinterpret_cast<DWORD*>(exit_code))) { |
| + if (!::GetExitCodeProcess(pi.hProcess, exit_code)) |
| ret = false; |
| - } |
| } |
| ::CloseHandle(pi.hProcess); |
| @@ -352,7 +353,7 @@ BOOL CALLBACK OnResourceFound(HMODULE module, const wchar_t* type, |
| !resource.WriteToDisk(full_path.get())) |
| return FALSE; |
| - if (StrStartsWith(name, kChromePrefix)) { |
| + if (StrStartsWith(name, kChromeArchivePrefix)) { |
| if (!ctx->chrome_resource_path->assign(full_path.get())) |
| return FALSE; |
| } else if (StrStartsWith(name, kSetupPrefix)) { |
| @@ -382,7 +383,7 @@ bool UnpackBinaryResources(const Configuration& configuration, HMODULE module, |
| // Generate the setup.exe path where we patch/uncompress setup resource. |
| PathString setup_dest_path; |
| if (!setup_dest_path.assign(base_path) || |
| - !setup_dest_path.append(kSetupName)) |
| + !setup_dest_path.append(kSetupExe)) |
| return false; |
| // Prepare the input to OnResourceFound method that needs a location where |
| @@ -408,10 +409,11 @@ bool UnpackBinaryResources(const Configuration& configuration, HMODULE module, |
| bool success = true; |
| if (!GetSetupExePathFromRegistry(configuration, cmd_line.get(), |
| cmd_line.capacity()) || |
| + !cmd_line.append(L" --") || |
| !cmd_line.append(kCmdUpdateSetupExe) || |
| !cmd_line.append(L"=\"") || |
| !cmd_line.append(setup_path->get()) || |
| - !cmd_line.append(L"\"") || |
| + !cmd_line.append(L"\" --") || |
| !cmd_line.append(kCmdNewSetupExe) || |
| !cmd_line.append(L"=\"") || |
| !cmd_line.append(setup_dest_path.get()) || |
| @@ -425,10 +427,10 @@ bool UnpackBinaryResources(const Configuration& configuration, HMODULE module, |
| // installer results for consumption by Google Update. |
| AppendCommandLineFlags(configuration, &cmd_line); |
| - int exit_code = 0; |
| + ProcessExitCode exit_code = SUCCESS_EXIT_CODE; |
| if (success && |
| (!RunProcessAndWait(NULL, cmd_line.get(), &exit_code) || |
| - exit_code != ERROR_SUCCESS)) { |
| + exit_code != SUCCESS_EXIT_CODE)) { |
| success = false; |
| } |
| @@ -487,7 +489,7 @@ bool UnpackBinaryResources(const Configuration& configuration, HMODULE module, |
| // Executes setup.exe, waits for it to finish and returns the exit code. |
| bool RunSetup(const Configuration& configuration, const wchar_t* archive_path, |
| - const wchar_t* setup_path, int* exit_code) { |
| + const wchar_t* setup_path, ProcessExitCode* exit_code) { |
| // There could be three full paths in the command line for setup.exe (path |
| // to exe itself, path to archive and path to log file), so we declare |
| // total size as three + one additional to hold command line options. |
| @@ -505,7 +507,8 @@ bool RunSetup(const Configuration& configuration, const wchar_t* archive_path, |
| } |
| // Append the command line param for chrome archive file |
| - if (!cmd_line.append(kCmdInstallArchive) || |
| + if (!cmd_line.append(L" --") || |
| + !cmd_line.append(kCmdInstallArchive) || |
| !cmd_line.append(L"=\"") || |
| !cmd_line.append(archive_path) || |
| !cmd_line.append(L"\"")) |
| @@ -714,14 +717,14 @@ void DeleteOldChromeTempDirectories() { |
| // required actions taken. The installer must exit and return the returned |
| // |exit_code|. |
| bool ProcessNonInstallOperations(const Configuration& configuration, |
| - int* exit_code) { |
| + ProcessExitCode* exit_code) { |
| bool ret = false; |
| switch (configuration.operation()) { |
| case Configuration::CLEANUP: |
| // Cleanup has already taken place in DeleteOldChromeTempDirectories at |
| // this point, so just tell our caller to exit early. |
| - *exit_code = 0; |
| + *exit_code = SUCCESS_EXIT_CODE; |
| ret = true; |
| break; |
| @@ -741,8 +744,7 @@ bool ProcessNonInstallOperations(const Configuration& configuration, |
| bool ShouldDeleteExtractedFiles() { |
| wchar_t value[2] = {0}; |
| if (ReadValueFromRegistry(HKEY_CURRENT_USER, kCleanupRegistryKey, |
| - kCleanupRegistryValueName, value, |
| - arraysize(value)) && |
| + kCleanupRegistryValue, value, arraysize(value)) && |
| value[0] == L'0') { |
| return false; |
| } |
| @@ -752,7 +754,7 @@ bool ShouldDeleteExtractedFiles() { |
| // Main function. First gets a working dir, unpacks the resources and finally |
| // executes setup.exe to do the install/upgrade. |
| -int WMain(HMODULE module) { |
| +ProcessExitCode WMain(HMODULE module) { |
| #if defined(COMPONENT_BUILD) |
| if (::GetEnvironmentVariable(L"MINI_INSTALLER_TEST", NULL, 0) == 0) { |
| static const wchar_t kComponentBuildIncompatibleMessage[] = |
| @@ -760,7 +762,7 @@ int WMain(HMODULE module) { |
| L" run setup.exe with the same command line instead. See" |
| L" http://crbug.com/127233#c17 for details."; |
| ::MessageBox(NULL, kComponentBuildIncompatibleMessage, NULL, MB_ICONERROR); |
| - return 1; |
| + return GENERIC_ERROR; |
| } |
| #endif |
| @@ -772,7 +774,7 @@ int WMain(HMODULE module) { |
| // TODO(grt): Make the exit codes more granular so we know where the popular |
| // errors truly are. |
| - int exit_code = 101; |
| + ProcessExitCode exit_code = GENERIC_INITIALIZATION_FAILURE; |
| // Parse the command line. |
| Configuration configuration; |
| @@ -780,13 +782,13 @@ int WMain(HMODULE module) { |
| return exit_code; |
| if (configuration.query_component_build()) { |
| - // Exit immediately with an exit code of 1 to indicate component build and 0 |
| - // to indicate static build. This is used by the tests in |
| - // /src/chrome/test/mini_installer/. |
| + // Exit immediately with a generic failure exit code (1) to indicate |
| + // component build and a generic success exit code (0) to indicate static |
| + // build. This is used by the tests in /src/chrome/test/mini_installer/. |
|
gab
2014/07/07 15:00:18
So when someone "queries for component build", we
grt (UTC plus 2)
2014/07/08 14:02:19
While being delusional in the sick bed yesterday,
|
| #if defined(COMPONENT_BUILD) |
| - return 1; |
| + return GENERIC_ERROR; |
| #else |
| - return 0; |
| + return SUCCESS_EXIT_CODE; |
| #endif |
| } |
| @@ -798,7 +800,7 @@ int WMain(HMODULE module) { |
| // First get a path where we can extract payload |
| PathString base_path; |
| if (!GetWorkDir(module, &base_path)) |
| - return 101; |
| + return GENERIC_INITIALIZATION_FAILURE; |
| #if defined(GOOGLE_CHROME_BUILD) |
| // Set the magic suffix in registry to try full installer next time. We ignore |
| @@ -812,7 +814,7 @@ int WMain(HMODULE module) { |
| PathString setup_path; |
| if (!UnpackBinaryResources(configuration, module, base_path.get(), |
| &archive_path, &setup_path)) { |
| - exit_code = 102; |
| + exit_code = GENERIC_UNPACKING_FAILURE; |
| } else { |
| // While unpacking the binaries, we paged in a whole bunch of memory that |
| // we don't need anymore. Let's give it back to the pool before running |
| @@ -820,7 +822,7 @@ int WMain(HMODULE module) { |
| ::SetProcessWorkingSetSize(::GetCurrentProcess(), -1, -1); |
| if (!RunSetup(configuration, archive_path.get(), setup_path.get(), |
| &exit_code)) { |
| - exit_code = 103; |
| + exit_code = GENERIC_SETUP_FAILURE; |
| } |
| } |
| @@ -833,7 +835,8 @@ int WMain(HMODULE module) { |
| } // namespace mini_installer |
| int MainEntryPoint() { |
| - int result = mini_installer::WMain(::GetModuleHandle(NULL)); |
| + mini_installer::ProcessExitCode result = |
| + mini_installer::WMain(::GetModuleHandle(NULL)); |
| ::ExitProcess(result); |
| } |