// Copyright 2021 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.
//
// This tool is used for getting dmesg information through debugd.

#ifndef DEBUGD_SRC_DRM_TRACE_TOOL_H_
#define DEBUGD_SRC_DRM_TRACE_TOOL_H_

#include <string>

#include <base/files/file_path.h>
#include <brillo/errors/error.h>
#include <chromeos/dbus/debugd/dbus-constants.h>
#include <debugd/src/log_provider.h>
#include <debugd/src/session_manager_observer_interface.h>

namespace debugd {

class DRMTraceTool : public SessionManagerObserverInterface {
 public:
  explicit DRMTraceTool(LogProvider* provider);
  DRMTraceTool(const DRMTraceTool&) = delete;
  DRMTraceTool& operator=(const DRMTraceTool&) = delete;

  // Change which debug categories will be written to drm_trace. |categories|
  // must be a bitmask of DRMTraceCategories flags. Setting |categories| to 0
  // resets to the default logging categories.
  bool SetCategories(brillo::ErrorPtr* error, uint32_t categories);

  // Change the size of the buffer holding drm_trace contents. |size_enum| must
  // be a valid value of the DRMTraceSizes enum.
  bool SetSize(brillo::ErrorPtr* error, uint32_t size_enum);

  // Annotate the drm trace log by writing |log| to
  // /sys/kernel/debug/tracing/instances/drm/trace_marker
  bool AnnotateLog(brillo::ErrorPtr* error, const std::string& log);

  // Copy the log specified by |type_enum| to
  // /var/log/display_debug/$logtype.$datetime
  bool Snapshot(brillo::ErrorPtr* error, uint32_t type_enum);

  // Helper function to write |contents| to the file at |path|.
  static bool WriteToFile(brillo::ErrorPtr* error,
                          const base::FilePath& path,
                          const std::string& contents);

  ~DRMTraceTool() = default;

 private:
  friend class DRMTraceToolTest;

  // From SessionManagerObserverInterface.
  virtual void OnSessionStarted();

  // From SessionManagerObserverInterface.
  virtual void OnSessionStopped();

  // Reset DRM trace parameters to default.
  void SetToDefault();

  // For testing only.
  DRMTraceTool(const base::FilePath& root, LogProvider* provider);

  const base::FilePath root_path_;
  LogProvider* log_provider_;
};

}  // namespace debugd

#endif  // DEBUGD_SRC_DRM_TRACE_TOOL_H_
