Android: Get rid of extra dup()s on launching child processes
[chromium-blink-merge.git] / chrome / installer / util / app_command.cc
blob0d6be906888589ab5d11b97c33324ab3c8bbcdcf
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/installer/util/app_command.h"
7 #include "base/logging.h"
8 #include "base/win/registry.h"
9 #include "chrome/installer/util/google_update_constants.h"
10 #include "chrome/installer/util/work_item_list.h"
12 namespace installer {
14 // static
15 // Associate bool member variables with registry entries.
16 const AppCommand::NamedBoolVar AppCommand::kNameBoolVars[] = {
17 {&AppCommand::sends_pings_,
18 google_update::kRegSendsPingsField},
19 {&AppCommand::is_web_accessible_,
20 google_update::kRegWebAccessibleField},
21 {&AppCommand::is_auto_run_on_os_upgrade_,
22 google_update::kRegAutoRunOnOSUpgradeField},
23 {&AppCommand::is_run_as_user_,
24 google_update::kRegRunAsUserField},
27 AppCommand::AppCommand()
28 : sends_pings_(false),
29 is_web_accessible_(false),
30 is_auto_run_on_os_upgrade_(false),
31 is_run_as_user_(false) {
34 AppCommand::AppCommand(const base::string16& command_line)
35 : command_line_(command_line),
36 sends_pings_(false),
37 is_web_accessible_(false),
38 is_auto_run_on_os_upgrade_(false),
39 is_run_as_user_(false) {
42 bool AppCommand::Initialize(const base::win::RegKey& key) {
43 if (!key.Valid()) {
44 LOG(DFATAL) << "Cannot initialize an AppCommand from an invalid key.";
45 return false;
48 LONG result = ERROR_SUCCESS;
49 base::string16 cmd_line;
51 result = key.ReadValue(google_update::kRegCommandLineField, &cmd_line);
52 if (result != ERROR_SUCCESS) {
53 LOG(WARNING) << "Error reading " << google_update::kRegCommandLineField
54 << " value from registry: " << result;
55 return false;
58 command_line_.swap(cmd_line);
60 for (int i = 0; i < arraysize(kNameBoolVars); ++i) {
61 DWORD value = 0; // Set default to false.
62 // Note: ReadValueDW only modifies out param on success.
63 key.ReadValueDW(kNameBoolVars[i].name, &value);
64 this->*(kNameBoolVars[i].data) = (value != 0);
67 return true;
70 void AppCommand::AddWorkItems(HKEY predefined_root,
71 const base::string16& command_path,
72 WorkItemList* item_list) const {
73 // Command_path is derived from GetRegCommandKey which always returns
74 // value from GetVersionKey() which should be 32-bit hive.
75 item_list->AddCreateRegKeyWorkItem(
76 predefined_root, command_path, KEY_WOW64_32KEY)
77 ->set_log_message("creating AppCommand registry key");
78 item_list->AddSetRegValueWorkItem(predefined_root,
79 command_path,
80 KEY_WOW64_32KEY,
81 google_update::kRegCommandLineField,
82 command_line_,
83 true)
84 ->set_log_message("setting AppCommand CommandLine registry value");
86 for (int i = 0; i < arraysize(kNameBoolVars); ++i) {
87 const wchar_t* var_name = kNameBoolVars[i].name;
88 bool var_data = this->*(kNameBoolVars[i].data);
90 // Adds a work item to set |var_name| to DWORD 1 if |var_data| is true;
91 // adds a work item to remove |var_name| otherwise.
92 if (var_data) {
93 item_list->AddSetRegValueWorkItem(predefined_root,
94 command_path,
95 KEY_WOW64_32KEY,
96 var_name,
97 static_cast<DWORD>(1),
98 true);
99 } else {
100 item_list->AddDeleteRegValueWorkItem(
101 predefined_root, command_path, KEY_WOW64_32KEY, var_name);
106 } // namespace installer