action_processor.h revision aea4c1cea20dda7ae7e85fc8924a2d784f70d806
1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2011 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
1649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
17cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#ifndef UPDATE_ENGINE_ACTION_PROCESSOR_H_
18cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#define UPDATE_ENGINE_ACTION_PROCESSOR_H_
1949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
2049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com#include <deque>
2149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
2205735a1879a553153458aae0a25fa5d42e3e408fBen Chan#include <base/macros.h>
2349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
24a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen#include "update_engine/error_code.h"
25a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen
2649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// The structure of these classes (Action, ActionPipe, ActionProcessor, etc.)
2749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// is based on the KSAction* classes from the Google Update Engine code at
2849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// http://code.google.com/p/update-engine/ . The author of this file sends
2949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// a big thanks to that team for their high quality design, implementation,
3049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// and documentation.
3149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
32072359ca138504065e1e0c1189eb38c09576d324Alex Vakulenko// See action.h for an overview of this class and other Action* classes.
3349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
3449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// An ActionProcessor keeps a queue of Actions and processes them in order.
3549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
3649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comnamespace chromeos_update_engine {
3749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
3849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass AbstractAction;
3949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass ActionProcessorDelegate;
4049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
4149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass ActionProcessor {
4249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public:
4349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  ActionProcessor();
4449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
45f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  virtual ~ActionProcessor();
4649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
4749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Starts processing the first Action in the queue. If there's a delegate,
4849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // when all processing is complete, ProcessingDone() will be called on the
4949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // delegate.
50f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  virtual void StartProcessing();
5149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
5249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Aborts processing. If an Action is running, it will have
5349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // TerminateProcessing() called on it. The Action that was running
5449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // will be lost and must be re-enqueued if this Processor is to use it.
5549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  void StopProcessing();
5649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
5749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Returns true iff an Action is currently processing.
5888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  bool IsRunning() const { return nullptr != current_action_; }
5949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Adds another Action to the end of the queue.
61f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  virtual void EnqueueAction(AbstractAction* action);
6249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6388b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  // Sets/gets the current delegate. Set to null to remove a delegate.
64f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  ActionProcessorDelegate* delegate() const { return delegate_; }
6549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  void set_delegate(ActionProcessorDelegate *delegate) {
6649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    delegate_ = delegate;
6749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
6849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
6949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Returns a pointer to the current Action that's processing.
7049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  AbstractAction* current_action() const {
7149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com    return current_action_;
7249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  }
7349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
7449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Called by an action to notify processor that it's done. Caller passes self.
75a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen  void ActionComplete(AbstractAction* actionptr, ErrorCode code);
7649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
7749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com private:
7849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Actions that have not yet begun processing, in the order in which
7949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // they'll be processed.
8049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  std::deque<AbstractAction*> actions_;
8149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
82072359ca138504065e1e0c1189eb38c09576d324Alex Vakulenko  // A pointer to the currently processing Action, if any.
8349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  AbstractAction* current_action_;
8449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
8588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  // A pointer to the delegate, or null if none.
8649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  ActionProcessorDelegate *delegate_;
8749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  DISALLOW_COPY_AND_ASSIGN(ActionProcessor);
8849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com};
8949fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
9049fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// A delegate object can be used to be notified of events that happen
9149fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// in an ActionProcessor. An instance of this class can be passed to an
9249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com// ActionProcessor to register itself.
9349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.comclass ActionProcessorDelegate {
9449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com public:
95e89487039d0eca8130d822cabf75a729609509e0Alex Deymo  virtual ~ActionProcessorDelegate() = default;
96e89487039d0eca8130d822cabf75a729609509e0Alex Deymo
9749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Called when all processing in an ActionProcessor has completed. A pointer
98c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  // to the ActionProcessor is passed. |code| is set to the exit code of the
99c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  // last completed action.
100c1a8b426be9542bc880923711ca508ea3f84000eDarin Petkov  virtual void ProcessingDone(const ActionProcessor* processor,
101a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                              ErrorCode code) {}
10249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
10349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Called when processing has stopped. Does not mean that all Actions have
10449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // completed. If/when all Actions complete, ProcessingDone() will be called.
10549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  virtual void ProcessingStopped(const ActionProcessor* processor) {}
10649fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
10749fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // Called whenever an action has finished processing, either successfully
10849fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com  // or otherwise.
109c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com  virtual void ActionCompleted(ActionProcessor* processor,
110c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9adlr@google.com                               AbstractAction* action,
111a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                               ErrorCode code) {}
11249fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com};
11349fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
11449fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com}  // namespace chromeos_update_engine
11549fdf1889b965be25f929eeebc5b60cd40b9043rspangler@google.com
116cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#endif  // UPDATE_ENGINE_ACTION_PROCESSOR_H_
117