• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "mojo/public/cpp/application/service_provider_impl.h"
6 
7 #include "mojo/public/cpp/application/lib/service_connector.h"
8 #include "mojo/public/cpp/application/lib/weak_service_provider.h"
9 #include "mojo/public/cpp/environment/logging.h"
10 
11 namespace mojo {
12 
ServiceProviderImpl()13 ServiceProviderImpl::ServiceProviderImpl() : remote_(NULL) {
14 }
15 
~ServiceProviderImpl()16 ServiceProviderImpl::~ServiceProviderImpl() {
17 }
18 
CreateRemoteServiceProvider()19 ServiceProvider* ServiceProviderImpl::CreateRemoteServiceProvider() {
20   // TODO(beng): it sure would be nice if this method could return a scoped_ptr.
21   MOJO_DCHECK(!remote_);
22   remote_ = new internal::WeakServiceProvider(this, client());
23   return remote_;
24 }
25 
ConnectToService(const String & service_name,ScopedMessagePipeHandle client_handle)26 void ServiceProviderImpl::ConnectToService(
27     const String& service_name,
28     ScopedMessagePipeHandle client_handle) {
29   if (service_connectors_.find(service_name) == service_connectors_.end()) {
30     client_handle.reset();
31     return;
32   }
33 
34   internal::ServiceConnectorBase* service_connector =
35       service_connectors_[service_name];
36   return service_connector->ConnectToService(service_name,
37                                              client_handle.Pass());
38 }
39 
OnConnectionError()40 void ServiceProviderImpl::OnConnectionError() {
41   ClearRemote();
42 }
43 
AddServiceConnector(internal::ServiceConnectorBase * service_connector)44 void ServiceProviderImpl::AddServiceConnector(
45     internal::ServiceConnectorBase* service_connector) {
46   RemoveServiceConnector(service_connector);
47   service_connectors_[service_connector->name()] = service_connector;
48   // TODO(beng): perhaps take app connection thru ctor??
49   service_connector->set_application_connection(NULL);
50 }
51 
RemoveServiceConnector(internal::ServiceConnectorBase * service_connector)52 void ServiceProviderImpl::RemoveServiceConnector(
53     internal::ServiceConnectorBase* service_connector) {
54   NameToServiceConnectorMap::iterator it =
55       service_connectors_.find(service_connector->name());
56   if (it == service_connectors_.end())
57     return;
58   delete it->second;
59   service_connectors_.erase(it);
60 }
61 
ClearRemote()62 void ServiceProviderImpl::ClearRemote() {
63   if (remote_) {
64     remote_->Clear();
65     remote_ = NULL;
66   }
67 }
68 
69 }  // namespace mojo
70