work_item.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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.
8
9#ifndef CHROME_INSTALLER_UTIL_WORK_ITEM_H_
10#define CHROME_INSTALLER_UTIL_WORK_ITEM_H_
11
12#include <windows.h>
13
14#include <string>
15#include <vector>
16
17#include "base/basictypes.h"
18#include "base/callback_forward.h"
19
20class CallbackWorkItem;
21class CopyRegKeyWorkItem;
22class CopyTreeWorkItem;
23class CreateDirWorkItem;
24class CreateRegKeyWorkItem;
25class DeleteTreeWorkItem;
26class DeleteRegKeyWorkItem;
27class DeleteRegValueWorkItem;
28class MoveTreeWorkItem;
29class SelfRegWorkItem;
30class SetRegValueWorkItem;
31class WorkItemList;
32
33namespace base {
34class FilePath;
35}
36
37// A base class that defines APIs to perform/rollback an action or a
38// sequence of actions during install/update/uninstall.
39class 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).
48  };
49
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.
54  };
55
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;
62  };
63
64  virtual ~WorkItem();
65
66  // Create a CallbackWorkItem that invokes a callback.
67  static CallbackWorkItem* CreateCallbackWorkItem(
68      base::Callback<bool(const CallbackWorkItem&)> callback);
69
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);
76
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);
89
90  // Create a CreateDirWorkItem that creates a directory at the given path.
91  static CreateDirWorkItem* CreateCreateDirWorkItem(const base::FilePath& path);
92
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);
97
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);
102
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);
108
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);
116
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);
124
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);
133
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);
141
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);
149
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);
155
156  // Create an empty WorkItemList. A WorkItemList can recursively contains
157  // a list of WorkItems.
158  static WorkItemList* CreateWorkItemList();
159
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();
164
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);
169
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;
175
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;
181
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;
186  }
187
188  // Returns true if this WorkItem should ignore failures.
189  bool ignore_failure() const {
190    return ignore_failure_;
191  }
192
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;
197  }
198
199  // Retrieves the optional log message. The retrieved string may be empty.
200  const std::string& log_message() const { return log_message_; }
201
202 protected:
203  WorkItem();
204
205  // Specifies whether this work item my fail to complete and yet still
206  // return true from Do().
207  bool ignore_failure_;
208
209  std::string log_message_;
210};
211
212#endif  // CHROME_INSTALLER_UTIL_WORK_ITEM_H_
213