OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium 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 "dbus/bus.h" | 5 #include "dbus/bus.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 // We should add the filter only once. Otherwise, HandleMessage() will | 297 // We should add the filter only once. Otherwise, HandleMessage() will |
298 // be called more than once. | 298 // be called more than once. |
299 if (!filter_added_) { | 299 if (!filter_added_) { |
300 if (bus_->AddFilterFunction(&ObjectProxy::HandleMessageThunk, this)) { | 300 if (bus_->AddFilterFunction(&ObjectProxy::HandleMessageThunk, this)) { |
301 filter_added_ = true; | 301 filter_added_ = true; |
302 } else { | 302 } else { |
303 LOG(ERROR) << "Failed to add filter function"; | 303 LOG(ERROR) << "Failed to add filter function"; |
304 } | 304 } |
305 } | 305 } |
306 // Add a match rule so the signal goes through HandleMessage(). | 306 // Add a match rule so the signal goes through HandleMessage(). |
307 // | |
308 // We don't restrict the sender object path to be |object_path_| here, | |
309 // to make it easy to test D-Bus signal handling with dbus-send, that | |
310 // uses "/" as the sender object path. We can make the object path | |
311 // restriction customizable when it becomes necessary. | |
312 const std::string match_rule = | 307 const std::string match_rule = |
313 base::StringPrintf("type='signal', interface='%s'", | 308 base::StringPrintf("type='signal', interface='%s', path='%s'", |
314 interface_name.c_str()); | 309 interface_name.c_str(), |
| 310 object_path_.value().c_str()); |
315 | 311 |
316 // Add the match rule if we don't have it. | 312 // Add the match rule if we don't have it. |
317 if (match_rules_.find(match_rule) == match_rules_.end()) { | 313 if (match_rules_.find(match_rule) == match_rules_.end()) { |
318 ScopedDBusError error; | 314 ScopedDBusError error; |
319 bus_->AddMatch(match_rule, error.get());; | 315 bus_->AddMatch(match_rule, error.get());; |
320 if (error.is_set()) { | 316 if (error.is_set()) { |
321 LOG(ERROR) << "Failed to add match rule: " << match_rule; | 317 LOG(ERROR) << "Failed to add match rule: " << match_rule; |
322 } else { | 318 } else { |
323 // Store the match rule, so that we can remove this in Detach(). | 319 // Store the match rule, so that we can remove this in Detach(). |
324 match_rules_.insert(match_rule); | 320 match_rules_.insert(match_rule); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 bus_->AssertOnDBusThread(); | 355 bus_->AssertOnDBusThread(); |
360 if (dbus_message_get_type(raw_message) != DBUS_MESSAGE_TYPE_SIGNAL) | 356 if (dbus_message_get_type(raw_message) != DBUS_MESSAGE_TYPE_SIGNAL) |
361 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | 357 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
362 | 358 |
363 // raw_message will be unrefed on exit of the function. Increment the | 359 // raw_message will be unrefed on exit of the function. Increment the |
364 // reference so we can use it in Signal. | 360 // reference so we can use it in Signal. |
365 dbus_message_ref(raw_message); | 361 dbus_message_ref(raw_message); |
366 scoped_ptr<Signal> signal( | 362 scoped_ptr<Signal> signal( |
367 Signal::FromRawMessage(raw_message)); | 363 Signal::FromRawMessage(raw_message)); |
368 | 364 |
| 365 // Verify the signal comes from the object we're proxying for, this is |
| 366 // our last chance to return DBUS_HANDLER_RESULT_NOT_YET_HANDLED and |
| 367 // allow other object proxies to handle instead. |
| 368 const dbus::ObjectPath path = signal->GetPath(); |
| 369 if (path != object_path_) { |
| 370 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
| 371 } |
| 372 |
369 const std::string interface = signal->GetInterface(); | 373 const std::string interface = signal->GetInterface(); |
370 const std::string member = signal->GetMember(); | 374 const std::string member = signal->GetMember(); |
371 | 375 |
372 // Check if we know about the signal. | 376 // Check if we know about the signal. |
373 const std::string absolute_signal_name = GetAbsoluteSignalName( | 377 const std::string absolute_signal_name = GetAbsoluteSignalName( |
374 interface, member); | 378 interface, member); |
375 MethodTable::const_iterator iter = method_table_.find(absolute_signal_name); | 379 MethodTable::const_iterator iter = method_table_.find(absolute_signal_name); |
376 if (iter == method_table_.end()) { | 380 if (iter == method_table_.end()) { |
377 // Don't know about the signal. | 381 // Don't know about the signal. |
378 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | 382 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 void ObjectProxy::LogMethodCallFailure( | 429 void ObjectProxy::LogMethodCallFailure( |
426 const base::StringPiece& error_name, | 430 const base::StringPiece& error_name, |
427 const base::StringPiece& error_message) const { | 431 const base::StringPiece& error_message) const { |
428 if (ignore_service_unknown_errors_ && error_name == kErrorServiceUnknown) | 432 if (ignore_service_unknown_errors_ && error_name == kErrorServiceUnknown) |
429 return; | 433 return; |
430 LOG(ERROR) << "Failed to call method: " << error_name | 434 LOG(ERROR) << "Failed to call method: " << error_name |
431 << ": " << error_message; | 435 << ": " << error_message; |
432 } | 436 } |
433 | 437 |
434 } // namespace dbus | 438 } // namespace dbus |
OLD | NEW |