summaryrefslogtreecommitdiffstats
path: root/chrome/installer/util/work_item_list.h
blob: 1390701c54c65f324925dedeb65ff00fa56ba463 (plain)
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
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// 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 <list>
#include <string>

#include "base/file_path.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.
class WorkItemList : public WorkItem {
 public:
  virtual ~WorkItemList();

  // Execute the WorkItems in the same order as they are added to the list.
  // It aborts as soon as one WorkItem fails.
  virtual bool Do();

  // Rollback the WorkItems in the reverse order as they are executed.
  virtual void Rollback();

  // Add a WorkItem to the list. Return true if the WorkItem is successfully
  // added. Return false otherwise.
  // 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.
  bool AddWorkItem(WorkItem* work_item);

  // Add a CopyTreeWorkItem to the list of work items.
  bool AddCopyTreeWorkItem(const std::wstring& source_path,
                           const std::wstring& dest_path,
                           const std::wstring& temp_dir,
                           CopyOverWriteOption overwrite_option,
                           const std::wstring& alternative_path = L"");

  // Add a CreateDirWorkItem that creates a directory at the given path.
  bool AddCreateDirWorkItem(const FilePath& path);

  // Add a CreateRegKeyWorkItem that creates a registry key at the given
  // path.
  bool AddCreateRegKeyWorkItem(HKEY predefined_root, const std::wstring& path);

  // Add a DeleteRegValueWorkItem that deletes registry value of type REG_SZ
  // or REG_DWORD.
  bool AddDeleteRegValueWorkItem(HKEY predefined_root,
                                 const std::wstring& key_path,
                                 const std::wstring& value_name,
                                 bool is_str_type);

  // Add a DeleteTreeWorkItem that recursively deletes a file system
  // hierarchy at the given root path. A key file can be optionally specified
  // by key_path.
  bool AddDeleteTreeWorkItem(const std::wstring& root_path,
                             const std::wstring& key_path);

  // Add a MoveTreeWorkItem to the list of work items.
  bool AddMoveTreeWorkItem(const std::wstring& source_path,
                           const std::wstring& dest_path,
                           const std::wstring& temp_dir);

  // Add a SetRegValueWorkItem that sets a registry value with REG_SZ type
  // at the key with specified path.
  bool AddSetRegValueWorkItem(HKEY predefined_root,
                              const std::wstring& key_path,
                              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.
  bool AddSetRegValueWorkItem(HKEY predefined_root,
                              const std::wstring& key_path,
                              const std::wstring& value_name,
                              DWORD value_data,
                              bool overwrite);

  // Add a SelfRegWorkItem that registers or unregisters a DLL at the
  // specified path.
  bool AddSelfRegWorkItem(const std::wstring& dll_path, bool do_register);

 private:
  friend class WorkItem;

  typedef std::list<WorkItem*> WorkItems;
  typedef WorkItems::iterator WorkItemIterator;

  enum ListStatus {
    // List has not been executed. Ok to add new WorkItem.
    ADD_ITEM,
    // List has been executed. Can not add new WorkItem.
    LIST_EXECUTED,
    // List has been executed and rolled back. No further action is acceptable.
    LIST_ROLLED_BACK
  };

  WorkItemList();

  ListStatus status_;

  // 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_