// 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/lib/service_registry.h"

#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/public/cpp/application/service_connector.h"

namespace mojo {
namespace internal {

ServiceRegistry::ServiceRegistry() : local_binding_(this) {}

ServiceRegistry::ServiceRegistry(
    const ConnectionContext& connection_context,
    InterfaceRequest<ServiceProvider> local_services)
    : connection_context_(connection_context), local_binding_(this) {
  if (local_services.is_pending())
    local_binding_.Bind(local_services.Pass());
}

ServiceRegistry::~ServiceRegistry() {}

void ServiceRegistry::SetServiceConnectorForName(
    ServiceConnector* service_connector,
    const std::string& interface_name) {
  service_connector_registry_.SetServiceConnectorForName(
      std::unique_ptr<ServiceConnector>(service_connector), interface_name);
}

void ServiceRegistry::RemoveServiceConnectorForName(
    const std::string& interface_name) {
  service_connector_registry_.RemoveServiceConnectorForName(interface_name);
}

const std::string& ServiceRegistry::GetConnectionURL() {
  return connection_context_.connection_url;
}

const std::string& ServiceRegistry::GetRemoteApplicationURL() {
  return connection_context_.remote_url;
}

void ServiceRegistry::ConnectToService(const String& service_name,
                                       ScopedMessagePipeHandle client_handle) {
  service_connector_registry_.ConnectToService(this, service_name,
                                               &client_handle);
}

}  // namespace internal
}  // namespace mojo
