1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_INSTALLER_UTIL_WORK_ITEM_LIST_H_
#define CHROME_INSTALLER_UTIL_WORK_ITEM_LIST_H_
#include <windows.h>
#include <stdint.h>
#include <list>
#include <memory>
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "chrome/installer/util/work_item.h"
// A WorkItem subclass that recursively contains a list of WorkItems. Thus it
// provides functionalities to carry out or roll back the sequence of actions
// defined by the list of WorkItems it contains.
// The WorkItems are executed in the same order as they are added to the list.
// The "best-effort" flag of the WorkItemList is propagated to the WorkItems
// when it's true. Likewise, the "rollback enabled" flag of the WorkItemList is
// propagated to the WorkItems when it's false.
class WorkItemList : public WorkItem {
public:
~WorkItemList() override;
// Add a WorkItem to the list.
// A WorkItem can only be added to the list before the list's DO() is called.
// Once a WorkItem is added to the list. The list owns the WorkItem.
virtual void AddWorkItem(WorkItem* work_item);
// Add a CallbackWorkItem that invokes a callback.
virtual WorkItem* AddCallbackWorkItem(
base::OnceCallback<bool(const CallbackWorkItem&)> do_action,
base::OnceCallback<void(const CallbackWorkItem&)> rollback_action);
// Add a CopyTreeWorkItem to the list of work items.
// See the NOTE in the documentation for the CopyTreeWorkItem class for
// special considerations regarding |temp_path|.
virtual WorkItem* AddCopyTreeWorkItem(
const base::FilePath& source_path,
const base::FilePath& dest_path,
const base::FilePath& temp_path,
CopyOverWriteOption overwrite_option,
const base::FilePath& alternative_path = base::FilePath());
// Add a CreateDirWorkItem that creates a directory at the given path.
virtual WorkItem* AddCreateDirWorkItem(const base::FilePath& path);
// Add a CreateRegKeyWorkItem that creates a registry key at the given
// path.
virtual WorkItem* AddCreateRegKeyWorkItem(HKEY predefined_root,
const std::wstring& path,
REGSAM wow64_access);
// Add a DeleteRegKeyWorkItem that deletes a registry key from the given
// path.
virtual WorkItem* AddDeleteRegKeyWorkItem(HKEY predefined_root,
const std::wstring& path,
REGSAM wow64_access);
// Add a DeleteRegValueWorkItem that deletes registry value of type REG_SZ
// or REG_DWORD.
virtual WorkItem* AddDeleteRegValueWorkItem(HKEY predefined_root,
const std::wstring& key_path,
REGSAM wow64_access,
const std::wstring& value_name);
// Add a DeleteTreeWorkItem that recursively deletes a file system hierarchy
// at the given root path.
virtual WorkItem* AddDeleteTreeWorkItem(const base::FilePath& root_path,
const base::FilePath& temp_path);
// Add a MoveTreeWorkItem to the list of work items.
virtual WorkItem* AddMoveTreeWorkItem(const base::FilePath& source_path,
const base::FilePath& dest_path,
const base::FilePath& temp_path,
MoveTreeOption duplicate_option);
// Add a SetRegValueWorkItem that sets a registry value with REG_SZ type
// at the key with specified path.
virtual WorkItem* AddSetRegValueWorkItem(HKEY predefined_root,
const std::wstring& key_path,
REGSAM wow64_access,
const std::wstring& value_name,
const std::wstring& value_data,
bool overwrite);
// Add a SetRegValueWorkItem that sets a registry value with REG_DWORD type
// at the key with specified path.
virtual WorkItem* AddSetRegValueWorkItem(HKEY predefined_root,
const std::wstring& key_path,
REGSAM wow64_access,
const std::wstring& value_name,
DWORD value_data,
bool overwrite);
// Add a SetRegValueWorkItem that sets a registry value with REG_QWORD type
// at the key with specified path.
virtual WorkItem* AddSetRegValueWorkItem(HKEY predefined_root,
const std::wstring& key_path,
REGSAM wow64_access,
const std::wstring& value_name,
int64_t value_data,
bool overwrite);
// Add a SetRegValueWorkItem that sets a registry value based on the value
// provided by |get_value_callback| given the existing value under
// |key_path\value_name|.
virtual WorkItem* AddSetRegValueWorkItem(
HKEY predefined_root,
const std::wstring& key_path,
REGSAM wow64_access,
const std::wstring& value_name,
WorkItem::GetValueFromExistingCallback get_value_callback);
protected:
friend class WorkItem;
typedef std::list<raw_ptr<WorkItem, CtnExperimental>> WorkItems;
typedef WorkItems::iterator WorkItemIterator;
WorkItemList();
// WorkItem:
// Execute the WorkItems in the same order as they are added to the list. It
// aborts as soon as one WorkItem fails, unless the best-effort flag is true.
bool DoImpl() override;
// Rollback the WorkItems in the reverse order as they are executed.
void RollbackImpl() override;
// The list of WorkItems, in the order of them being added.
WorkItems list_;
// The list of executed WorkItems, in the reverse order of them being
// executed.
WorkItems executed_list_;
};
#endif // CHROME_INSTALLER_UTIL_WORK_ITEM_LIST_H_
|