Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / device / hid / hid_service_linux.h
1 // Copyright (c) 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef DEVICE_HID_HID_SERVICE_LINUX_H_
6 #define DEVICE_HID_HID_SERVICE_LINUX_H_
7
8 #include <libudev.h>
9
10 #include "base/macros.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_pump_libevent.h"
13 #include "device/hid/hid_device_info.h"
14 #include "device/hid/hid_service.h"
15
16 namespace device {
17
18 class HidConnection;
19
20 template<typename T, void func(T*)>
21 void DiscardReturnType(T* arg) { func(arg); }
22 template<typename T, T* func(T*)>
23 void DiscardReturnType(T* arg) { func(arg); }
24
25 template<typename T, void func(T*)>
26 struct Deleter {
27   void operator()(T* enumerate) const {
28     if (enumerate != NULL)
29       func(enumerate);
30   }
31 };
32
33 typedef Deleter<
34     udev_enumerate,
35     DiscardReturnType<udev_enumerate, udev_enumerate_unref> >
36     UdevEnumerateDeleter;
37 typedef Deleter<
38     udev_device,
39     DiscardReturnType<udev_device, udev_device_unref> > UdevDeviceDeleter;
40 typedef Deleter<udev, DiscardReturnType<udev, udev_unref> > UdevDeleter;
41 typedef Deleter<
42     udev_monitor,
43     DiscardReturnType<udev_monitor, udev_monitor_unref> > UdevMonitorDeleter;
44
45 typedef scoped_ptr<udev_device, UdevDeviceDeleter> ScopedUdevDevicePtr;
46 typedef scoped_ptr<udev_enumerate, UdevEnumerateDeleter> ScopedUdevEnumeratePtr;
47
48 class HidServiceLinux : public HidService,
49                         public base::MessagePumpLibevent::Watcher {
50  public:
51   HidServiceLinux();
52
53   virtual scoped_refptr<HidConnection> Connect(std::string device_id) OVERRIDE;
54
55   // Implements base::MessagePumpLibevent::Watcher
56   virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
57   virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
58
59  private:
60   virtual ~HidServiceLinux();
61
62   void Enumerate();
63   void PlatformDeviceAdd(udev_device* device);
64   void PlatformDeviceRemove(udev_device* raw_dev);
65
66   scoped_ptr<udev, UdevDeleter> udev_;
67   scoped_ptr<udev_monitor, UdevMonitorDeleter> monitor_;
68   int monitor_fd_;
69   base::MessagePumpLibevent::FileDescriptorWatcher monitor_watcher_;
70
71   DISALLOW_COPY_AND_ASSIGN(HidServiceLinux);
72 };
73
74 }  // namespace device
75
76 #endif  // DEVICE_HID_HID_SERVICE_LINUX_H_