OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2010 The Chromium OS 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 #include "chromeos_brightness.h" |
| 6 |
| 7 #include <string> |
| 8 |
| 9 #include <dbus/dbus-glib-lowlevel.h> |
| 10 |
| 11 #include "base/logging.h" |
| 12 #include "base/stringprintf.h" |
| 13 #include "chromeos/dbus/dbus.h" |
| 14 #include "chromeos/dbus/service_constants.h" |
| 15 |
| 16 using std::string; |
| 17 |
| 18 namespace { |
| 19 |
| 20 // Returns a string matching the D-Bus messages that we want to listen for. |
| 21 string GetDBusMatchString() { |
| 22 return StringPrintf("type='signal', interface='%s', member='%s'", |
| 23 power_manager::kPowerManagerInterface, |
| 24 power_manager::kBrightnessChangedSignal); |
| 25 } |
| 26 |
| 27 } // namespace |
| 28 |
| 29 namespace chromeos { |
| 30 |
| 31 class OpaqueBrightnessConnection { |
| 32 public: |
| 33 OpaqueBrightnessConnection(const BrightnessMonitorFunction& monitor_function, |
| 34 void* object) |
| 35 : monitor_function_(monitor_function), |
| 36 object_(object) { |
| 37 } |
| 38 |
| 39 // A D-Bus message filter to receive signals. |
| 40 static DBusHandlerResult FilterDBusMessage(DBusConnection* dbus_conn, |
| 41 DBusMessage* message, |
| 42 void* data) { |
| 43 BrightnessConnection self = static_cast<BrightnessConnection>(data); |
| 44 if (dbus_message_is_signal(message, |
| 45 power_manager::kPowerManagerInterface, |
| 46 power_manager::kBrightnessChangedSignal)) { |
| 47 DBusError error; |
| 48 dbus_error_init(&error); |
| 49 int brightness_level = 0; |
| 50 if (dbus_message_get_args(message, &error, |
| 51 DBUS_TYPE_INT32, &brightness_level, |
| 52 DBUS_TYPE_INVALID)) { |
| 53 self->monitor_function_(self->object_, brightness_level); |
| 54 } else { |
| 55 LOG(WARNING) << "Unable to read brightness level from " |
| 56 << power_manager::kBrightnessChangedSignal << " signal"; |
| 57 } |
| 58 return DBUS_HANDLER_RESULT_HANDLED; |
| 59 } else { |
| 60 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
| 61 } |
| 62 } |
| 63 |
| 64 private: |
| 65 // Function within Chrome that we invoke when the brightness changes. |
| 66 BrightnessMonitorFunction monitor_function_; |
| 67 |
| 68 // Opaque pointer supplied to ChromeOSMonitorBrightness() that we pass back |
| 69 // via |monitor_function_|. |
| 70 void* object_; |
| 71 }; |
| 72 |
| 73 extern "C" |
| 74 BrightnessConnection ChromeOSMonitorBrightness( |
| 75 BrightnessMonitorFunction monitor_function, void* object) { |
| 76 BrightnessConnection connection = |
| 77 new OpaqueBrightnessConnection(monitor_function, object); |
| 78 |
| 79 // Snoop on D-Bus messages so we can get notified about brightness changes. |
| 80 DBusConnection* dbus_conn = |
| 81 dbus_g_connection_get_connection( |
| 82 dbus::GetSystemBusConnection().g_connection()); |
| 83 DCHECK(dbus_conn); |
| 84 |
| 85 DBusError error; |
| 86 dbus_error_init(&error); |
| 87 dbus_bus_add_match(dbus_conn, GetDBusMatchString().c_str(), &error); |
| 88 if (dbus_error_is_set(&error)) { |
| 89 LOG(DFATAL) << "Got error while adding D-Bus match rule: " << error.name |
| 90 << " (" << error.message << ")"; |
| 91 } |
| 92 |
| 93 if (!dbus_connection_add_filter( |
| 94 dbus_conn, |
| 95 &OpaqueBrightnessConnection::FilterDBusMessage, |
| 96 connection, // user_data |
| 97 NULL)) { // free_data_function |
| 98 LOG(DFATAL) << "Unable to add D-Bus filter"; |
| 99 } |
| 100 |
| 101 return connection; |
| 102 } |
| 103 |
| 104 extern "C" |
| 105 void ChromeOSDisconnectBrightness(BrightnessConnection connection) { |
| 106 DCHECK(connection); |
| 107 |
| 108 DBusConnection* dbus_conn = |
| 109 dbus_g_connection_get_connection( |
| 110 dbus::GetSystemBusConnection().g_connection()); |
| 111 DCHECK(dbus_conn); |
| 112 |
| 113 dbus_connection_remove_filter( |
| 114 dbus_conn, |
| 115 &OpaqueBrightnessConnection::FilterDBusMessage, |
| 116 connection); |
| 117 delete connection; |
| 118 |
| 119 DBusError error; |
| 120 dbus_error_init(&error); |
| 121 dbus_bus_remove_match(dbus_conn, GetDBusMatchString().c_str(), &error); |
| 122 if (dbus_error_is_set(&error)) { |
| 123 LOG(DFATAL) << "Got error while removing D-Bus match rule: " << error.name |
| 124 << " (" << error.message << ")"; |
| 125 } |
| 126 } |
| 127 |
| 128 } // namespace chromeos |
OLD | NEW |