// Copyright 2017 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 COMPONENTS_UPDATE_CLIENT_ACTION_RUNNER_H_
#define COMPONENTS_UPDATE_CLIENT_ACTION_RUNNER_H_

#include <stdint.h>

#include <memory>
#include <utility>
#include <vector>

#include "base/callback.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/threading/thread_checker.h"
#include "build/build_config.h"
#include "components/update_client/component_unpacker.h"

namespace base {
class CommandLine;
class Process;
class SingleThreadTaskRunner;
}  // namespace base

namespace update_client {

class Component;

class ActionRunner {
 public:
  using Callback =
      base::OnceCallback<void(bool succeeded, int error_code, int extra_code1)>;

  explicit ActionRunner(const Component& component);
  ~ActionRunner();

  void Run(Callback run_complete);

 private:
  void RunOnTaskRunner(std::unique_ptr<Unzipper> unzipper,
                       scoped_refptr<Patcher> patcher);
  void UnpackComplete(const ComponentUnpacker::Result& result);

  void RunCommand(const base::CommandLine& cmdline);
  void RunRecoveryCRXElevated(const base::FilePath& crx_path);

  base::CommandLine MakeCommandLine(const base::FilePath& unpack_path) const;

  void WaitForCommand(base::Process process);

#if defined(OS_WIN)
  void RunRecoveryCRXElevatedInSTA(const base::FilePath& crx_path);
#endif

  bool is_per_user_install_ = false;
  const Component& component_;

  // Used to post callbacks to the main thread.
  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;

  // Contains the unpack path for the component associated with the run action.
  base::FilePath unpack_path_;

  Callback run_complete_;

  THREAD_CHECKER(thread_checker_);
  DISALLOW_COPY_AND_ASSIGN(ActionRunner);
};

}  // namespace update_client

#endif  // COMPONENTS_UPDATE_CLIENT_ACTION_RUNNER_H_
