blob: 08a06484877cfaa93f9e8c9cf91afa6c0ca37222 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "mojo/public/cpp/application/service_provider_impl.h"
#include "mojo/public/cpp/application/lib/service_connector.h"
#include "mojo/public/cpp/application/lib/weak_service_provider.h"
#include "mojo/public/cpp/environment/logging.h"
namespace mojo {
ServiceProviderImpl::ServiceProviderImpl() : remote_(nullptr) {
}
ServiceProviderImpl::~ServiceProviderImpl() {
}
ServiceProvider* ServiceProviderImpl::CreateRemoteServiceProvider() {
// TODO(beng): it sure would be nice if this method could return a scoped_ptr.
MOJO_DCHECK(!remote_);
remote_ = new internal::WeakServiceProvider(this, client());
return remote_;
}
void ServiceProviderImpl::ConnectToService(
const String& service_name,
ScopedMessagePipeHandle client_handle) {
if (service_connectors_.find(service_name) == service_connectors_.end()) {
client_handle.reset();
return;
}
internal::ServiceConnectorBase* service_connector =
service_connectors_[service_name];
return service_connector->ConnectToService(service_name,
client_handle.Pass());
}
void ServiceProviderImpl::OnConnectionError() {
ClearRemote();
}
void ServiceProviderImpl::AddServiceConnector(
internal::ServiceConnectorBase* service_connector) {
RemoveServiceConnector(service_connector);
service_connectors_[service_connector->name()] = service_connector;
// TODO(beng): perhaps take app connection thru ctor??
service_connector->set_application_connection(nullptr);
}
void ServiceProviderImpl::RemoveServiceConnector(
internal::ServiceConnectorBase* service_connector) {
NameToServiceConnectorMap::iterator it =
service_connectors_.find(service_connector->name());
if (it == service_connectors_.end())
return;
delete it->second;
service_connectors_.erase(it);
}
void ServiceProviderImpl::ClearRemote() {
if (remote_) {
remote_->Clear();
remote_ = nullptr;
}
}
} // namespace mojo