| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "mojo/shell/shell.h" | 5 #include "mojo/shell/shell.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 | 312 |
| 313 if (!(*client_process_connection)->shell_client.is_valid() || | 313 if (!(*client_process_connection)->shell_client.is_valid() || |
| 314 !(*client_process_connection)->pid_receiver_request.is_valid()) { | 314 !(*client_process_connection)->pid_receiver_request.is_valid()) { |
| 315 LOG(ERROR) << "Error: must supply both shell_client AND " | 315 LOG(ERROR) << "Error: must supply both shell_client AND " |
| 316 << "pid_receiver_request when sending " | 316 << "pid_receiver_request when sending " |
| 317 << "client_process_connection."; | 317 << "client_process_connection."; |
| 318 callback.Run(mojom::ConnectResult::INVALID_ARGUMENT, | 318 callback.Run(mojom::ConnectResult::INVALID_ARGUMENT, |
| 319 mojom::kInheritUserID, mojom::kInvalidInstanceID); | 319 mojom::kInheritUserID, mojom::kInvalidInstanceID); |
| 320 return false; | 320 return false; |
| 321 } | 321 } |
| 322 if (shell_->GetExistingOrRootInstance(target)) { | 322 if (shell_->GetExistingInstance(target)) { |
| 323 LOG(ERROR) << "Error: Cannot client process matching existing identity:" | 323 LOG(ERROR) << "Error: Cannot client process matching existing identity:" |
| 324 << "Name: " << target.name() << " User: " << target.user_id() | 324 << "Name: " << target.name() << " User: " << target.user_id() |
| 325 << " Instance: " << target.instance(); | 325 << " Instance: " << target.instance(); |
| 326 callback.Run(mojom::ConnectResult::INVALID_ARGUMENT, | 326 callback.Run(mojom::ConnectResult::INVALID_ARGUMENT, |
| 327 mojom::kInheritUserID, mojom::kInvalidInstanceID); | 327 mojom::kInheritUserID, mojom::kInvalidInstanceID); |
| 328 return false; | 328 return false; |
| 329 } | 329 } |
| 330 } | 330 } |
| 331 return true; | 331 return true; |
| 332 } | 332 } |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 mojom::ShellResolver* resolver_raw = resolver.get(); | 553 mojom::ShellResolver* resolver_raw = resolver.get(); |
| 554 resolver_raw->ResolveMojoName( | 554 resolver_raw->ResolveMojoName( |
| 555 name, | 555 name, |
| 556 base::Bind(&Shell::OnGotResolvedName, weak_ptr_factory_.GetWeakPtr(), | 556 base::Bind(&Shell::OnGotResolvedName, weak_ptr_factory_.GetWeakPtr(), |
| 557 base::Passed(std::move(resolver)), base::Passed(¶ms), | 557 base::Passed(std::move(resolver)), base::Passed(¶ms), |
| 558 base::Passed(&client))); | 558 base::Passed(&client))); |
| 559 } | 559 } |
| 560 | 560 |
| 561 Shell::Instance* Shell::GetExistingInstance(const Identity& identity) const { | 561 Shell::Instance* Shell::GetExistingInstance(const Identity& identity) const { |
| 562 const auto& it = identity_to_instance_.find(identity); | 562 const auto& it = identity_to_instance_.find(identity); |
| 563 return it != identity_to_instance_.end() ? it->second : nullptr; | 563 Instance* instance = it != identity_to_instance_.end() ? it->second : nullptr; |
| 564 } | 564 if (instance) |
| 565 return instance; |
| 565 | 566 |
| 566 Shell::Instance* Shell::GetExistingOrRootInstance( | 567 if (singletons_.find(identity.name()) != singletons_.end()) { |
| 567 const Identity& identity) const { | 568 for (auto entry : identity_to_instance_) { |
| 568 Instance* instance = GetExistingInstance(identity); | 569 if (entry.first.name() == identity.name() && |
| 569 if (!instance) { | 570 entry.first.instance() == identity.instance()) { |
| 570 if (singletons_.find(identity.name()) != singletons_.end()) { | 571 return entry.second; |
| 571 for (auto entry : identity_to_instance_) { | |
| 572 if (entry.first.name() == identity.name() && | |
| 573 entry.first.instance() == identity.instance()) { | |
| 574 return entry.second; | |
| 575 } | |
| 576 } | 572 } |
| 577 } | 573 } |
| 578 | |
| 579 Identity root_identity = identity; | |
| 580 root_identity.set_user_id(mojom::kRootUserID); | |
| 581 instance = GetExistingInstance(root_identity); | |
| 582 } | 574 } |
| 583 return instance; | 575 return nullptr; |
| 584 } | 576 } |
| 585 | 577 |
| 586 void Shell::NotifyPIDAvailable(uint32_t id, base::ProcessId pid) { | 578 void Shell::NotifyPIDAvailable(uint32_t id, base::ProcessId pid) { |
| 587 instance_listeners_.ForAllPtrs([id, pid](mojom::InstanceListener* listener) { | 579 instance_listeners_.ForAllPtrs([id, pid](mojom::InstanceListener* listener) { |
| 588 listener->InstancePIDAvailable(id, pid); | 580 listener->InstancePIDAvailable(id, pid); |
| 589 }); | 581 }); |
| 590 } | 582 } |
| 591 | 583 |
| 592 bool Shell::ConnectToExistingInstance(scoped_ptr<ConnectParams>* params) { | 584 bool Shell::ConnectToExistingInstance(scoped_ptr<ConnectParams>* params) { |
| 593 Instance* instance = GetExistingOrRootInstance((*params)->target()); | 585 Instance* instance = GetExistingInstance((*params)->target()); |
| 594 if (instance) | 586 if (instance) |
| 595 instance->ConnectToClient(std::move(*params)); | 587 instance->ConnectToClient(std::move(*params)); |
| 596 return !!instance; | 588 return !!instance; |
| 597 } | 589 } |
| 598 | 590 |
| 599 Shell::Instance* Shell::CreateInstance(const Identity& target, | 591 Shell::Instance* Shell::CreateInstance(const Identity& target, |
| 600 const CapabilitySpec& spec) { | 592 const CapabilitySpec& spec) { |
| 601 CHECK(target.user_id() != mojom::kInheritUserID); | 593 CHECK(target.user_id() != mojom::kInheritUserID); |
| 602 Instance* instance = new Instance(this, target, spec); | 594 Instance* instance = new Instance(this, target, spec); |
| 603 DCHECK(identity_to_instance_.find(target) == | 595 DCHECK(identity_to_instance_.find(target) == |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 for (auto it = native_runners_.begin(); it != native_runners_.end(); ++it) { | 740 for (auto it = native_runners_.begin(); it != native_runners_.end(); ++it) { |
| 749 if (it->get() == runner) { | 741 if (it->get() == runner) { |
| 750 native_runners_.erase(it); | 742 native_runners_.erase(it); |
| 751 return; | 743 return; |
| 752 } | 744 } |
| 753 } | 745 } |
| 754 } | 746 } |
| 755 | 747 |
| 756 } // namespace shell | 748 } // namespace shell |
| 757 } // namespace mojo | 749 } // namespace mojo |
| OLD | NEW |