15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/app_command.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_constants.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/work_item_list.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace installer { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Associate bool member variables with registry entries. 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const AppCommand::NamedBoolVar AppCommand::kNameBoolVars[] = { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {&AppCommand::sends_pings_, 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_update::kRegSendsPingsField}, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {&AppCommand::is_web_accessible_, 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_update::kRegWebAccessibleField}, 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {&AppCommand::is_auto_run_on_os_upgrade_, 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_update::kRegAutoRunOnOSUpgradeField}, 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {&AppCommand::is_run_as_user_, 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) google_update::kRegRunAsUserField}, 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCommand::AppCommand() 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : sends_pings_(false), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_web_accessible_(false), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_auto_run_on_os_upgrade_(false), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_run_as_user_(false) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCommand::AppCommand(const string16& command_line) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : command_line_(command_line), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sends_pings_(false), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_web_accessible_(false), 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_auto_run_on_os_upgrade_(false), 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_run_as_user_(false) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCommand::Initialize(const base::win::RegKey& key) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!key.Valid()) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(DFATAL) << "Cannot initialize an AppCommand from an invalid key."; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG result = ERROR_SUCCESS; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 cmd_line; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = key.ReadValue(google_update::kRegCommandLineField, &cmd_line); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != ERROR_SUCCESS) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Error reading " << google_update::kRegCommandLineField 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " value from registry: " << result; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line_.swap(cmd_line); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < arraysize(kNameBoolVars); ++i) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DWORD value = 0; // Set default to false. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note: ReadValueDW only modifies out param on success. 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key.ReadValueDW(kNameBoolVars[i].name, &value); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this->*(kNameBoolVars[i].data) = (value != 0); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCommand::AddWorkItems(HKEY predefined_root, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& command_path, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WorkItemList* item_list) const { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item_list->AddCreateRegKeyWorkItem(predefined_root, command_path) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ->set_log_message("creating AppCommand registry key"); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item_list->AddSetRegValueWorkItem(predefined_root, command_path, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_update::kRegCommandLineField, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line_, true) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ->set_log_message("setting AppCommand CommandLine registry value"); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < arraysize(kNameBoolVars); ++i) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const wchar_t* var_name = kNameBoolVars[i].name; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool var_data = this->*(kNameBoolVars[i].data); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Adds a work item to set |var_name| to DWORD 1 if |var_data| is true; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // adds a work item to remove |var_name| otherwise. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (var_data) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_list->AddSetRegValueWorkItem(predefined_root, 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_path, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var_name, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<DWORD>(1), 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) item_list->AddDeleteRegValueWorkItem(predefined_root, 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_path, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var_name); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace installer 101