Chromium Code Reviews| 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.
|