blob: 184faf66d93da33546e4874ba40cec5d1a4fa49b [file] [log] [blame]
// Copyright 2014 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 POWER_MANAGER_POWERD_SYSTEM_EVENT_DEVICE_INTERFACE_H_
#define POWER_MANAGER_POWERD_SYSTEM_EVENT_DEVICE_INTERFACE_H_
#include <memory>
#include <string>
#include <vector>
#include <base/callback_forward.h>
#include <base/files/file_path.h>
#include <base/macros.h>
#include "power_manager/common/power_constants.h"
struct input_event; // from <linux/input.h>
namespace power_manager {
namespace system {
// Provides methods to access event devices, i.e. the device files exposed by
// the kernel evdev interface: /dev/input/eventN.
class EventDeviceInterface {
public:
EventDeviceInterface() {}
virtual ~EventDeviceInterface() {}
// Returns a human-readable identifier to be used for debugging.
virtual std::string GetDebugName() = 0;
// Returns the name (from EVIOCGNAME) of the input device.
virtual std::string GetName() = 0;
// Returns the physical path of the device.
// TODO(patrikf): Consider using udev and tags instead.
virtual std::string GetPhysPath() = 0;
// Returns true if the device is a Chrome OS fingerprint device.
virtual bool IsCrosFp() = 0;
// Returns true if the device can report lid events.
virtual bool IsLidSwitch() = 0;
// Returns true if the device can report tablet mode events.
virtual bool IsTabletModeSwitch() = 0;
// Returns true if the device can report power button events.
virtual bool IsPowerButton() = 0;
// Returns true if the device can report hover events.
virtual bool HoverSupported() = 0;
// Returns true if the device reports a left button. This can be used to
// distinguish touchpads from touchscreens.
virtual bool HasLeftButton() = 0;
// Returns the current state of the lid switch.
// Must not be called after ReadEvents() or WatchForEvents().
virtual LidState GetInitialLidState() = 0;
// Returns the current state of the tablet mode switch.
// Must not be called after ReadEvents() or WatchForEvents().
virtual TabletMode GetInitialTabletMode() = 0;
// Reads a number of events into |events_out|. Returns true if the operation
// was successful and events were present.
virtual bool ReadEvents(std::vector<input_event>* events_out) = 0;
// Start watching this device for incoming events, and run |new_events_cb|
// when events are ready to be read with ReadEvents(). Shall only be called
// once.
virtual void WatchForEvents(base::Closure new_events_cb) = 0;
};
class EventDeviceFactoryInterface {
public:
EventDeviceFactoryInterface() {}
virtual ~EventDeviceFactoryInterface() {}
// Opens an event device by path. Returns the device or NULL on error.
// TODO(crbug.com/1073772,ejcaruso): migrate to unique_ptr.
// In theory, this can be unique_ptr. InputWatcher will consume this
// unique_ptr and transfer ownership for device that should_watch. But
// EventDeviceStub didn't create new instances for each device, instead
// reuses the same instance. Thus if we transfer ownership via Open, this
// device can be released by InputWatcher. devices raw pointer is created in
// input_watcher_test.cc, and keeps reused even after an Open(). This could
// cause heap use after free in unittest.
virtual std::shared_ptr<EventDeviceInterface> Open(
const base::FilePath& path) = 0;
};
} // namespace system
} // namespace power_manager
#endif // POWER_MANAGER_POWERD_SYSTEM_EVENT_DEVICE_INTERFACE_H_