OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/service_manager/public/cpp/interface_registry.h" | 5 #include "services/service_manager/public/cpp/interface_registry.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "mojo/public/cpp/bindings/message.h" | 10 #include "mojo/public/cpp/bindings/message.h" |
11 #include "services/service_manager/public/cpp/connection.h" | 11 #include "services/service_manager/public/cpp/connection.h" |
12 | 12 |
13 namespace service_manager { | 13 namespace service_manager { |
14 namespace { | 14 namespace { |
15 | 15 |
16 // Returns the set of capabilities required from the target. | 16 void SerializeIdentity(const Identity& identity, std::stringstream* stream) { |
| 17 *stream << identity.name() << "@" << identity.instance() << " run as: " |
| 18 << identity.user_id(); |
| 19 } |
| 20 |
| 21 void SerializeSpec(const InterfaceProviderSpec& spec, |
| 22 std::stringstream* stream) { |
| 23 *stream << " Providing:\n"; |
| 24 for (const auto& entry : spec.provides) { |
| 25 *stream << " capability: " << entry.first << " containing interfaces:\n"; |
| 26 for (const auto& interface_name : entry.second) |
| 27 *stream << " " << interface_name << "\n"; |
| 28 } |
| 29 *stream << "\n Requiring:\n"; |
| 30 for (const auto& entry : spec.requires) { |
| 31 *stream << " From: " << entry.first << ":\n"; |
| 32 for (const auto& capability_name : entry.second) |
| 33 *stream << " " << capability_name << "\n"; |
| 34 } |
| 35 } |
| 36 |
| 37 } // namespace |
| 38 |
17 CapabilitySet GetRequestedCapabilities(const InterfaceProviderSpec& source_spec, | 39 CapabilitySet GetRequestedCapabilities(const InterfaceProviderSpec& source_spec, |
18 const Identity& target) { | 40 const Identity& target) { |
19 CapabilitySet capabilities; | 41 CapabilitySet capabilities; |
20 | 42 |
21 // Start by looking for specs specific to the supplied identity. | 43 // Start by looking for specs specific to the supplied identity. |
22 auto it = source_spec.requires.find(target.name()); | 44 auto it = source_spec.requires.find(target.name()); |
23 if (it != source_spec.requires.end()) { | 45 if (it != source_spec.requires.end()) { |
24 std::copy(it->second.begin(), it->second.end(), | 46 std::copy(it->second.begin(), it->second.end(), |
25 std::inserter(capabilities, capabilities.begin())); | 47 std::inserter(capabilities, capabilities.begin())); |
26 } | 48 } |
27 | 49 |
28 // Apply wild card rules too. | 50 // Apply wild card rules too. |
29 it = source_spec.requires.find("*"); | 51 it = source_spec.requires.find("*"); |
30 if (it != source_spec.requires.end()) { | 52 if (it != source_spec.requires.end()) { |
31 std::copy(it->second.begin(), it->second.end(), | 53 std::copy(it->second.begin(), it->second.end(), |
32 std::inserter(capabilities, capabilities.begin())); | 54 std::inserter(capabilities, capabilities.begin())); |
33 } | 55 } |
34 return capabilities; | 56 return capabilities; |
35 } | 57 } |
36 | 58 |
37 // Generates a single set of interfaces that is the union of all interfaces | |
38 // exposed by the target for the capabilities requested by the source. | |
39 InterfaceSet GetInterfacesToExpose( | 59 InterfaceSet GetInterfacesToExpose( |
40 const InterfaceProviderSpec& source_spec, | 60 const InterfaceProviderSpec& source_spec, |
41 const Identity& target, | 61 const Identity& target, |
42 const InterfaceProviderSpec& target_spec) { | 62 const InterfaceProviderSpec& target_spec) { |
43 InterfaceSet exposed_interfaces; | 63 InterfaceSet exposed_interfaces; |
44 // TODO(beng): remove this once we can assert that an InterfaceRegistry must | 64 // TODO(beng): remove this once we can assert that an InterfaceRegistry must |
45 // always be constructed with a valid identity. | 65 // always be constructed with a valid identity. |
46 if (!target.IsValid()) { | 66 if (!target.IsValid()) { |
47 exposed_interfaces.insert("*"); | 67 exposed_interfaces.insert("*"); |
48 return exposed_interfaces; | 68 return exposed_interfaces; |
49 } | 69 } |
50 CapabilitySet capabilities = GetRequestedCapabilities(source_spec, target); | 70 CapabilitySet capabilities = GetRequestedCapabilities(source_spec, target); |
51 for (const auto& capability : capabilities) { | 71 for (const auto& capability : capabilities) { |
52 auto it = target_spec.provides.find(capability); | 72 auto it = target_spec.provides.find(capability); |
53 if (it != target_spec.provides.end()) { | 73 if (it != target_spec.provides.end()) { |
54 for (const auto& interface_name : it->second) | 74 for (const auto& interface_name : it->second) |
55 exposed_interfaces.insert(interface_name); | 75 exposed_interfaces.insert(interface_name); |
56 } | 76 } |
57 } | 77 } |
58 return exposed_interfaces; | 78 return exposed_interfaces; |
59 } | 79 } |
60 | 80 |
61 void SerializeIdentity(const Identity& identity, std::stringstream* stream) { | |
62 *stream << identity.name() << "@" << identity.instance() << " run as: " | |
63 << identity.user_id(); | |
64 } | |
65 | |
66 void SerializeSpec(const InterfaceProviderSpec& spec, | |
67 std::stringstream* stream) { | |
68 *stream << " Providing:\n"; | |
69 for (const auto& entry : spec.provides) { | |
70 *stream << " capability: " << entry.first << " containing interfaces:\n"; | |
71 for (const auto& interface_name : entry.second) | |
72 *stream << " " << interface_name << "\n"; | |
73 } | |
74 *stream << "\n Requiring:\n"; | |
75 for (const auto& entry : spec.requires) { | |
76 *stream << " From: " << entry.first << ":\n"; | |
77 for (const auto& capability_name : entry.second) | |
78 *stream << " " << capability_name << "\n"; | |
79 } | |
80 } | |
81 | |
82 } // namespace | |
83 | |
84 InterfaceRegistry::InterfaceRegistry(const std::string& name) | 81 InterfaceRegistry::InterfaceRegistry(const std::string& name) |
85 : binding_(this), | 82 : binding_(this), |
86 name_(name), | 83 name_(name), |
87 weak_factory_(this) {} | 84 weak_factory_(this) {} |
88 InterfaceRegistry::~InterfaceRegistry() {} | 85 InterfaceRegistry::~InterfaceRegistry() {} |
89 | 86 |
90 void InterfaceRegistry::Bind( | 87 void InterfaceRegistry::Bind( |
91 mojom::InterfaceProviderRequest local_interfaces_request, | 88 mojom::InterfaceProviderRequest local_interfaces_request, |
92 const Identity& local_identity, | 89 const Identity& local_identity, |
93 const InterfaceProviderSpec& local_interface_provider_spec, | 90 const InterfaceProviderSpec& local_interface_provider_spec, |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 exposed_interfaces_.size() == 1 && exposed_interfaces_.count("*") == 1; | 247 exposed_interfaces_.size() == 1 && exposed_interfaces_.count("*") == 1; |
251 } | 248 } |
252 | 249 |
253 void InterfaceRegistry::OnConnectionError() { | 250 void InterfaceRegistry::OnConnectionError() { |
254 std::list<base::Closure> closures = connection_lost_closures_; | 251 std::list<base::Closure> closures = connection_lost_closures_; |
255 for (const auto& closure : closures) | 252 for (const auto& closure : closures) |
256 closure.Run(); | 253 closure.Run(); |
257 } | 254 } |
258 | 255 |
259 } // namespace service_manager | 256 } // namespace service_manager |
OLD | NEW |