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

#include <utility>

#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/lib/service_registry.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/environment/logging.h"
#include "mojo/public/cpp/system/message_pipe.h"

namespace mojo {

ApplicationImpl::ApplicationImpl(ApplicationDelegate* delegate,
                                 InterfaceRequest<Application> request)
    : delegate_(delegate), binding_(this, request.Pass()) {}

ApplicationImpl::~ApplicationImpl() {}

bool ApplicationImpl::HasArg(const std::string& arg) const {
  return std::find(args_.begin(), args_.end(), arg) != args_.end();
}

InterfaceHandle<ApplicationConnector>
ApplicationImpl::CreateApplicationConnector() {
  MOJO_CHECK(shell_);
  InterfaceHandle<ApplicationConnector> application_connector;
  shell_->CreateApplicationConnector(GetProxy(&application_connector));
  return application_connector;
}

void ApplicationImpl::WaitForInitialize() {
  if (!shell_)
    binding_.WaitForIncomingMethodCall();
}

void ApplicationImpl::UnbindConnections(
    InterfaceRequest<Application>* application_request,
    ShellPtr* shell) {
  *application_request = binding_.Unbind();
  shell->Bind(shell_.PassInterfaceHandle());
}

void ApplicationImpl::Initialize(InterfaceHandle<Shell> shell,
                                 Array<String> args,
                                 const mojo::String& url) {
  shell_ = ShellPtr::Create(std::move(shell));
  shell_.set_connection_error_handler([this]() {
    delegate_->Quit();
    incoming_service_registries_.clear();
    Terminate();
  });
  url_ = url;
  args_ = args.To<std::vector<std::string>>();
  delegate_->Initialize(this);
}

void ApplicationImpl::AcceptConnection(
    const String& requestor_url,
    InterfaceRequest<ServiceProvider> services,
    InterfaceHandle<ServiceProvider> exposed_services,
    const String& url) {
  std::unique_ptr<internal::ServiceRegistry> registry(
      new internal::ServiceRegistry(this, url, requestor_url,
                                    std::move(exposed_services),
                                    services.Pass()));
  if (!delegate_->ConfigureIncomingConnection(registry.get()))
    return;
  incoming_service_registries_.push_back(std::move(registry));
}

void ApplicationImpl::RequestQuit() {
  delegate_->Quit();
  Terminate();
}

}  // namespace mojo
