// Copyright 2015 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 "shell/application_manager/shell_impl.h"

#include "mojo/converters/url/url_type_converters.h"
#include "mojo/services/content_handler/interfaces/content_handler.mojom.h"
#include "shell/application_manager/application_manager.h"

using mojo::ServiceProvider;
using mojo::ServiceProviderPtr;

namespace shell {

ShellImpl::ShellImpl(mojo::ApplicationPtr application,
                     ApplicationManager* manager,
                     const Identity& identity,
                     const base::Closure& on_application_end)
    : manager_(manager),
      identity_(identity),
      on_application_end_(on_application_end),
      application_(application.Pass()),
      binding_(this),
      application_connector_impl_(this) {
  binding_.set_connection_error_handler(
      [this]() { manager_->OnShellImplError(this); });
}

ShellImpl::~ShellImpl() {
}

void ShellImpl::InitializeApplication(mojo::Array<mojo::String> args) {
  mojo::ShellPtr shell;
  binding_.Bind(mojo::GetProxy(&shell));
  application_->Initialize(shell.Pass(), args.Pass(), identity_.url.spec());
}

void ShellImpl::ConnectToClient(
    const GURL& requested_url,
    const GURL& requestor_url,
    mojo::InterfaceRequest<ServiceProvider> services,
    ServiceProviderPtr exposed_services) {
  application_->AcceptConnection(mojo::String::From(requestor_url),
                                 services.Pass(), exposed_services.Pass(),
                                 requested_url.spec());
}

void ShellImpl::ConnectToApplication(
    const mojo::String& app_url,
    mojo::InterfaceRequest<ServiceProvider> services,
    ServiceProviderPtr exposed_services) {
  GURL app_gurl(app_url);
  if (!app_gurl.is_valid()) {
    LOG(ERROR) << "Error: invalid URL: " << app_url;
    return;
  }
  manager_->ConnectToApplication(app_gurl, identity_.url, services.Pass(),
                                 exposed_services.Pass(), base::Closure());
}

void ShellImpl::CreateApplicationConnector(
    mojo::InterfaceRequest<mojo::ApplicationConnector>
        application_connector_request) {
  application_connectors_.AddBinding(&application_connector_impl_,
                                     application_connector_request.Pass());
}

}  // namespace shell
