Index: services/service_manager/service_manager.cc |
diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc |
index 2a0150437eb4d2e4575991f0e6dd78b22f2b58f0..d29b0c9ad960ddaa0ecf2844270e479d7cef74a5 100644 |
--- a/services/service_manager/service_manager.cc |
+++ b/services/service_manager/service_manager.cc |
@@ -51,30 +51,6 @@ bool Succeeded(mojom::ConnectResult result) { |
return result == mojom::ConnectResult::SUCCEEDED; |
} |
-bool RunConnectCallback(ConnectParams* params, |
- mojom::ConnectResult result, |
- const std::string& user_id) { |
- if (!params->connect_callback().is_null()) { |
- params->connect_callback().Run(result, user_id); |
- return true; |
- } |
- return false; |
-} |
- |
-void RunBindInterfaceCallback(ConnectParams* params, |
- mojom::ConnectResult result, |
- const std::string& user_id) { |
- if (!params->bind_interface_callback().is_null()) |
- params->bind_interface_callback().Run(result, user_id); |
-} |
- |
-void RunCallback(ConnectParams* params, |
- mojom::ConnectResult result, |
- const std::string& user_id) { |
- if (!RunConnectCallback(params, result, user_id)) |
- RunBindInterfaceCallback(params, result, user_id); |
-} |
- |
} // namespace |
Identity CreateServiceManagerIdentity() { |
@@ -152,36 +128,10 @@ class ServiceManager::Instance |
Stop(); |
} |
- bool CallOnConnect(std::unique_ptr<ConnectParams>* in_params) { |
- if (!service_.is_bound()) { |
- RunConnectCallback(in_params->get(), mojom::ConnectResult::ACCESS_DENIED, |
- identity_.user_id()); |
- return false; |
- } |
- |
- std::unique_ptr<ConnectParams> params(std::move(*in_params)); |
- RunConnectCallback(params.get(), mojom::ConnectResult::SUCCEEDED, |
- identity_.user_id()); |
- |
- InterfaceProviderSpecMap specs; |
- Instance* source = |
- service_manager_->GetExistingInstance(params->source()); |
- if (source) |
- specs = source->interface_provider_specs_; |
- |
- pending_service_connections_++; |
- service_->OnConnect(ServiceInfo(params->source(), specs), |
- params->TakeRemoteInterfaces(), |
- base::Bind(&Instance::OnConnectComplete, |
- base::Unretained(this))); |
- return true; |
- } |
- |
bool CallOnBindInterface(std::unique_ptr<ConnectParams>* in_params) { |
if (!service_.is_bound()) { |
- RunBindInterfaceCallback(in_params->get(), |
- mojom::ConnectResult::ACCESS_DENIED, |
- identity_.user_id()); |
+ (*in_params) |
+ ->set_response_data(mojom::ConnectResult::ACCESS_DENIED, identity_); |
return false; |
} |
@@ -206,15 +156,11 @@ class ServiceManager::Instance |
<< params->source().name() << " from binding interface: " |
<< params->interface_name() << " exposed by: " << identity_.name(); |
LOG(ERROR) << ss.str(); |
- params->bind_interface_callback().Run(mojom::ConnectResult::ACCESS_DENIED, |
- identity_.user_id()); |
+ params->set_response_data(mojom::ConnectResult::ACCESS_DENIED, identity_); |
return false; |
} |
- if (!params->bind_interface_callback().is_null()) { |
- params->bind_interface_callback().Run(mojom::ConnectResult::SUCCEEDED, |
- identity_.user_id()); |
- } |
+ params->set_response_data(mojom::ConnectResult::SUCCEEDED, identity_); |
pending_service_connections_++; |
service_->OnBindInterface( |
@@ -307,65 +253,67 @@ class ServiceManager::Instance |
}; |
// mojom::Connector implementation: |
- void StartService( |
- const Identity& in_target, |
- mojo::ScopedMessagePipeHandle service_handle, |
- mojom::PIDReceiverRequest pid_receiver_request) override { |
- Identity target = in_target; |
- mojom::ConnectResult result = |
- ValidateConnectParams(&target, nullptr, nullptr); |
- if (!Succeeded(result)) |
- return; |
- |
- std::unique_ptr<ConnectParams> params(new ConnectParams); |
- params->set_source(identity_); |
- params->set_target(target); |
- |
- mojom::ServicePtr service; |
- service.Bind(mojom::ServicePtrInfo(std::move(service_handle), 0)); |
- params->set_client_process_info(std::move(service), |
- std::move(pid_receiver_request)); |
- service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr()); |
- } |
- |
- void Connect(const service_manager::Identity& in_target, |
- mojom::InterfaceProviderRequest remote_interfaces, |
- const ConnectCallback& callback) override { |
- Identity target = in_target; |
- mojom::ConnectResult result = |
- ValidateConnectParams(&target, nullptr, nullptr); |
- if (!Succeeded(result)) { |
- callback.Run(result, mojom::kInheritUserID); |
- return; |
- } |
- |
- std::unique_ptr<ConnectParams> params(new ConnectParams); |
- params->set_source(identity_); |
- params->set_target(target); |
- params->set_remote_interfaces(std::move(remote_interfaces)); |
- params->set_connect_callback(callback); |
- service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr()); |
- } |
- |
- void BindInterface(const service_manager::Identity& in_target, |
- const std::string& interface_name, |
- mojo::ScopedMessagePipeHandle interface_pipe, |
- const BindInterfaceCallback& callback) override { |
- Identity target = in_target; |
- mojom::ConnectResult result = |
- ValidateConnectParams(&target, nullptr, nullptr); |
- if (!Succeeded(result)) { |
- callback.Run(result, mojom::kInheritUserID); |
- return; |
- } |
- |
- std::unique_ptr<ConnectParams> params(new ConnectParams); |
- params->set_source(identity_); |
- params->set_target(target); |
- params->set_interface_request_info(interface_name, |
- std::move(interface_pipe)); |
- params->set_bind_interface_callback(callback); |
- service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr()); |
+ void BindInterface(const service_manager::Identity& in_target, |
+ const std::string& interface_name, |
+ mojo::ScopedMessagePipeHandle interface_pipe, |
+ const BindInterfaceCallback& callback) override { |
+ Identity target = in_target; |
+ mojom::ConnectResult result = |
+ ValidateConnectParams(&target, nullptr, nullptr); |
+ if (!Succeeded(result)) { |
+ callback.Run(result, Identity()); |
+ return; |
+ } |
+ |
+ std::unique_ptr<ConnectParams> params(new ConnectParams); |
+ params->set_source(identity_); |
+ params->set_target(target); |
+ params->set_interface_request_info(interface_name, |
+ std::move(interface_pipe)); |
+ params->set_start_service_callback(callback); |
+ service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr()); |
+ } |
+ |
+ void StartService(const Identity& in_target, |
+ const StartServiceCallback& callback) override { |
+ Identity target = in_target; |
+ mojom::ConnectResult result = |
+ ValidateConnectParams(&target, nullptr, nullptr); |
+ if (!Succeeded(result)) { |
+ callback.Run(result, Identity()); |
+ return; |
+ } |
+ |
+ std::unique_ptr<ConnectParams> params(new ConnectParams); |
+ params->set_source(identity_); |
+ params->set_target(target); |
+ params->set_start_service_callback(callback); |
+ service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr()); |
+ } |
+ |
+ void StartServiceWithProcess( |
+ const Identity& in_target, |
+ mojo::ScopedMessagePipeHandle service_handle, |
+ mojom::PIDReceiverRequest pid_receiver_request, |
+ const StartServiceWithProcessCallback& callback) override { |
+ Identity target = in_target; |
+ mojom::ConnectResult result = |
+ ValidateConnectParams(&target, nullptr, nullptr); |
+ if (!Succeeded(result)) { |
+ callback.Run(result, Identity()); |
+ return; |
+ } |
+ |
+ std::unique_ptr<ConnectParams> params(new ConnectParams); |
+ params->set_source(identity_); |
+ params->set_target(target); |
+ |
+ mojom::ServicePtr service; |
+ service.Bind(mojom::ServicePtrInfo(std::move(service_handle), 0)); |
+ params->set_client_process_info(std::move(service), |
+ std::move(pid_receiver_request)); |
+ params->set_start_service_callback(callback); |
+ service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr()); |
} |
void Clone(mojom::ConnectorRequest request) override { |
@@ -533,14 +481,6 @@ class ServiceManager::Instance |
OnServiceLost(service_manager_->GetWeakPtr()); |
} |
- void EmptyConnectCallback(mojom::ConnectResult result, |
- const std::string& user_id) {} |
- void BindCallbackWrapper(const BindInterfaceCallback& wrapped, |
- mojom::ConnectResult result, |
- const std::string& user_id) { |
- wrapped.Run(result, user_id); |
- } |
- |
service_manager::ServiceManager* const service_manager_; |
// An id that identifies this instance. Distinct from pid, as a single process |
@@ -560,7 +500,7 @@ class ServiceManager::Instance |
base::ProcessId pid_ = base::kNullProcessId; |
State state_; |
- // The number of outstanding OnConnect requests which are in flight. |
+ // The number of outstanding OnBindInterface requests which are in flight. |
int pending_service_connections_ = 0; |
base::WeakPtrFactory<Instance> weak_factory_; |
@@ -852,14 +792,12 @@ void ServiceManager::NotifyServiceFailedToStart(const Identity& identity) { |
bool ServiceManager::ConnectToExistingInstance( |
std::unique_ptr<ConnectParams>* params) { |
Instance* instance = GetExistingInstance((*params)->target()); |
- if (instance) { |
- if ((*params)->HasInterfaceRequestInfo()) { |
- instance->CallOnBindInterface(params); |
- return true; |
- } |
- return instance->CallOnConnect(params); |
- } |
- return false; |
+ if (!instance) |
+ return false; |
+ |
+ if ((*params)->HasInterfaceRequestInfo()) |
+ instance->CallOnBindInterface(params); |
+ return true; |
} |
ServiceManager::Instance* ServiceManager::CreateInstance( |
@@ -944,7 +882,8 @@ void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params, |
// If name resolution failed, we drop the connection. |
if (!result) { |
LOG(ERROR) << "Failed to resolve service name: " << params->target().name(); |
- RunCallback(params.get(), mojom::ConnectResult::INVALID_ARGUMENT, ""); |
+ params->set_response_data(mojom::ConnectResult::INVALID_ARGUMENT, |
+ Identity()); |
return; |
} |
@@ -1011,7 +950,8 @@ void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params, |
LOG(ERROR) |
<< "Error: The catalog was unable to read a manifest for service \"" |
<< result->name << "\"."; |
- RunCallback(params.get(), mojom::ConnectResult::ACCESS_DENIED, ""); |
+ params->set_response_data(mojom::ConnectResult::ACCESS_DENIED, |
+ Identity()); |
return; |
} |
@@ -1049,19 +989,17 @@ void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params, |
if (!instance->StartWithFilePath(package_path)) { |
OnInstanceError(instance); |
- RunCallback(params.get(), mojom::ConnectResult::INVALID_ARGUMENT, ""); |
+ params->set_response_data(mojom::ConnectResult::INVALID_ARGUMENT, |
+ Identity()); |
return; |
} |
} |
} |
- // Now that the instance has a Service, we can connect to it. |
- if (params->HasInterfaceRequestInfo()) { |
+ params->set_response_data(mojom::ConnectResult::SUCCEEDED, |
+ instance->identity()); |
+ if (params->HasInterfaceRequestInfo()) |
instance->CallOnBindInterface(¶ms); |
- } else { |
- bool connected = instance->CallOnConnect(¶ms); |
- DCHECK(connected); |
- } |
} |
base::WeakPtr<ServiceManager> ServiceManager::GetWeakPtr() { |