Chromium Code Reviews| Index: content/common/service_manager/service_manager_connection_impl.cc |
| diff --git a/content/common/service_manager/service_manager_connection_impl.cc b/content/common/service_manager/service_manager_connection_impl.cc |
| index 0ba66da6f680fe94ec9ea2fe8625635a6cce106c..1f1ccb9ec5281738e3135e4893cba745376d90d2 100644 |
| --- a/content/common/service_manager/service_manager_connection_impl.cc |
| +++ b/content/common/service_manager/service_manager_connection_impl.cc |
| @@ -65,14 +65,17 @@ class ServiceManagerConnectionImpl::IOThreadContext |
| } |
| // Safe to call from any thread. |
| - void Start(const InitializeCallback& initialize_callback, |
| - const ServiceFactoryCallback& create_service_callback, |
| - const base::Closure& stop_callback) { |
| + void Start( |
| + const InitializeCallback& initialize_callback, |
| + const ServiceManagerConnection::OnConnectHandler& on_connect_callback, |
| + const ServiceFactoryCallback& create_service_callback, |
| + const base::Closure& stop_callback) { |
| DCHECK(!started_); |
| started_ = true; |
| callback_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| initialize_handler_ = initialize_callback; |
| + on_connect_callback_ = on_connect_callback; |
| create_service_callback_ = create_service_callback; |
| stop_callback_ = stop_callback; |
| io_task_runner_->PostTask( |
| @@ -221,15 +224,20 @@ class ServiceManagerConnectionImpl::IOThreadContext |
| void OnStart(const service_manager::ServiceInfo& info) override { |
| DCHECK(io_thread_checker_.CalledOnValidThread()); |
| DCHECK(!initialize_handler_.is_null()); |
| - id_ = info.identity; |
| + local_info_ = info; |
| InitializeCallback handler = base::ResetAndReturn(&initialize_handler_); |
| - callback_task_runner_->PostTask(FROM_HERE, base::Bind(handler, id_)); |
| + callback_task_runner_->PostTask(FROM_HERE, |
| + base::Bind(handler, local_info_.identity)); |
| } |
| bool OnConnect(const service_manager::ServiceInfo& remote_info, |
| service_manager::InterfaceRegistry* registry) override { |
| DCHECK(io_thread_checker_.CalledOnValidThread()); |
| + |
| + callback_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(on_connect_callback_, local_info_, remote_info)); |
| + |
| std::string remote_service = remote_info.identity.name(); |
| if (remote_service == "service:service_manager") { |
| // Only expose the ServiceFactory interface to the Service Manager. |
| @@ -312,6 +320,9 @@ class ServiceManagerConnectionImpl::IOThreadContext |
| // Callback to run once Service::OnStart is invoked. |
| InitializeCallback initialize_handler_; |
| + // Callback to run when a connection request is received. |
| + ServiceManagerConnection::OnConnectHandler on_connect_callback_; |
| + |
| // Callback to run when a new Service request is received. |
| ServiceFactoryCallback create_service_callback_; |
| @@ -322,7 +333,7 @@ class ServiceManagerConnectionImpl::IOThreadContext |
| // default binder (below) has been set up. |
| bool has_browser_connection_ = false; |
| - service_manager::Identity id_; |
| + service_manager::ServiceInfo local_info_; |
| // Default binder callback used for the browser connection's |
| // InterfaceRegistry. |
| @@ -414,6 +425,8 @@ void ServiceManagerConnectionImpl::Start() { |
| context_->Start( |
| base::Bind(&ServiceManagerConnectionImpl::OnContextInitialized, |
| weak_factory_.GetWeakPtr()), |
| + base::Bind(&ServiceManagerConnectionImpl::OnConnect, |
| + weak_factory_.GetWeakPtr()), |
| base::Bind(&ServiceManagerConnectionImpl::CreateService, |
| weak_factory_.GetWeakPtr()), |
| base::Bind(&ServiceManagerConnectionImpl::OnConnectionLost, |
| @@ -480,6 +493,19 @@ void ServiceManagerConnectionImpl::AddServiceRequestHandler( |
| DCHECK(result.second); |
| } |
| +int ServiceManagerConnectionImpl::AddOnConnectHandler( |
| + const OnConnectHandler& handler) { |
| + int id = ++next_on_connect_handler_id_; |
| + on_connect_handlers_[id] = handler; |
| + return id; |
| +} |
| + |
| +void ServiceManagerConnectionImpl::RemoveOnConnectHandler(int id) { |
| + auto it = on_connect_handlers_.find(id); |
| + DCHECK(it != on_connect_handlers_.end()); |
| + on_connect_handlers_.erase(it); |
| +} |
| + |
| void ServiceManagerConnectionImpl::CreateService( |
| service_manager::mojom::ServiceRequest request, |
| const std::string& name) { |
| @@ -500,6 +526,15 @@ void ServiceManagerConnectionImpl::OnConnectionLost() { |
| connection_lost_handler_.Run(); |
| } |
| +void ServiceManagerConnectionImpl::OnConnect( |
| + const service_manager::ServiceInfo& local_info, |
| + const service_manager::ServiceInfo& remote_info) { |
| + local_info_ = local_info; |
| + last_remote_info_ = remote_info; |
|
Ken Rockot(use gerrit already)
2016/10/27 05:12:52
last_remote_info_ is not used. remove?
|
| + for (auto& handler : on_connect_handlers_) |
| + handler.second.Run(local_info, remote_info); |
| +} |
| + |
| void ServiceManagerConnectionImpl::GetInterface( |
| service_manager::mojom::InterfaceProvider* provider, |
| const std::string& interface_name, |