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 // Base class for managing an action of a sequence of actions to be carried
6 // out during install/update/uninstall. Supports rollback of actions if this
9 #ifndef CHROME_INSTALLER_UTIL_WORK_ITEM_H_
10 #define CHROME_INSTALLER_UTIL_WORK_ITEM_H_
17 #include "base/basictypes.h"
18 #include "base/callback_forward.h"
20 class CallbackWorkItem
;
21 class CopyRegKeyWorkItem
;
22 class CopyTreeWorkItem
;
23 class CreateDirWorkItem
;
24 class CreateRegKeyWorkItem
;
25 class DeleteTreeWorkItem
;
26 class DeleteRegKeyWorkItem
;
27 class DeleteRegValueWorkItem
;
28 class MoveTreeWorkItem
;
29 class SelfRegWorkItem
;
30 class SetRegValueWorkItem
;
37 // A base class that defines APIs to perform/rollback an action or a
38 // sequence of actions during install/update/uninstall.
42 enum CopyOverWriteOption
{
43 ALWAYS
, // Always overwrite regardless of what existed before.
44 NEVER
, // Not used currently.
45 IF_DIFFERENT
, // Overwrite if different. Currently only applies to file.
46 IF_NOT_PRESENT
, // Copy only if file/directory do not exist already.
47 NEW_NAME_IF_IN_USE
// Copy to a new path if dest is in use(only files).
50 // Options for the MoveTree work item.
52 ALWAYS_MOVE
, // Always attempt to do a move operation.
53 CHECK_DUPLICATES
// Only move if the move target is different.
56 // Abstract base class for the conditions used by ConditionWorkItemList.
57 // TODO(robertshield): Move this out of WorkItem.
60 virtual ~Condition() {}
61 virtual bool ShouldRun() const = 0;
66 // Create a CallbackWorkItem that invokes a callback.
67 static CallbackWorkItem
* CreateCallbackWorkItem(
68 base::Callback
<bool(const CallbackWorkItem
&)> callback
);
70 // Create a CopyRegKeyWorkItem that recursively copies a given registry key.
71 static CopyRegKeyWorkItem
* CreateCopyRegKeyWorkItem(
73 const std::wstring
& source_key_path
,
74 const std::wstring
& dest_key_path
,
75 CopyOverWriteOption overwrite_option
);
77 // Create a CopyTreeWorkItem that recursively copies a file system hierarchy
78 // from source path to destination path.
79 // * If overwrite_option is ALWAYS, the created CopyTreeWorkItem always
81 // * If overwrite_option is NEW_NAME_IF_IN_USE, file is copied with an
82 // alternate name specified by alternative_path.
83 static CopyTreeWorkItem
* CreateCopyTreeWorkItem(
84 const base::FilePath
& source_path
,
85 const base::FilePath
& dest_path
,
86 const base::FilePath
& temp_dir
,
87 CopyOverWriteOption overwrite_option
,
88 const base::FilePath
& alternative_path
);
90 // Create a CreateDirWorkItem that creates a directory at the given path.
91 static CreateDirWorkItem
* CreateCreateDirWorkItem(const base::FilePath
& path
);
93 // Create a CreateRegKeyWorkItem that creates a registry key at the given
95 static CreateRegKeyWorkItem
* CreateCreateRegKeyWorkItem(
96 HKEY predefined_root
, const std::wstring
& path
);
98 // Create a DeleteRegKeyWorkItem that deletes a registry key at the given
100 static DeleteRegKeyWorkItem
* CreateDeleteRegKeyWorkItem(
101 HKEY predefined_root
, const std::wstring
& path
);
103 // Create a DeleteRegValueWorkItem that deletes a registry value
104 static DeleteRegValueWorkItem
* CreateDeleteRegValueWorkItem(
105 HKEY predefined_root
,
106 const std::wstring
& key_path
,
107 const std::wstring
& value_name
);
109 // Create a DeleteTreeWorkItem that recursively deletes a file system
110 // hierarchy at the given root path. A key file can be optionally specified
112 static DeleteTreeWorkItem
* CreateDeleteTreeWorkItem(
113 const base::FilePath
& root_path
,
114 const base::FilePath
& temp_path
,
115 const std::vector
<base::FilePath
>& key_paths
);
117 // Create a MoveTreeWorkItem that recursively moves a file system hierarchy
118 // from source path to destination path.
119 static MoveTreeWorkItem
* CreateMoveTreeWorkItem(
120 const base::FilePath
& source_path
,
121 const base::FilePath
& dest_path
,
122 const base::FilePath
& temp_dir
,
123 MoveTreeOption duplicate_option
);
125 // Create a SetRegValueWorkItem that sets a registry value with REG_SZ type
126 // at the key with specified path.
127 static SetRegValueWorkItem
* CreateSetRegValueWorkItem(
128 HKEY predefined_root
,
129 const std::wstring
& key_path
,
130 const std::wstring
& value_name
,
131 const std::wstring
& value_data
,
134 // Create a SetRegValueWorkItem that sets a registry value with REG_DWORD type
135 // at the key with specified path.
136 static SetRegValueWorkItem
* CreateSetRegValueWorkItem(
137 HKEY predefined_root
,
138 const std::wstring
& key_path
,
139 const std::wstring
& value_name
,
140 DWORD value_data
, bool overwrite
);
142 // Create a SetRegValueWorkItem that sets a registry value with REG_QWORD type
143 // at the key with specified path.
144 static SetRegValueWorkItem
* CreateSetRegValueWorkItem(
145 HKEY predefined_root
,
146 const std::wstring
& key_path
,
147 const std::wstring
& value_name
,
148 int64 value_data
, bool overwrite
);
150 // Add a SelfRegWorkItem that registers or unregisters a DLL at the
152 static SelfRegWorkItem
* CreateSelfRegWorkItem(const std::wstring
& dll_path
,
154 bool user_level_registration
);
156 // Create an empty WorkItemList. A WorkItemList can recursively contains
157 // a list of WorkItems.
158 static WorkItemList
* CreateWorkItemList();
160 // Create an empty WorkItemList that cannot be rolled back.
161 // Such a work item list executes all items on a best effort basis and does
162 // not abort execution if an item in the list fails.
163 static WorkItemList
* CreateNoRollbackWorkItemList();
165 // Create a conditional work item list that will execute only if
166 // condition->ShouldRun() returns true. The WorkItemList instance
167 // assumes ownership of condition.
168 static WorkItemList
* CreateConditionalWorkItemList(Condition
* condition
);
170 // Perform the actions of WorkItem. Returns true if success, returns false
172 // If the WorkItem is transactional, then Do() is done as a transaction.
173 // If it returns false, there will be no change on the system.
174 virtual bool Do() = 0;
176 // Rollback any actions previously carried out by this WorkItem. If the
177 // WorkItem is transactional, then the previous actions can be fully
178 // rolled back. If the WorkItem is non-transactional, the rollback is a
180 virtual void Rollback() = 0;
182 // If called with true, this WorkItem may return true from its Do() method
183 // even on failure and Rollback will have no effect.
184 void set_ignore_failure(bool ignore_failure
) {
185 ignore_failure_
= ignore_failure
;
188 // Returns true if this WorkItem should ignore failures.
189 bool ignore_failure() const {
190 return ignore_failure_
;
193 // Sets an optional log message that a work item may use to print additional
194 // instance-specific information.
195 void set_log_message(const std::string
& log_message
) {
196 log_message_
= log_message
;
199 // Retrieves the optional log message. The retrieved string may be empty.
200 const std::string
& log_message() const { return log_message_
; }
205 // Specifies whether this work item my fail to complete and yet still
206 // return true from Do().
207 bool ignore_failure_
;
209 std::string log_message_
;
212 #endif // CHROME_INSTALLER_UTIL_WORK_ITEM_H_