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

#include <memory>

#include <base/callback.h>
#include <base/files/file_descriptor_watcher_posix.h>
#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <base/time/time.h>
#include <base/timer/timer.h>
#include <google/protobuf/arena.h>
#include <vm_protos/proto_bindings/vm_host.grpc.pb.h>

namespace vm_tools {
namespace syslog {

class Collector {
 public:
  virtual ~Collector();

  void SetSyslogFDForTesting(base::ScopedFD syslog_fd);

  // Called periodically to flush any logs that have been buffered.
  void FlushLogs();

 protected:
  // Override SendUserLogs to deliver logs to listening services.
  virtual bool SendUserLogs() = 0;

  bool BindLogSocket(const char* name);

  bool StartWatcher(base::TimeDelta flush_period);

  // Called when |syslog_fd_| becomes readable.
  void OnSyslogReadable();

  const LogRequest& syslog_request() const { return *syslog_request_; }

  // Periodic interval for flushing buffered logs.
  static constexpr base::TimeDelta kFlushPeriod =
      base::TimeDelta::FromMilliseconds(5000);

  // Periodic interval for flushing buffered logs during testing.
  static constexpr base::TimeDelta kFlushPeriodForTesting =
      base::TimeDelta::FromMilliseconds(500);

 private:
  // File descriptor bound to logging socket.
  base::ScopedFD syslog_fd_;
  std::unique_ptr<base::FileDescriptorWatcher::Controller> syslog_controller_;

  // Shared arena used for allocating log records.
  google::protobuf::Arena arena_;

  // Non-owning pointer to the current syslog LogRequest.  Owned by arena_.
  vm_tools::LogRequest* syslog_request_;

  // Size of all the currently buffered log records.
  size_t buffered_size_;

  // Timer used for periodically flushing buffered log records.
  base::RepeatingTimer timer_;

  // Reads one log record from the socket and adds it to |syslog_request_|.
  // Returns true if there may still be more data to read from the socket.
  bool ReadOneSyslogRecord();

  base::WeakPtrFactory<Collector> weak_factory_{this};
};

}  // namespace syslog
}  // namespace vm_tools

#endif  // VM_TOOLS_SYSLOG_COLLECTOR_H_
