Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/dbus/dbus.h" | 5 #include "chromeos/dbus/dbus.h" |
| 6 | 6 |
| 7 #include <base/stringprintf.h> | |
|
Daniel Erat
2011/02/10 23:07:24
nit: alphabetize these
(technically, i think that
glotov
2011/02/11 16:36:52
Done.
| |
| 8 #include <base/logging.h> | |
| 9 #include <dbus/dbus-glib-bindings.h> | |
| 7 #include <dbus/dbus.h> | 10 #include <dbus/dbus.h> |
| 8 #include <dbus/dbus-glib-bindings.h> | |
| 9 #include <dbus/dbus-glib-lowlevel.h> | |
| 10 #include <base/logging.h> | |
| 11 | 11 |
| 12 namespace chromeos { | 12 namespace chromeos { |
| 13 namespace dbus { | 13 namespace dbus { |
| 14 | 14 |
| 15 bool CallPtrArray(const Proxy& proxy, | 15 bool CallPtrArray(const Proxy& proxy, |
| 16 const char* method, | 16 const char* method, |
| 17 glib::ScopedPtrArray<const char*>* result) { | 17 glib::ScopedPtrArray<const char*>* result) { |
| 18 glib::ScopedError error; | 18 glib::ScopedError error; |
| 19 | 19 |
| 20 ::GType g_type_array = ::dbus_g_type_get_collection("GPtrArray", | 20 ::GType g_type_array = ::dbus_g_type_get_collection("GPtrArray", |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 249 LOG(ERROR) << "Failed to create a signal: " | 249 LOG(ERROR) << "Failed to create a signal: " |
| 250 << "path: " << path << ", " | 250 << "path: " << path << ", " |
| 251 << "interface_name: " << interface_name << ", " | 251 << "interface_name: " << interface_name << ", " |
| 252 << "signal_name: " << signal_name; | 252 << "signal_name: " << signal_name; |
| 253 return; | 253 return; |
| 254 } | 254 } |
| 255 ::dbus_g_proxy_send(proxy.gproxy(), signal, NULL); | 255 ::dbus_g_proxy_send(proxy.gproxy(), signal, NULL); |
| 256 ::dbus_message_unref(signal); | 256 ::dbus_message_unref(signal); |
| 257 } | 257 } |
| 258 | 258 |
| 259 void MonitorSignal::StartMonitoring(const char* interface, | |
| 260 const char* signal) { | |
| 261 DCHECK(!interface_) << "StartMonitoring() must be called only once"; | |
| 262 interface_ = interface; | |
| 263 signal_ = signal; | |
| 264 | |
| 265 // Snoop on D-Bus messages so we can get notified about brightness changes. | |
|
Daniel Erat
2011/02/10 23:07:24
remove the part about brightness here
glotov
2011/02/11 16:36:52
Done.
| |
| 266 DBusConnection* dbus_conn = dbus_g_connection_get_connection( | |
| 267 GetSystemBusConnection().g_connection()); | |
| 268 DCHECK(dbus_conn); | |
| 269 | |
| 270 DBusError error; | |
| 271 dbus_error_init(&error); | |
| 272 dbus_bus_add_match(dbus_conn, GetDBusMatchString().c_str(), &error); | |
| 273 if (dbus_error_is_set(&error)) { | |
| 274 LOG(DFATAL) << "Got error while adding D-Bus match rule: " << error.name | |
| 275 << " (" << error.message << ")"; | |
| 276 } | |
| 277 | |
| 278 if (!dbus_connection_add_filter(dbus_conn, | |
| 279 &MonitorSignal::FilterDBusMessage, | |
| 280 this, // user_data | |
| 281 NULL)) { // free_data_function | |
| 282 LOG(DFATAL) << "Unable to add D-Bus filter"; | |
| 283 } | |
| 284 } | |
| 285 | |
| 286 MonitorSignal::~MonitorSignal() { | |
| 287 DBusConnection* dbus_conn = dbus_g_connection_get_connection( | |
| 288 dbus::GetSystemBusConnection().g_connection()); | |
| 289 DCHECK(dbus_conn); | |
| 290 | |
| 291 dbus_connection_remove_filter(dbus_conn, | |
| 292 &MonitorSignal::FilterDBusMessage, | |
| 293 this); | |
| 294 | |
| 295 DBusError error; | |
| 296 dbus_error_init(&error); | |
| 297 dbus_bus_remove_match(dbus_conn, GetDBusMatchString().c_str(), &error); | |
|
Daniel Erat
2011/02/10 23:07:24
i think that you'll segfault right now if someone
glotov
2011/02/11 16:36:52
Done.
| |
| 298 if (dbus_error_is_set(&error)) { | |
| 299 LOG(DFATAL) << "Got error while removing D-Bus match rule: " << error.name | |
| 300 << " (" << error.message << ")"; | |
| 301 } | |
| 302 } | |
| 303 | |
| 304 std::string MonitorSignal::GetDBusMatchString() const { | |
| 305 return StringPrintf("type='signal', interface='%s', member='%s'", | |
| 306 interface_, signal_); | |
| 307 } | |
| 308 | |
| 309 /* static */ | |
| 310 DBusHandlerResult MonitorSignal::FilterDBusMessage(DBusConnection* dbus_conn, | |
| 311 DBusMessage* message, | |
| 312 void* data) { | |
| 313 MonitorSignal* self = static_cast<MonitorSignal*>(data); | |
| 314 if (dbus_message_is_signal(message, self->interface_, self->signal_)) { | |
| 315 self->OnSignal(message); | |
| 316 return DBUS_HANDLER_RESULT_HANDLED; | |
| 317 } else { | |
| 318 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | |
| 319 } | |
| 320 } | |
| 321 | |
| 259 } // namespace dbus | 322 } // namespace dbus |
| 260 } // namespace chromeos | 323 } // namespace chromeos |
| OLD | NEW |