Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/object_manager.h" | 5 #include "dbus/object_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 } | 30 } |
| 31 | 31 |
| 32 ObjectManager::ObjectManager(Bus* bus, | 32 ObjectManager::ObjectManager(Bus* bus, |
| 33 const std::string& service_name, | 33 const std::string& service_name, |
| 34 const ObjectPath& object_path) | 34 const ObjectPath& object_path) |
| 35 : bus_(bus), | 35 : bus_(bus), |
| 36 service_name_(service_name), | 36 service_name_(service_name), |
| 37 object_path_(object_path), | 37 object_path_(object_path), |
| 38 setup_success_(false), | 38 setup_success_(false), |
| 39 cleanup_called_(false), | 39 cleanup_called_(false), |
| 40 service_initially_available_(false), | |
| 41 signals_are_connected_(false), | |
| 40 weak_ptr_factory_(this) { | 42 weak_ptr_factory_(this) { |
| 41 DVLOG(1) << "Creating ObjectManager for " << service_name_ | 43 DVLOG(1) << "Creating ObjectManager for " << service_name_ |
| 42 << " " << object_path_.value(); | 44 << " " << object_path_.value(); |
| 43 DCHECK(bus_); | 45 DCHECK(bus_); |
| 44 bus_->AssertOnOriginThread(); | 46 bus_->AssertOnOriginThread(); |
| 45 object_proxy_ = bus_->GetObjectProxy(service_name_, object_path_); | 47 object_proxy_ = bus_->GetObjectProxy(service_name_, object_path_); |
| 48 object_proxy_->WaitForServiceToBeAvailable( | |
| 49 base::Bind(&ObjectManager::OnServiceInitiallyAvailable, | |
| 50 weak_ptr_factory_.GetWeakPtr())); | |
| 46 object_proxy_->SetNameOwnerChangedCallback( | 51 object_proxy_->SetNameOwnerChangedCallback( |
| 47 base::Bind(&ObjectManager::NameOwnerChanged, | 52 base::Bind(&ObjectManager::NameOwnerChanged, |
| 48 weak_ptr_factory_.GetWeakPtr())); | 53 weak_ptr_factory_.GetWeakPtr())); |
| 49 | 54 |
| 50 // Set up a match rule and a filter function to handle PropertiesChanged | 55 // Set up a match rule and a filter function to handle PropertiesChanged |
| 51 // signals from the service. This is important to avoid any race conditions | 56 // signals from the service. This is important to avoid any race conditions |
| 52 // that might cause us to miss PropertiesChanged signals once all objects are | 57 // that might cause us to miss PropertiesChanged signals once all objects are |
| 53 // initialized via GetManagedObjects. | 58 // initialized via GetManagedObjects. |
| 54 base::PostTaskAndReplyWithResult( | 59 base::PostTaskAndReplyWithResult( |
| 55 bus_->GetDBusTaskRunner(), | 60 bus_->GetDBusTaskRunner(), |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 bus_->RemoveFilterFunction(&ObjectManager::HandleMessageThunk, this); | 165 bus_->RemoveFilterFunction(&ObjectManager::HandleMessageThunk, this); |
| 161 | 166 |
| 162 ScopedDBusError error; | 167 ScopedDBusError error; |
| 163 bus_->RemoveMatch(match_rule_, error.get()); | 168 bus_->RemoveMatch(match_rule_, error.get()); |
| 164 if (error.is_set()) | 169 if (error.is_set()) |
| 165 LOG(ERROR) << "Failed to remove match rule: " << match_rule_; | 170 LOG(ERROR) << "Failed to remove match rule: " << match_rule_; |
| 166 | 171 |
| 167 match_rule_.clear(); | 172 match_rule_.clear(); |
| 168 } | 173 } |
| 169 | 174 |
| 175 void ObjectManager::OnServiceInitiallyAvailable(bool service_is_available) { | |
| 176 if (!service_is_available) { | |
| 177 LOG(WARNING) << service_name_ << " " << object_path_.value() | |
| 178 << ": Failed to wait for service to become available"; | |
| 179 return; | |
| 180 } | |
| 181 | |
| 182 service_initially_available_ = true; | |
| 183 if (signals_are_connected_) | |
| 184 GetManagedObjects(); | |
| 185 } | |
| 186 | |
| 170 void ObjectManager::InitializeObjects() { | 187 void ObjectManager::InitializeObjects() { |
| 171 DCHECK(bus_); | 188 DCHECK(bus_); |
| 172 DCHECK(object_proxy_); | 189 DCHECK(object_proxy_); |
| 173 DCHECK(setup_success_); | 190 DCHECK(setup_success_); |
| 174 | 191 |
| 175 // |object_proxy_| is no longer valid if the Bus was shut down before this | 192 // |object_proxy_| is no longer valid if the Bus was shut down before this |
| 176 // call. Don't initiate any other action from the origin thread. | 193 // call. Don't initiate any other action from the origin thread. |
| 177 if (cleanup_called_) | 194 if (cleanup_called_) |
| 178 return; | 195 return; |
| 179 | 196 |
| 180 object_proxy_->ConnectToSignal( | 197 object_proxy_->ConnectToSignal( |
| 181 kObjectManagerInterface, | 198 kObjectManagerInterface, |
| 182 kObjectManagerInterfacesAdded, | 199 kObjectManagerInterfacesAdded, |
| 183 base::Bind(&ObjectManager::InterfacesAddedReceived, | 200 base::Bind(&ObjectManager::InterfacesAddedReceived, |
| 184 weak_ptr_factory_.GetWeakPtr()), | 201 weak_ptr_factory_.GetWeakPtr()), |
| 185 base::Bind(&ObjectManager::InterfacesAddedConnected, | 202 base::Bind(&ObjectManager::InterfacesAddedConnected, |
| 186 weak_ptr_factory_.GetWeakPtr())); | 203 weak_ptr_factory_.GetWeakPtr())); |
| 187 | 204 |
| 188 object_proxy_->ConnectToSignal( | 205 object_proxy_->ConnectToSignal( |
| 189 kObjectManagerInterface, | 206 kObjectManagerInterface, |
| 190 kObjectManagerInterfacesRemoved, | 207 kObjectManagerInterfacesRemoved, |
| 191 base::Bind(&ObjectManager::InterfacesRemovedReceived, | 208 base::Bind(&ObjectManager::InterfacesRemovedReceived, |
| 192 weak_ptr_factory_.GetWeakPtr()), | 209 weak_ptr_factory_.GetWeakPtr()), |
| 193 base::Bind(&ObjectManager::InterfacesRemovedConnected, | 210 base::Bind(&ObjectManager::InterfacesRemovedConnected, |
| 194 weak_ptr_factory_.GetWeakPtr())); | 211 weak_ptr_factory_.GetWeakPtr())); |
| 195 | 212 |
| 196 GetManagedObjects(); | 213 signals_are_connected_ = true; |
| 214 if (service_initially_available_) | |
| 215 GetManagedObjects(); | |
|
hashimoto
2016/09/01 03:26:07
How about calling WaitForServiceToBeAvailable() he
Daniel Erat
2016/09/01 04:15:55
thanks, that seems like a good suggestion! and no,
| |
| 197 } | 216 } |
| 198 | 217 |
| 199 bool ObjectManager::SetupMatchRuleAndFilter() { | 218 bool ObjectManager::SetupMatchRuleAndFilter() { |
| 200 DCHECK(bus_); | 219 DCHECK(bus_); |
| 201 DCHECK(!setup_success_); | 220 DCHECK(!setup_success_); |
| 202 bus_->AssertOnDBusThread(); | 221 bus_->AssertOnDBusThread(); |
| 203 | 222 |
| 204 if (cleanup_called_) | 223 if (cleanup_called_) |
| 205 return false; | 224 return false; |
| 206 | 225 |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 526 RemoveInterface(object_path, *iiter); | 545 RemoveInterface(object_path, *iiter); |
| 527 } | 546 } |
| 528 | 547 |
| 529 } | 548 } |
| 530 | 549 |
| 531 if (!new_owner.empty()) | 550 if (!new_owner.empty()) |
| 532 GetManagedObjects(); | 551 GetManagedObjects(); |
| 533 } | 552 } |
| 534 | 553 |
| 535 } // namespace dbus | 554 } // namespace dbus |
| OLD | NEW |