Home | History | Annotate | Download | only in lib
      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 
     13 ServiceProviderImpl::ServiceProviderImpl() : remote_(NULL) {
     14 }
     15 
     16 ServiceProviderImpl::~ServiceProviderImpl() {
     17 }
     18 
     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 
     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 
     40 void ServiceProviderImpl::OnConnectionError() {
     41   ClearRemote();
     42 }
     43 
     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 
     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 
     62 void ServiceProviderImpl::ClearRemote() {
     63   if (remote_) {
     64     remote_->Clear();
     65     remote_ = NULL;
     66   }
     67 }
     68 
     69 }  // namespace mojo
     70