Index: udev_listener.cc |
diff --git a/udev_listener.cc b/udev_listener.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9857051c7d21bf4f4a8e8f720493a329ea7fcb63 |
--- /dev/null |
+++ b/udev_listener.cc |
@@ -0,0 +1,80 @@ |
+// Copyright (c) 2011 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. |
+ |
+#include <glib.h> |
+ |
+#include "base/logging.h" |
+#include "base/platform_thread.h" |
+#include "power_manager/udev_listener.h" |
tfarina
2011/04/14 02:36:05
this should be included first. Please move it to l
marcheu
2011/04/14 02:52:10
Why? The convention is to order the headers alphab
tfarina
2011/04/14 14:53:58
See http://google-styleguide.googlecode.com/svn/tr
|
+ |
+namespace power_manager { |
+ |
+UdevListener::UdevListener(UdevCallback* callback, std::string subsystem) |
+ : callback_(callback), |
+ udev_(NULL), |
+ subsystem_(subsystem) { |
+} |
+ |
+UdevListener::~UdevListener() { |
+ if (udev_) |
+ udev_unref(udev_); |
+} |
+ |
+bool UdevListener::Init() { |
+ // Create the udev object. |
+ udev_ = udev_new(); |
+ if (!udev_) { |
+ LOG(ERROR) << "Can't create udev object."; |
+ return false; |
+ } |
+ |
+ // Create the udev monitor structure. |
+ monitor_ = udev_monitor_new_from_netlink(udev_, "udev"); |
+ if (!monitor_ ) { |
+ LOG(ERROR) << "Can't create udev monitor."; |
+ udev_unref(udev_); |
+ return false; |
+ } |
+ udev_monitor_filter_add_match_subsystem_devtype(monitor_, |
+ subsystem_.c_str(), |
+ NULL); |
+ udev_monitor_enable_receiving(monitor_); |
+ |
+ int fd = udev_monitor_get_fd(monitor_); |
+ |
+ GIOChannel* channel = g_io_channel_unix_new(fd); |
+ g_io_add_watch(channel, G_IO_IN, &(UdevListener::EventHandler), this); |
+ |
+ LOG(INFO) << "Udev listener waiting for events on subsystem " |
+ << subsystem_; |
+ |
+ return true; |
+} |
+ |
+gboolean UdevListener::EventHandler(GIOChannel* source, |
+ GIOCondition condition, |
+ gpointer data) { |
+ UdevListener* listener = static_cast<UdevListener*>(data); |
+ |
+ struct udev_device* dev = udev_monitor_receive_device(listener->monitor_); |
+ if (dev) { |
+ LOG(INFO) << "Event on (" |
+ << udev_device_get_devnode(dev) |
+ << "|" |
+ << udev_device_get_subsystem(dev) |
+ << "|" |
+ << udev_device_get_devtype(dev) |
+ << ") Action " |
+ << udev_device_get_action(dev); |
+ udev_device_unref(dev); |
+ listener->callback_->Run(source, condition); |
+ } else { |
+ LOG(ERROR) << "Can't get receive_device()"; |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+} // namespace power_manager |
+ |
tfarina
2011/04/14 02:36:05
remove this blank line.
marcheu
2011/04/14 02:52:10
Done.
|