[Android] Added UMA for search by image context menu.
[chromium-blink-merge.git] / chrome / installer / util / work_item.h
blob30118609f6a48c68ecc822386939133c0e27a49c
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.
4 //
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
7 // process fails.
9 #ifndef CHROME_INSTALLER_UTIL_WORK_ITEM_H_
10 #define CHROME_INSTALLER_UTIL_WORK_ITEM_H_
12 #include <windows.h>
14 #include <string>
15 #include <vector>
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;
31 class WorkItemList;
33 namespace base {
34 class FilePath;
37 // A base class that defines APIs to perform/rollback an action or a
38 // sequence of actions during install/update/uninstall.
39 class WorkItem {
40 public:
41 // Possible states
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.
51 enum MoveTreeOption {
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.
58 class Condition {
59 public:
60 virtual ~Condition() {}
61 virtual bool ShouldRun() const = 0;
64 virtual ~WorkItem();
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(
72 HKEY predefined_root,
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
80 // overwrites files.
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
94 // path.
95 static CreateRegKeyWorkItem* CreateCreateRegKeyWorkItem(
96 HKEY predefined_root, const std::wstring& path);
98 // Create a DeleteRegKeyWorkItem that deletes a registry key at the given
99 // path.
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
111 // by key_path.
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,
132 bool overwrite);
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
151 // specified path.
152 static SelfRegWorkItem* CreateSelfRegWorkItem(const std::wstring& dll_path,
153 bool do_register,
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
171 // otherwise.
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
179 // best effort.
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_; }
202 protected:
203 WorkItem();
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_