set_reg_value_work_item.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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)#ifndef CHROME_INSTALLER_UTIL_SET_REG_VALUE_WORK_ITEM_H__
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_INSTALLER_UTIL_SET_REG_VALUE_WORK_ITEM_H__
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/work_item.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A WorkItem subclass that sets a registry value with REG_SZ, REG_DWORD, or
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// REG_QWORD type at the specified path. The value is only set if the target key
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exists.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SetRegValueWorkItem : public WorkItem {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SetRegValueWorkItem();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Do();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Rollback();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class WorkItem;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum SettingStatus {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The status before Do is called.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SET_VALUE,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // One possible outcome after Do(). A new value is created under the key.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NEW_VALUE_CREATED,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // One possible outcome after Do(). The previous value under the key has
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // been overwritten.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALUE_OVERWRITTEN,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // One possible outcome after Do(). No change is applied, either
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // because we are not allowed to overwrite the previous value, or due to
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // some errors like the key does not exist.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALUE_UNCHANGED,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The status after Do and Rollback is called.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VALUE_ROLL_BACK
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetRegValueWorkItem(HKEY predefined_root,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::wstring& key_path,
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      REGSAM wow64_access,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::wstring& value_name,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::wstring& value_data,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool overwrite);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetRegValueWorkItem(HKEY predefined_root,
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::wstring& key_path,
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      REGSAM wow64_access,
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::wstring& value_name,
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      DWORD value_data,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool overwrite);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetRegValueWorkItem(HKEY predefined_root,
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::wstring& key_path,
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      REGSAM wow64_access,
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      const std::wstring& value_name,
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                      int64 value_data,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bool overwrite);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Root key of the target key under which the value is set. The root key can
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // only be one of the predefined keys on Windows.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HKEY predefined_root_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path of the target key under which the value is set.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring key_path_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Name of the value to be set.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::wstring value_name_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether to overwrite the existing value under the target key.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool overwrite_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Whether to force 32-bit or 64-bit view of the target key.
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  REGSAM wow64_access_;
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Type of data to store
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD type_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<uint8> value_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD previous_type_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<uint8> previous_value_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettingStatus status_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_INSTALLER_UTIL_SET_REG_VALUE_WORK_ITEM_H__
92