Home | History | Annotate | Download | only in util
      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 #ifndef CHROME_INSTALLER_UTIL_WORK_ITEM_LIST_H_
      6 #define CHROME_INSTALLER_UTIL_WORK_ITEM_LIST_H_
      7 
      8 #include <windows.h>
      9 
     10 #include <list>
     11 #include <string>
     12 #include <vector>
     13 
     14 #include "base/callback_forward.h"
     15 #include "base/memory/scoped_ptr.h"
     16 #include "chrome/installer/util/work_item.h"
     17 
     18 namespace base {
     19 class FilePath;
     20 }
     21 
     22 // A WorkItem subclass that recursively contains a list of WorkItems. Thus it
     23 // provides functionalities to carry out or roll back the sequence of actions
     24 // defined by the list of WorkItems it contains.
     25 // The WorkItems are executed in the same order as they are added to the list.
     26 class WorkItemList : public WorkItem {
     27  public:
     28   virtual ~WorkItemList();
     29 
     30   // Execute the WorkItems in the same order as they are added to the list.
     31   // It aborts as soon as one WorkItem fails.
     32   virtual bool Do();
     33 
     34   // Rollback the WorkItems in the reverse order as they are executed.
     35   virtual void Rollback();
     36 
     37   // Add a WorkItem to the list.
     38   // A WorkItem can only be added to the list before the list's DO() is called.
     39   // Once a WorkItem is added to the list. The list owns the WorkItem.
     40   virtual void AddWorkItem(WorkItem* work_item);
     41 
     42   // Add a CallbackWorkItem that invokes a callback.
     43   virtual WorkItem* AddCallbackWorkItem(
     44       base::Callback<bool(const CallbackWorkItem&)> callback);
     45 
     46   // Add a CopyTreeWorkItem to the list of work items.
     47   // See the NOTE in the documentation for the CopyTreeWorkItem class for
     48   // special considerations regarding |temp_dir|.
     49   virtual WorkItem* AddCopyTreeWorkItem(
     50       const std::wstring& source_path,
     51       const std::wstring& dest_path,
     52       const std::wstring& temp_dir,
     53       CopyOverWriteOption overwrite_option,
     54       const std::wstring& alternative_path = L"");
     55 
     56   // Add a CreateDirWorkItem that creates a directory at the given path.
     57   virtual WorkItem* AddCreateDirWorkItem(const base::FilePath& path);
     58 
     59   // Add a CreateRegKeyWorkItem that creates a registry key at the given
     60   // path.
     61   virtual WorkItem* AddCreateRegKeyWorkItem(HKEY predefined_root,
     62                                             const std::wstring& path,
     63                                             REGSAM wow64_access);
     64 
     65   // Add a DeleteRegKeyWorkItem that deletes a registry key from the given
     66   // path.
     67   virtual WorkItem* AddDeleteRegKeyWorkItem(HKEY predefined_root,
     68                                             const std::wstring& path,
     69                                             REGSAM wow64_access);
     70 
     71   // Add a DeleteRegValueWorkItem that deletes registry value of type REG_SZ
     72   // or REG_DWORD.
     73   virtual WorkItem* AddDeleteRegValueWorkItem(HKEY predefined_root,
     74                                               const std::wstring& key_path,
     75                                               REGSAM wow64_access,
     76                                               const std::wstring& value_name);
     77 
     78   // Add a DeleteTreeWorkItem that recursively deletes a file system
     79   // hierarchy at the given root path. A key file can be optionally specified
     80   // by key_path.
     81   virtual WorkItem* AddDeleteTreeWorkItem(
     82       const base::FilePath& root_path,
     83       const base::FilePath& temp_path,
     84       const std::vector<base::FilePath>& key_paths);
     85 
     86   // Same as above but without support for key files.
     87   virtual WorkItem* AddDeleteTreeWorkItem(const base::FilePath& root_path,
     88                                           const base::FilePath& temp_path);
     89 
     90   // Add a MoveTreeWorkItem to the list of work items.
     91   virtual WorkItem* AddMoveTreeWorkItem(const std::wstring& source_path,
     92                                         const std::wstring& dest_path,
     93                                         const std::wstring& temp_dir,
     94                                         MoveTreeOption duplicate_option);
     95 
     96   // Add a SetRegValueWorkItem that sets a registry value with REG_SZ type
     97   // at the key with specified path.
     98   virtual WorkItem* AddSetRegValueWorkItem(HKEY predefined_root,
     99                                            const std::wstring& key_path,
    100                                            REGSAM wow64_access,
    101                                            const std::wstring& value_name,
    102                                            const std::wstring& value_data,
    103                                            bool overwrite);
    104 
    105   // Add a SetRegValueWorkItem that sets a registry value with REG_DWORD type
    106   // at the key with specified path.
    107   virtual WorkItem* AddSetRegValueWorkItem(HKEY predefined_root,
    108                                            const std::wstring& key_path,
    109                                            REGSAM wow64_access,
    110                                            const std::wstring& value_name,
    111                                            DWORD value_data,
    112                                            bool overwrite);
    113 
    114   // Add a SetRegValueWorkItem that sets a registry value with REG_QWORD type
    115   // at the key with specified path.
    116   virtual WorkItem* AddSetRegValueWorkItem(HKEY predefined_root,
    117                                            const std::wstring& key_path,
    118                                            REGSAM wow64_access,
    119                                            const std::wstring& value_name,
    120                                            int64 value_data,
    121                                            bool overwrite);
    122 
    123   // Add a SelfRegWorkItem that registers or unregisters a DLL at the
    124   // specified path. If user_level_registration is true, then alternate
    125   // registration and unregistration entry point names will be used.
    126   virtual WorkItem* AddSelfRegWorkItem(const std::wstring& dll_path,
    127                                        bool do_register,
    128                                        bool user_level_registration);
    129 
    130  protected:
    131   friend class WorkItem;
    132 
    133   typedef std::list<WorkItem*> WorkItems;
    134   typedef WorkItems::iterator WorkItemIterator;
    135 
    136   enum ListStatus {
    137     // List has not been executed. Ok to add new WorkItem.
    138     ADD_ITEM,
    139     // List has been executed. Can not add new WorkItem.
    140     LIST_EXECUTED,
    141     // List has been executed and rolled back. No further action is acceptable.
    142     LIST_ROLLED_BACK
    143   };
    144 
    145   WorkItemList();
    146 
    147   ListStatus status_;
    148 
    149   // The list of WorkItems, in the order of them being added.
    150   WorkItems list_;
    151 
    152   // The list of executed WorkItems, in the reverse order of them being
    153   // executed.
    154   WorkItems executed_list_;
    155 };
    156 
    157 // A specialization of WorkItemList that executes items in the list on a
    158 // best-effort basis.  Failure of individual items to execute does not prevent
    159 // subsequent items from being executed.
    160 // Also, as the class name suggests, Rollback is not possible.
    161 class NoRollbackWorkItemList : public WorkItemList {
    162  public:
    163   virtual ~NoRollbackWorkItemList();
    164 
    165   // Execute the WorkItems in the same order as they are added to the list.
    166   // If a WorkItem fails, the function will return failure but all other
    167   // WorkItems will still be executed.
    168   virtual bool Do();
    169 
    170   // No-op.
    171   virtual void Rollback();
    172 };
    173 
    174 #endif  // CHROME_INSTALLER_UTIL_WORK_ITEM_LIST_H_
    175