1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#ifndef DEVICE_HID_INPUT_SERVICE_LINUX_H_
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define DEVICE_HID_INPUT_SERVICE_LINUX_H_
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <string>
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <vector>
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/compiler_specific.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/containers/hash_tables.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/macros.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/memory/scoped_ptr.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/message_loop/message_loop.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/observer_list.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/threading/thread_checker.h"
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "device/hid/device_monitor_linux.h"
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace device {
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// This class provides information and notifications about
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// connected/disconnected input/HID devices. This class is *NOT*
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// thread-safe and all methods must be called from the FILE thread.
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass InputServiceLinux : public base::MessageLoop::DestructionObserver {
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  struct InputDeviceInfo {
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    enum Subsystem { SUBSYSTEM_HID, SUBSYSTEM_INPUT, SUBSYSTEM_UNKNOWN };
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    enum Type { TYPE_BLUETOOTH, TYPE_USB, TYPE_SERIO, TYPE_UNKNOWN };
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    InputDeviceInfo();
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string id;
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    std::string name;
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Subsystem subsystem;
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    Type type;
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool is_accelerometer : 1;
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool is_joystick : 1;
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool is_key : 1;
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool is_keyboard : 1;
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool is_mouse : 1;
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool is_tablet : 1;
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool is_touchpad : 1;
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    bool is_touchscreen : 1;
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  class Observer {
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch   public:
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual ~Observer() {}
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual void OnInputDeviceAdded(const InputDeviceInfo& info) = 0;
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual void OnInputDeviceRemoved(const std::string& id) = 0;
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InputServiceLinux();
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  static InputServiceLinux* GetInstance();
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  static bool HasInstance();
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static void SetForTesting(InputServiceLinux* service);
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void AddObserver(Observer* observer);
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void RemoveObserver(Observer* observer);
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Returns list of all currently connected input/hid devices.
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void GetDevices(std::vector<InputDeviceInfo>* devices);
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Returns an info about input device identified by |id|. When there're
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // no input or hid device with such id, returns false and doesn't
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // modify |info|.
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool GetDeviceInfo(const std::string& id, InputDeviceInfo* info) const;
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Implements base::MessageLoop::DestructionObserver
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void WillDestroyCurrentMessageLoop() OVERRIDE;
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected:
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~InputServiceLinux();
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void AddDevice(const InputDeviceInfo& info);
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void RemoveDevice(const std::string& id);
800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool CalledOnValidThread() const;
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  friend struct base::DefaultDeleter<InputServiceLinux>;
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  typedef base::hash_map<std::string, InputDeviceInfo> DeviceMap;
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DeviceMap devices_;
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ObserverList<Observer> observers_;
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::ThreadChecker thread_checker_;
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DISALLOW_COPY_AND_ASSIGN(InputServiceLinux);
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace device
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif  // DEVICE_HID_INPUT_SERVICE_LINUX_H_
99