// Copyright 2016 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 TOUCH_KEYBOARD_EVDEVSOURCE_H_
#define TOUCH_KEYBOARD_EVDEVSOURCE_H_

#include <base/logging.h>
#include <fcntl.h>
#include <gtest/gtest_prod.h>  // for FRIEND_TEST
#include <linux/input.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <sys/select.h>
#include <sys/types.h>
#include <unistd.h>

#include "touch_keyboard/syscallhandler.h"

namespace touch_keyboard {

// Timeout value to use when you want the EvdevSource to block indefinitely
// when calling GetNextEvent().
constexpr int kNoTimeout = -1;

class EvdevSource {
 /* A class that uses an Evdev device as an event source
  *
  * This class opens an Evdev device and allows you to easily process the
  * events it is producing.  Generally speaking, you should probably derive
  * from this class instead of instantiating it directly.  Essentially you
  * should call OpenSourceDevice() at the beginning, then repeatedly
  * call GetNextEvent() to collect up the individual events being produced
  * by the Evdev device you selected.
  */
 public:
  EvdevSource() : syscall_handler_(&default_syscall_handler),
                  source_fd_(-1) { }
  explicit EvdevSource(SyscallHandler *syscall_handler) :
      syscall_handler_(syscall_handler), source_fd_(-1) {
    // This constructor allows you to pass in a SyscallHandler when unit
    // testing this class.  For real use, allow it to use the default value
    // by using the constructor with no arguments.
    if (syscall_handler_ == NULL) {
      LOG(INFO) << "NULL syscall_handler specified, using default.";
      syscall_handler_ = &default_syscall_handler;
    }
  }

 protected:
  // Open the device file on disk and store the descriptor in this object.
  bool OpenSourceDevice(std::string const &source_device_path);
  // Wait for a new event to come from the source and populate *ev with it.
  bool GetNextEvent(int timeout_ms, struct input_event *ev) const;

  SyscallHandler *syscall_handler_;
  int source_fd_;

  friend class EvdevSourceTest;
  FRIEND_TEST(EvdevSourceTest, OpenDeviceSucceedTest);
  FRIEND_TEST(EvdevSourceTest, OpenDeviceFailureTest);
  FRIEND_TEST(EvdevSourceTest, EventCaptureTimeoutDisabledTest);
  FRIEND_TEST(EvdevSourceTest, EventCaptureTimeoutEnabledTest);
  FRIEND_TEST(EvdevSourceTest, EventCaptureTimesOutTest);
};

}  // namespace touch_keyboard

#endif  // TOUCH_KEYBOARD_EVDEVSOURCE_H_
