// Copyright (c) 2013 The Chromium OS 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 DEBUGD_SRC_CRASH_SENDER_TOOL_H_
#define DEBUGD_SRC_CRASH_SENDER_TOOL_H_

#include <string>
#include <tuple>
#include <vector>

#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/macros.h>
#include <brillo/errors/error.h>

#include "debugd/src/subprocess_tool.h"

namespace brillo {
namespace dbus_utils {
class ExportedPropertyBase;
}  // namespace dbus_utils
}  // namespace brillo

namespace debugd {

class CrashSenderTool : public SubprocessTool {
 public:
  static constexpr char kErrorBadFileName[] =
      "org.chromium.debugd.error.BadFileName";

  CrashSenderTool() = default;
  ~CrashSenderTool() override = default;

  // Run crash_sender to upload any crashes currently on the system.
  void UploadCrashes();

  // Run crash_sender to upload the crash given in the files in |in_files|.
  bool UploadSingleCrash(
      const std::vector<std::tuple<std::string, base::ScopedFD>>& in_files,
      brillo::ErrorPtr* error);

  // Called when the CrashSenderTestMode dbus property is changed.
  void OnTestModeChanged(
      const brillo::dbus_utils::ExportedPropertyBase* test_mode_property);

 private:
  int next_crash_directory_id_ = 1;

  // If true, pass the "--test_mode" flag to crash_sender. This is bound to the
  // "CrashSenderTestMode" dbus property, so tast tests (and anyone else) can
  // change it easily.
  bool test_mode_ = false;

  void RunCrashSender(bool ignore_hold_off_time,
                      const base::FilePath& crash_directory);
  DISALLOW_COPY_AND_ASSIGN(CrashSenderTool);
};

}  // namespace debugd

#endif  // DEBUGD_SRC_CRASH_SENDER_TOOL_H_
