| 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/service_manager/service_manager.h" | 5 #include "services/service_manager/service_manager.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 namespace service_manager { | 32 namespace service_manager { |
| 33 | 33 |
| 34 namespace { | 34 namespace { |
| 35 | 35 |
| 36 const char kCatalogName[] = "service:catalog"; | 36 const char kCatalogName[] = "service:catalog"; |
| 37 const char kServiceManagerName[] = "service:service_manager"; | 37 const char kServiceManagerName[] = "service:service_manager"; |
| 38 const char kCapability_UserID[] = "service_manager:user_id"; | 38 const char kCapability_UserID[] = "service_manager:user_id"; |
| 39 const char kCapability_ClientProcess[] = "service_manager:client_process"; | 39 const char kCapability_ClientProcess[] = "service_manager:client_process"; |
| 40 const char kCapability_InstanceName[] = "service_manager:instance_name"; | 40 const char kCapability_InstanceName[] = "service_manager:instance_name"; |
| 41 const char kCapability_AllUsers[] = "service_manager:all_users"; | 41 const char kCapability_AllUsers[] = "service_manager:all_users"; |
| 42 const char kCapability_ExplicitClass[] = "service_manager:explicit_class"; | |
| 43 const char kCapability_ServiceManager[] = "service_manager:service_manager"; | 42 const char kCapability_ServiceManager[] = "service_manager:service_manager"; |
| 44 | 43 |
| 45 } // namespace | 44 } // namespace |
| 46 | 45 |
| 47 Identity CreateServiceManagerIdentity() { | 46 Identity CreateServiceManagerIdentity() { |
| 48 return Identity(kServiceManagerName, mojom::kRootUserID); | 47 return Identity(kServiceManagerName, mojom::kRootUserID); |
| 49 } | 48 } |
| 50 | 49 |
| 51 Identity CreateCatalogIdentity() { | 50 Identity CreateCatalogIdentity() { |
| 52 return Identity(kCatalogName, mojom::kRootUserID); | 51 return Identity(kCatalogName, mojom::kRootUserID); |
| 53 } | 52 } |
| 54 | 53 |
| 55 InterfaceProviderSpec GetPermissiveInterfaceProviderSpec() { | 54 InterfaceProviderSpec GetPermissiveInterfaceProviderSpec() { |
| 56 InterfaceProviderSpec spec; | 55 InterfaceProviderSpec spec; |
| 57 InterfaceSet interfaces; | 56 InterfaceSet interfaces; |
| 58 interfaces.insert("*"); | 57 interfaces.insert("*"); |
| 59 spec.requires["*"] = interfaces; | 58 spec.requires["*"] = interfaces; |
| 60 return spec; | 59 return spec; |
| 61 } | 60 } |
| 62 | 61 |
| 63 CapabilitySet GetRequestedCapabilities(const InterfaceProviderSpec& source_spec, | |
| 64 const Identity& target) { | |
| 65 CapabilitySet capabilities; | |
| 66 | |
| 67 // Start by looking for specs specific to the supplied identity. | |
| 68 auto it = source_spec.requires.find(target.name()); | |
| 69 if (it != source_spec.requires.end()) { | |
| 70 std::copy(it->second.begin(), it->second.end(), | |
| 71 std::inserter(capabilities, capabilities.begin())); | |
| 72 } | |
| 73 | |
| 74 // Apply wild card rules too. | |
| 75 it = source_spec.requires.find("*"); | |
| 76 if (it != source_spec.requires.end()) { | |
| 77 std::copy(it->second.begin(), it->second.end(), | |
| 78 std::inserter(capabilities, capabilities.begin())); | |
| 79 } | |
| 80 return capabilities; | |
| 81 } | |
| 82 | |
| 83 void GetCapabilitiesAndInterfacesForConnection( | |
| 84 const InterfaceProviderSpec& source_spec, | |
| 85 const Identity& target, | |
| 86 const InterfaceProviderSpec& target_spec, | |
| 87 CapabilitySet* capabilities, | |
| 88 InterfaceSet* interfaces) { | |
| 89 DCHECK(capabilities && interfaces); | |
| 90 *capabilities = GetRequestedCapabilities(source_spec, target); | |
| 91 // Flatten all interfaces from capabilities requested by the source into the | |
| 92 // allowed interface set in the request. | |
| 93 for (const auto& capability : *capabilities) { | |
| 94 auto it = target_spec.provides.find(capability); | |
| 95 if (it != target_spec.provides.end()) { | |
| 96 for (const auto& interface_name : it->second) | |
| 97 interfaces->insert(interface_name); | |
| 98 } | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 bool HasCapability(const InterfaceProviderSpec& spec, | 62 bool HasCapability(const InterfaceProviderSpec& spec, |
| 103 const std::string& capability) { | 63 const std::string& capability) { |
| 104 auto it = spec.requires.find(kServiceManagerName); | 64 auto it = spec.requires.find(kServiceManagerName); |
| 105 if (it == spec.requires.end()) | 65 if (it == spec.requires.end()) |
| 106 return false; | 66 return false; |
| 107 return it->second.find(capability) != it->second.end(); | 67 return it->second.find(capability) != it->second.end(); |
| 108 } | 68 } |
| 109 | 69 |
| 110 // Encapsulates a connection to an instance of a service, tracked by the | 70 // Encapsulates a connection to an instance of a service, tracked by the |
| 111 // Service Manager. | 71 // Service Manager. |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 bool ConnectToService(std::unique_ptr<ConnectParams>* connect_params) { | 130 bool ConnectToService(std::unique_ptr<ConnectParams>* connect_params) { |
| 171 if (!service_.is_bound()) | 131 if (!service_.is_bound()) |
| 172 return false; | 132 return false; |
| 173 | 133 |
| 174 std::unique_ptr<ConnectParams> params(std::move(*connect_params)); | 134 std::unique_ptr<ConnectParams> params(std::move(*connect_params)); |
| 175 if (!params->connect_callback().is_null()) { | 135 if (!params->connect_callback().is_null()) { |
| 176 params->connect_callback().Run(mojom::ConnectResult::SUCCEEDED, | 136 params->connect_callback().Run(mojom::ConnectResult::SUCCEEDED, |
| 177 identity_.user_id()); | 137 identity_.user_id()); |
| 178 } | 138 } |
| 179 | 139 |
| 180 InterfaceProviderSpec connection_spec = GetConnectionSpec(); | 140 InterfaceProviderSpecMap specs; |
| 181 CapabilitySet capabilities; | |
| 182 InterfaceSet interfaces; | |
| 183 Instance* source = service_manager_->GetExistingInstance(params->source()); | 141 Instance* source = service_manager_->GetExistingInstance(params->source()); |
| 184 if (source) { | |
| 185 GetCapabilitiesAndInterfacesForConnection(source->GetConnectionSpec(), | |
| 186 identity_, connection_spec, | |
| 187 &capabilities, &interfaces); | |
| 188 } else { | |
| 189 interfaces.insert("*"); | |
| 190 } | |
| 191 | |
| 192 // The target has specified that sources must request one of its provided | |
| 193 // classes instead of specifying a wild-card for interfaces. | |
| 194 if (HasCapability(connection_spec, kCapability_ExplicitClass) && | |
| 195 (interfaces.count("*") != 0)) { | |
| 196 interfaces.erase("*"); | |
| 197 } | |
| 198 | |
| 199 InterfaceProviderSpecMap specs; | |
| 200 if (source) | 142 if (source) |
| 201 specs = source->interface_provider_specs_; | 143 specs = source->interface_provider_specs_; |
| 202 service_->OnConnect(ServiceInfo(params->source(), specs), | 144 service_->OnConnect(ServiceInfo(params->source(), specs), |
| 203 params->TakeRemoteInterfaces(), interfaces, | 145 params->TakeRemoteInterfaces()); |
| 204 capabilities); | |
| 205 return true; | 146 return true; |
| 206 } | 147 } |
| 207 | 148 |
| 208 void StartWithService(mojom::ServicePtr service) { | 149 void StartWithService(mojom::ServicePtr service) { |
| 209 CHECK(!service_); | 150 CHECK(!service_); |
| 210 service_ = std::move(service); | 151 service_ = std::move(service); |
| 211 service_.set_connection_error_handler( | 152 service_.set_connection_error_handler( |
| 212 base::Bind(&Instance::OnServiceLost, base::Unretained(this), | 153 base::Bind(&Instance::OnServiceLost, base::Unretained(this), |
| 213 service_manager_->GetWeakPtr())); | 154 service_manager_->GetWeakPtr())); |
| 214 service_->OnStart(ServiceInfo(identity_, interface_provider_specs_), | 155 service_->OnStart(ServiceInfo(identity_, interface_provider_specs_), |
| (...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 // Now that the instance has a Service, we can connect to it. | 850 // Now that the instance has a Service, we can connect to it. |
| 910 bool connected = instance->ConnectToService(¶ms); | 851 bool connected = instance->ConnectToService(¶ms); |
| 911 DCHECK(connected); | 852 DCHECK(connected); |
| 912 } | 853 } |
| 913 | 854 |
| 914 base::WeakPtr<ServiceManager> ServiceManager::GetWeakPtr() { | 855 base::WeakPtr<ServiceManager> ServiceManager::GetWeakPtr() { |
| 915 return weak_ptr_factory_.GetWeakPtr(); | 856 return weak_ptr_factory_.GetWeakPtr(); |
| 916 } | 857 } |
| 917 | 858 |
| 918 } // namespace service_manager | 859 } // namespace service_manager |
| OLD | NEW |