| 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 "services/shell/shell.h" | 5 #include "services/shell/shell.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 instance->StartWithClient(std::move(client)); | 469 instance->StartWithClient(std::move(client)); |
| 470 singletons_.insert(kShellName); | 470 singletons_.insert(kShellName); |
| 471 shell_connection_.reset(new ShellConnection(this, std::move(request))); | 471 shell_connection_.reset(new ShellConnection(this, std::move(request))); |
| 472 | 472 |
| 473 if (catalog) | 473 if (catalog) |
| 474 InitCatalog(std::move(catalog)); | 474 InitCatalog(std::move(catalog)); |
| 475 } | 475 } |
| 476 | 476 |
| 477 Shell::~Shell() { | 477 Shell::~Shell() { |
| 478 TerminateShellConnections(); | 478 TerminateShellConnections(); |
| 479 // Terminate any remaining instances. |
| 480 while (!identity_to_instance_.empty()) |
| 481 OnInstanceError(identity_to_instance_.begin()->second); |
| 482 identity_to_resolver_.clear(); |
| 479 for (auto& runner : native_runners_) | 483 for (auto& runner : native_runners_) |
| 480 runner.reset(); | 484 runner.reset(); |
| 481 } | 485 } |
| 482 | 486 |
| 483 void Shell::SetInstanceQuitCallback( | 487 void Shell::SetInstanceQuitCallback( |
| 484 base::Callback<void(const Identity&)> callback) { | 488 base::Callback<void(const Identity&)> callback) { |
| 485 instance_quit_callback_ = callback; | 489 instance_quit_callback_ = callback; |
| 486 } | 490 } |
| 487 | 491 |
| 488 void Shell::Connect(std::unique_ptr<ConnectParams> params) { | 492 void Shell::Connect(std::unique_ptr<ConnectParams> params) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 instance->StartWithClient(std::move(catalog)); | 538 instance->StartWithClient(std::move(catalog)); |
| 535 | 539 |
| 536 // TODO(beng): this doesn't work anymore. | 540 // TODO(beng): this doesn't work anymore. |
| 537 // Seed the catalog with manifest info for the shell & catalog. | 541 // Seed the catalog with manifest info for the shell & catalog. |
| 538 mojom::ShellResolverPtr resolver; | 542 mojom::ShellResolverPtr resolver; |
| 539 shell_connection_->connector()->ConnectToInterface(kCatalogName, &resolver); | 543 shell_connection_->connector()->ConnectToInterface(kCatalogName, &resolver); |
| 540 resolver->ResolveMojoName(kCatalogName, base::Bind(&EmptyResolverCallback)); | 544 resolver->ResolveMojoName(kCatalogName, base::Bind(&EmptyResolverCallback)); |
| 541 resolver->ResolveMojoName(kShellName, base::Bind(&EmptyResolverCallback)); | 545 resolver->ResolveMojoName(kShellName, base::Bind(&EmptyResolverCallback)); |
| 542 } | 546 } |
| 543 | 547 |
| 548 mojom::ShellResolver* Shell::GetResolver(const Identity& identity) { |
| 549 auto iter = identity_to_resolver_.find(identity); |
| 550 if (iter != identity_to_resolver_.end()) |
| 551 return iter->second.get(); |
| 552 |
| 553 mojom::ShellResolverPtr resolver_ptr; |
| 554 ConnectToInterface(this, identity, CreateCatalogIdentity(), &resolver_ptr); |
| 555 mojom::ShellResolver* resolver = resolver_ptr.get(); |
| 556 identity_to_resolver_[identity] = std::move(resolver_ptr); |
| 557 return resolver; |
| 558 } |
| 559 |
| 544 void Shell::TerminateShellConnections() { | 560 void Shell::TerminateShellConnections() { |
| 545 Instance* instance = GetExistingInstance(CreateShellIdentity()); | 561 Instance* instance = GetExistingInstance(CreateShellIdentity()); |
| 546 DCHECK(instance); | 562 DCHECK(instance); |
| 547 OnInstanceError(instance); | 563 OnInstanceError(instance); |
| 548 } | 564 } |
| 549 | 565 |
| 550 void Shell::OnInstanceError(Instance* instance) { | 566 void Shell::OnInstanceError(Instance* instance) { |
| 551 const Identity identity = instance->identity(); | 567 const Identity identity = instance->identity(); |
| 552 // Remove the shell. | 568 // Remove the shell. |
| 553 auto it = identity_to_instance_.find(identity); | 569 auto it = identity_to_instance_.find(identity); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 573 DCHECK(!client.is_bound() || !identity_to_instance_.count(params->target())); | 589 DCHECK(!client.is_bound() || !identity_to_instance_.count(params->target())); |
| 574 | 590 |
| 575 // Connect to an existing matching instance, if possible. | 591 // Connect to an existing matching instance, if possible. |
| 576 if (!client.is_bound() && ConnectToExistingInstance(¶ms)) | 592 if (!client.is_bound() && ConnectToExistingInstance(¶ms)) |
| 577 return; | 593 return; |
| 578 | 594 |
| 579 // The catalog needs to see the source identity as that of the originating | 595 // The catalog needs to see the source identity as that of the originating |
| 580 // app so it loads the correct store. Since the catalog is itself run as root | 596 // app so it loads the correct store. Since the catalog is itself run as root |
| 581 // when this re-enters Connect() it'll be handled by | 597 // when this re-enters Connect() it'll be handled by |
| 582 // ConnectToExistingInstance(). | 598 // ConnectToExistingInstance(). |
| 583 mojom::ShellResolverPtr resolver; | 599 mojom::ShellResolver* resolver = |
| 584 ConnectToInterface(this, Identity(kShellName, params->target().user_id()), | 600 GetResolver(Identity(kShellName, params->target().user_id())); |
| 585 CreateCatalogIdentity(), &resolver); | |
| 586 | 601 |
| 587 std::string name = params->target().name(); | 602 std::string name = params->target().name(); |
| 588 mojom::ShellResolver* resolver_raw = resolver.get(); | 603 resolver->ResolveMojoName( |
| 589 resolver_raw->ResolveMojoName( | |
| 590 name, base::Bind(&shell::Shell::OnGotResolvedName, | 604 name, base::Bind(&shell::Shell::OnGotResolvedName, |
| 591 weak_ptr_factory_.GetWeakPtr(), | 605 weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms), |
| 592 base::Passed(std::move(resolver)), base::Passed(¶ms), | |
| 593 base::Passed(&client))); | 606 base::Passed(&client))); |
| 594 } | 607 } |
| 595 | 608 |
| 596 Shell::Instance* Shell::GetExistingInstance(const Identity& identity) const { | 609 Shell::Instance* Shell::GetExistingInstance(const Identity& identity) const { |
| 597 const auto& it = identity_to_instance_.find(identity); | 610 const auto& it = identity_to_instance_.find(identity); |
| 598 Instance* instance = it != identity_to_instance_.end() ? it->second : nullptr; | 611 Instance* instance = it != identity_to_instance_.end() ? it->second : nullptr; |
| 599 if (instance) | 612 if (instance) |
| 600 return instance; | 613 return instance; |
| 601 | 614 |
| 602 if (singletons_.find(identity.name()) != singletons_.end()) { | 615 if (singletons_.find(identity.name()) != singletons_.end()) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 return factory_interface; | 691 return factory_interface; |
| 679 } | 692 } |
| 680 | 693 |
| 681 void Shell::OnShellClientFactoryLost(const Identity& which) { | 694 void Shell::OnShellClientFactoryLost(const Identity& which) { |
| 682 // Remove the mapping. | 695 // Remove the mapping. |
| 683 auto it = shell_client_factories_.find(which); | 696 auto it = shell_client_factories_.find(which); |
| 684 DCHECK(it != shell_client_factories_.end()); | 697 DCHECK(it != shell_client_factories_.end()); |
| 685 shell_client_factories_.erase(it); | 698 shell_client_factories_.erase(it); |
| 686 } | 699 } |
| 687 | 700 |
| 688 void Shell::OnGotResolvedName(mojom::ShellResolverPtr resolver, | 701 void Shell::OnGotResolvedName(std::unique_ptr<ConnectParams> params, |
| 689 std::unique_ptr<ConnectParams> params, | |
| 690 mojom::ShellClientPtr client, | 702 mojom::ShellClientPtr client, |
| 691 mojom::ResolveResultPtr result) { | 703 mojom::ResolveResultPtr result) { |
| 692 std::string instance_name = params->target().instance(); | 704 std::string instance_name = params->target().instance(); |
| 693 if (instance_name == GetNamePath(params->target().name()) && | 705 if (instance_name == GetNamePath(params->target().name()) && |
| 694 result->qualifier != GetNamePath(result->resolved_name)) { | 706 result->qualifier != GetNamePath(result->resolved_name)) { |
| 695 instance_name = result->qualifier; | 707 instance_name = result->qualifier; |
| 696 } | 708 } |
| 697 Identity target(params->target().name(), params->target().user_id(), | 709 Identity target(params->target().name(), params->target().user_id(), |
| 698 instance_name); | 710 instance_name); |
| 699 params->set_target(target); | 711 params->set_target(target); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 768 void Shell::CleanupRunner(NativeRunner* runner) { | 780 void Shell::CleanupRunner(NativeRunner* runner) { |
| 769 for (auto it = native_runners_.begin(); it != native_runners_.end(); ++it) { | 781 for (auto it = native_runners_.begin(); it != native_runners_.end(); ++it) { |
| 770 if (it->get() == runner) { | 782 if (it->get() == runner) { |
| 771 native_runners_.erase(it); | 783 native_runners_.erase(it); |
| 772 return; | 784 return; |
| 773 } | 785 } |
| 774 } | 786 } |
| 775 } | 787 } |
| 776 | 788 |
| 777 } // namespace shell | 789 } // namespace shell |
| OLD | NEW |