Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(557)

Unified Diff: services/service_manager/public/cpp/lib/interface_registry.cc

Issue 2847743003: Eliminate InterfaceRegistry (Closed)
Patch Set: . Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/service_manager/public/cpp/lib/interface_registry.cc
diff --git a/services/service_manager/public/cpp/lib/interface_registry.cc b/services/service_manager/public/cpp/lib/interface_registry.cc
deleted file mode 100644
index e74df3c7e67e5c62af0ed5f9211628634dd214d3..0000000000000000000000000000000000000000
--- a/services/service_manager/public/cpp/lib/interface_registry.cc
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/service_manager/public/cpp/interface_registry.h"
-
-#include <iterator>
-#include <sstream>
-
-#include "base/memory/ptr_util.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace service_manager {
-namespace {
-
-void SerializeIdentity(const Identity& identity, std::stringstream* stream) {
- *stream << identity.name() << "@" << identity.instance() << " run as: "
- << identity.user_id();
-}
-
-void SerializeSpec(const InterfaceProviderSpec& spec,
- std::stringstream* stream) {
- *stream << " Providing:\n";
- for (const auto& entry : spec.provides) {
- *stream << " capability: " << entry.first << " containing interfaces:\n";
- for (const auto& interface_name : entry.second)
- *stream << " " << interface_name << "\n";
- }
- *stream << "\n Requiring:\n";
- for (const auto& entry : spec.requires) {
- *stream << " From: " << entry.first << ":\n";
- for (const auto& capability_name : entry.second)
- *stream << " " << capability_name << "\n";
- }
-}
-
-} // namespace
-
-CapabilitySet GetRequestedCapabilities(const InterfaceProviderSpec& source_spec,
- const Identity& target) {
- CapabilitySet capabilities;
-
- // Start by looking for specs specific to the supplied identity.
- auto it = source_spec.requires.find(target.name());
- if (it != source_spec.requires.end()) {
- std::copy(it->second.begin(), it->second.end(),
- std::inserter(capabilities, capabilities.begin()));
- }
-
- // Apply wild card rules too.
- it = source_spec.requires.find("*");
- if (it != source_spec.requires.end()) {
- std::copy(it->second.begin(), it->second.end(),
- std::inserter(capabilities, capabilities.begin()));
- }
- return capabilities;
-}
-
-InterfaceSet GetInterfacesToExpose(
- const InterfaceProviderSpec& source_spec,
- const Identity& target,
- const InterfaceProviderSpec& target_spec) {
- InterfaceSet exposed_interfaces;
- // TODO(beng): remove this once we can assert that an InterfaceRegistry must
- // always be constructed with a valid identity.
- if (!target.IsValid()) {
- exposed_interfaces.insert("*");
- return exposed_interfaces;
- }
- CapabilitySet capabilities = GetRequestedCapabilities(source_spec, target);
- for (const auto& capability : capabilities) {
- auto it = target_spec.provides.find(capability);
- if (it != target_spec.provides.end()) {
- for (const auto& interface_name : it->second)
- exposed_interfaces.insert(interface_name);
- }
- }
- return exposed_interfaces;
-}
-
-InterfaceRegistry::InterfaceRegistry(const std::string& name)
- : binding_(this),
- name_(name),
- weak_factory_(this) {}
-InterfaceRegistry::~InterfaceRegistry() {}
-
-void InterfaceRegistry::Bind(
- mojom::InterfaceProviderRequest local_interfaces_request,
- const Identity& local_identity,
- const InterfaceProviderSpec& local_interface_provider_spec,
- const Identity& remote_identity,
- const InterfaceProviderSpec& remote_interface_provider_spec) {
- DCHECK(!binding_.is_bound());
- local_identity_ = local_identity;
- local_interface_provider_spec_ = local_interface_provider_spec;
- remote_identity_ = remote_identity;
- remote_interface_provider_spec_ = remote_interface_provider_spec;
- RebuildExposedInterfaces();
- binding_.Bind(std::move(local_interfaces_request));
- binding_.set_connection_error_handler(base::Bind(
- &InterfaceRegistry::OnConnectionError, base::Unretained(this)));
-}
-
-void InterfaceRegistry::Serialize(std::stringstream* stream) {
- *stream << "\n\nInterfaceRegistry(" << name_ << "):\n";
- if (!binding_.is_bound()) {
- *stream << "\n --> InterfaceRegistry is not yet bound to a pipe.\n\n";
- return;
- }
-
- *stream << "Owned by:\n ";
- SerializeIdentity(local_identity_, stream);
- *stream << "\n\n";
- SerializeSpec(local_interface_provider_spec_, stream);
-
- *stream << "\n";
-
- *stream << "Bound to:\n ";
- SerializeIdentity(remote_identity_, stream);
- *stream << "\n\n";
- SerializeSpec(remote_interface_provider_spec_, stream);
-
- *stream << "\nBinders registered for:\n";
- bool found_exposed = false;
- for (const auto& entry : name_to_binder_) {
- bool exposed = exposed_interfaces_.count(entry.first) > 0;
- found_exposed |= exposed;
- *stream << " " << (exposed ? "* " : " ") << entry.first << "\n";
- }
- if (found_exposed)
- *stream << "\n * - denotes an interface exposed to remote per policy.\n";
-
- *stream << "\n\n";
- if (expose_all_interfaces_)
- *stream << "All interfaces exposed.\n\n";
-}
-
-base::WeakPtr<InterfaceRegistry> InterfaceRegistry::GetWeakPtr() {
- return weak_factory_.GetWeakPtr();
-}
-
-bool InterfaceRegistry::AddInterface(
- const std::string& name,
- const base::Callback<void(mojo::ScopedMessagePipeHandle)>& callback,
- const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
- return SetInterfaceBinderForName(
- base::MakeUnique<internal::GenericCallbackBinder>(callback, task_runner),
- name);
-}
-
-void InterfaceRegistry::RemoveInterface(const std::string& name) {
- auto it = name_to_binder_.find(name);
- if (it != name_to_binder_.end())
- name_to_binder_.erase(it);
-}
-
-void InterfaceRegistry::PauseBinding() {
- DCHECK(!is_paused_);
- is_paused_ = true;
-}
-
-void InterfaceRegistry::ResumeBinding() {
- DCHECK(is_paused_);
- is_paused_ = false;
-
- while (!pending_interface_requests_.empty()) {
- auto& request = pending_interface_requests_.front();
- GetInterface(request.first, std::move(request.second));
- pending_interface_requests_.pop();
- }
-}
-
-void InterfaceRegistry::GetInterfaceNames(
- std::set<std::string>* interface_names) {
- DCHECK(interface_names);
- for (auto& entry : name_to_binder_)
- interface_names->insert(entry.first);
-}
-
-void InterfaceRegistry::AddConnectionLostClosure(
- const base::Closure& connection_lost_closure) {
- connection_lost_closures_.push_back(connection_lost_closure);
-}
-
-void InterfaceRegistry::BindInterface(const std::string& name,
- mojo::ScopedMessagePipeHandle handle) {
- // NOTE: We don't expose GetInterface() publicly so as to avoid confusion
- // with local and remote binding requests.
- GetInterface(name, std::move(handle));
-}
-
-// mojom::InterfaceProvider:
-void InterfaceRegistry::GetInterface(const std::string& interface_name,
- mojo::ScopedMessagePipeHandle handle) {
- if (is_paused_) {
- pending_interface_requests_.emplace(interface_name, std::move(handle));
- return;
- }
-
- if (CanBindRequestForInterface(interface_name)) {
- auto iter = name_to_binder_.find(interface_name);
- if (iter != name_to_binder_.end()) {
- iter->second->BindInterface(remote_identity_,
- interface_name,
- std::move(handle));
- } else if (!default_binder_.is_null()) {
- default_binder_.Run(interface_name, std::move(handle));
- } else {
- LOG(ERROR) << "Failed to locate a binder for interface: "
- << interface_name << " requested by: " << remote_identity_.name()
- << " exposed by: " << local_identity_.name()
- << " via InterfaceProviderSpec \"" << name_ << "\".";
-
- std::stringstream details;
- Serialize(&details);
- DVLOG(1) << details.str();
- }
- } else {
- std::stringstream error;
- error << "InterfaceProviderSpec \"" << name_ << "\" prevented service: "
- << remote_identity_.name() << " from binding interface: "
- << interface_name << " exposed by: " << local_identity_.name();
- mojo::ReportBadMessage(error.str());
- LOG(ERROR) << error.str();
-
- std::stringstream details;
- Serialize(&details);
- DVLOG(1) << details.str();
- }
-}
-
-bool InterfaceRegistry::SetInterfaceBinderForName(
- std::unique_ptr<InterfaceBinder> binder,
- const std::string& interface_name) {
- if (CanBindRequestForInterface(interface_name)) {
- RemoveInterface(interface_name);
- name_to_binder_[interface_name] = std::move(binder);
- return true;
- }
- return false;
-}
-
-bool InterfaceRegistry::CanBindRequestForInterface(
- const std::string& interface_name) const {
- // Any interface may be registered before the registry is bound to a pipe. At
- // bind time, the interfaces exposed will be intersected with the requirements
- // of the source.
- if (!binding_.is_bound())
- return true;
- return expose_all_interfaces_ || exposed_interfaces_.count(interface_name);
-}
-
-void InterfaceRegistry::RebuildExposedInterfaces() {
- exposed_interfaces_ = GetInterfacesToExpose(remote_interface_provider_spec_,
- local_identity_,
- local_interface_provider_spec_);
- expose_all_interfaces_ =
- exposed_interfaces_.size() == 1 && exposed_interfaces_.count("*") == 1;
-}
-
-void InterfaceRegistry::OnConnectionError() {
- std::list<base::Closure> closures = connection_lost_closures_;
- for (const auto& closure : closures)
- closure.Run();
-}
-
-} // namespace service_manager
« no previous file with comments | « services/service_manager/public/cpp/interface_registry.h ('k') | services/service_manager/public/cpp/tests/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698