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
11namespace mojo {
12
13ServiceProviderImpl::ServiceProviderImpl() : remote_(NULL) {
14}
15
16ServiceProviderImpl::~ServiceProviderImpl() {
17}
18
19ServiceProvider* 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
26void 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
40void ServiceProviderImpl::OnConnectionError() {
41  ClearRemote();
42}
43
44void 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
52void 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
62void ServiceProviderImpl::ClearRemote() {
63  if (remote_) {
64    remote_->Clear();
65    remote_ = NULL;
66  }
67}
68
69}  // namespace mojo
70