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"
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
),
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
) {
44 LOG(DFATAL
) << "Cannot initialize an AppCommand from an invalid key.";
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
;
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);
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
,
81 google_update::kRegCommandLineField
,
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.
93 item_list
->AddSetRegValueWorkItem(predefined_root
,
97 static_cast<DWORD
>(1),
100 item_list
->AddDeleteRegValueWorkItem(
101 predefined_root
, command_path
, KEY_WOW64_32KEY
, var_name
);
106 } // namespace installer