| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // TODO(satorux): | 5 // TODO(satorux): |
| 6 // - Handle "disconnected" signal. | 6 // - Handle "disconnected" signal. |
| 7 // - Collect metrics (ex. # of method calls, method call time, etc.) | 7 // - Collect metrics (ex. # of method calls, method call time, etc.) |
| 8 | 8 |
| 9 #include "dbus/bus.h" | 9 #include "dbus/bus.h" |
| 10 | 10 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 } | 175 } |
| 176 | 176 |
| 177 Bus::Bus(const Options& options) | 177 Bus::Bus(const Options& options) |
| 178 : bus_type_(options.bus_type), | 178 : bus_type_(options.bus_type), |
| 179 connection_type_(options.connection_type), | 179 connection_type_(options.connection_type), |
| 180 dbus_thread_(options.dbus_thread), | 180 dbus_thread_(options.dbus_thread), |
| 181 connection_(NULL), | 181 connection_(NULL), |
| 182 origin_loop_(MessageLoop::current()), | 182 origin_loop_(MessageLoop::current()), |
| 183 origin_thread_id_(base::PlatformThread::CurrentId()), | 183 origin_thread_id_(base::PlatformThread::CurrentId()), |
| 184 dbus_thread_id_(base::kInvalidThreadId), | 184 dbus_thread_id_(base::kInvalidThreadId), |
| 185 async_operations_are_set_up_(false), | 185 async_operations_set_up_(false), |
| 186 num_pending_watches_(0), | 186 num_pending_watches_(0), |
| 187 num_pending_timeouts_(0) { | 187 num_pending_timeouts_(0) { |
| 188 if (dbus_thread_) { | 188 if (dbus_thread_) { |
| 189 dbus_thread_id_ = dbus_thread_->thread_id(); | 189 dbus_thread_id_ = dbus_thread_->thread_id(); |
| 190 DCHECK(dbus_thread_->IsRunning()) | 190 DCHECK(dbus_thread_->IsRunning()) |
| 191 << "The D-Bus thread should be running"; | 191 << "The D-Bus thread should be running"; |
| 192 DCHECK_EQ(MessageLoop::TYPE_IO, | 192 DCHECK_EQ(MessageLoop::TYPE_IO, |
| 193 dbus_thread_->message_loop()->type()) | 193 dbus_thread_->message_loop()->type()) |
| 194 << "The D-Bus thread should have an MessageLoopForIO attached"; | 194 << "The D-Bus thread should have an MessageLoopForIO attached"; |
| 195 } | 195 } |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 LOG(ERROR) << "Failed to release the onwership of " << service_name << ": " | 363 LOG(ERROR) << "Failed to release the onwership of " << service_name << ": " |
| 364 << (error.is_set() ? error.message() : ""); | 364 << (error.is_set() ? error.message() : ""); |
| 365 return false; | 365 return false; |
| 366 } | 366 } |
| 367 } | 367 } |
| 368 | 368 |
| 369 bool Bus::SetUpAsyncOperations() { | 369 bool Bus::SetUpAsyncOperations() { |
| 370 DCHECK(connection_); | 370 DCHECK(connection_); |
| 371 AssertOnDBusThread(); | 371 AssertOnDBusThread(); |
| 372 | 372 |
| 373 if (async_operations_are_set_up_) | 373 if (async_operations_set_up_) |
| 374 return true; | 374 return true; |
| 375 | 375 |
| 376 // Process all the incoming data if any, so that OnDispatchStatus() will | 376 // Process all the incoming data if any, so that OnDispatchStatus() will |
| 377 // be called when the incoming data is ready. | 377 // be called when the incoming data is ready. |
| 378 ProcessAllIncomingDataIfAny(); | 378 ProcessAllIncomingDataIfAny(); |
| 379 | 379 |
| 380 bool success = dbus_connection_set_watch_functions(connection_, | 380 bool success = dbus_connection_set_watch_functions(connection_, |
| 381 &Bus::OnAddWatchThunk, | 381 &Bus::OnAddWatchThunk, |
| 382 &Bus::OnRemoveWatchThunk, | 382 &Bus::OnRemoveWatchThunk, |
| 383 &Bus::OnToggleWatchThunk, | 383 &Bus::OnToggleWatchThunk, |
| 384 this, | 384 this, |
| 385 NULL); | 385 NULL); |
| 386 CHECK(success) << "Unable to allocate memory"; | 386 CHECK(success) << "Unable to allocate memory"; |
| 387 | 387 |
| 388 // TODO(satorux): Timeout is not yet implemented. | 388 // TODO(satorux): Timeout is not yet implemented. |
| 389 success = dbus_connection_set_timeout_functions(connection_, | 389 success = dbus_connection_set_timeout_functions(connection_, |
| 390 &Bus::OnAddTimeoutThunk, | 390 &Bus::OnAddTimeoutThunk, |
| 391 &Bus::OnRemoveTimeoutThunk, | 391 &Bus::OnRemoveTimeoutThunk, |
| 392 &Bus::OnToggleTimeoutThunk, | 392 &Bus::OnToggleTimeoutThunk, |
| 393 this, | 393 this, |
| 394 NULL); | 394 NULL); |
| 395 CHECK(success) << "Unable to allocate memory"; | 395 CHECK(success) << "Unable to allocate memory"; |
| 396 | 396 |
| 397 dbus_connection_set_dispatch_status_function( | 397 dbus_connection_set_dispatch_status_function( |
| 398 connection_, | 398 connection_, |
| 399 &Bus::OnDispatchStatusChangedThunk, | 399 &Bus::OnDispatchStatusChangedThunk, |
| 400 this, | 400 this, |
| 401 NULL); | 401 NULL); |
| 402 | 402 |
| 403 async_operations_are_set_up_ = true; | 403 async_operations_set_up_ = true; |
| 404 | 404 |
| 405 return true; | 405 return true; |
| 406 } | 406 } |
| 407 | 407 |
| 408 DBusMessage* Bus::SendWithReplyAndBlock(DBusMessage* request, | 408 DBusMessage* Bus::SendWithReplyAndBlock(DBusMessage* request, |
| 409 int timeout_ms, | 409 int timeout_ms, |
| 410 DBusError* error) { | 410 DBusError* error) { |
| 411 DCHECK(connection_); | 411 DCHECK(connection_); |
| 412 AssertOnDBusThread(); | 412 AssertOnDBusThread(); |
| 413 | 413 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 match_rules_added_.erase(match_rule); | 493 match_rules_added_.erase(match_rule); |
| 494 } | 494 } |
| 495 | 495 |
| 496 bool Bus::TryRegisterObjectPath(const std::string& object_path, | 496 bool Bus::TryRegisterObjectPath(const std::string& object_path, |
| 497 const DBusObjectPathVTable* vtable, | 497 const DBusObjectPathVTable* vtable, |
| 498 void* user_data, | 498 void* user_data, |
| 499 DBusError* error) { | 499 DBusError* error) { |
| 500 DCHECK(connection_); | 500 DCHECK(connection_); |
| 501 AssertOnDBusThread(); | 501 AssertOnDBusThread(); |
| 502 | 502 |
| 503 DCHECK(registered_object_paths_.find(object_path) == | 503 if (registered_object_paths_.find(object_path) != |
| 504 registered_object_paths_.end()) | 504 registered_object_paths_.end()) { |
| 505 << "Object path already registered: " << object_path; | 505 LOG(ERROR) << "Object path already registered: " << object_path; |
| 506 return false; |
| 507 } |
| 506 | 508 |
| 507 const bool success = dbus_connection_try_register_object_path( | 509 const bool success = dbus_connection_try_register_object_path( |
| 508 connection_, | 510 connection_, |
| 509 object_path.c_str(), | 511 object_path.c_str(), |
| 510 vtable, | 512 vtable, |
| 511 user_data, | 513 user_data, |
| 512 error); | 514 error); |
| 513 if (success) | 515 if (success) |
| 514 registered_object_paths_.insert(object_path); | 516 registered_object_paths_.insert(object_path); |
| 515 return success; | 517 return success; |
| 516 } | 518 } |
| 517 | 519 |
| 518 void Bus::UnregisterObjectPath(const std::string& object_path) { | 520 void Bus::UnregisterObjectPath(const std::string& object_path) { |
| 519 DCHECK(connection_); | 521 DCHECK(connection_); |
| 520 AssertOnDBusThread(); | 522 AssertOnDBusThread(); |
| 521 | 523 |
| 522 DCHECK(registered_object_paths_.find(object_path) != | 524 if (registered_object_paths_.find(object_path) == |
| 523 registered_object_paths_.end()) | 525 registered_object_paths_.end()) { |
| 524 << "Requested to unregister an unknown object path: " << object_path; | 526 LOG(ERROR) << "Requested to unregister an unknown object path: " |
| 527 << object_path; |
| 528 return; |
| 529 } |
| 525 | 530 |
| 526 const bool success = dbus_connection_unregister_object_path( | 531 const bool success = dbus_connection_unregister_object_path( |
| 527 connection_, | 532 connection_, |
| 528 object_path.c_str()); | 533 object_path.c_str()); |
| 529 CHECK(success) << "Unable to allocate memory"; | 534 CHECK(success) << "Unable to allocate memory"; |
| 530 registered_object_paths_.erase(object_path); | 535 registered_object_paths_.erase(object_path); |
| 531 } | 536 } |
| 532 | 537 |
| 533 void Bus::ShutdownInternal(OnShutdownCallback callback) { | 538 void Bus::ShutdownInternal(OnShutdownCallback callback) { |
| 534 AssertOnDBusThread(); | 539 AssertOnDBusThread(); |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 } | 710 } |
| 706 | 711 |
| 707 void Bus::OnDispatchStatusChangedThunk(DBusConnection* connection, | 712 void Bus::OnDispatchStatusChangedThunk(DBusConnection* connection, |
| 708 DBusDispatchStatus status, | 713 DBusDispatchStatus status, |
| 709 void* data) { | 714 void* data) { |
| 710 Bus* self = static_cast<Bus*>(data); | 715 Bus* self = static_cast<Bus*>(data); |
| 711 return self->OnDispatchStatusChanged(connection, status); | 716 return self->OnDispatchStatusChanged(connection, status); |
| 712 } | 717 } |
| 713 | 718 |
| 714 } // namespace dbus | 719 } // namespace dbus |
| OLD | NEW |