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