// 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 "content/public/test/test_mojo_app.h"

#include <utility>

#include "base/logging.h"
#include "base/message_loop/message_loop.h"
#include "services/shell/public/cpp/connection.h"
#include "services/shell/public/cpp/connector.h"

namespace content {

const char kTestMojoAppUrl[] = "system:content_mojo_test";

TestMojoApp::TestMojoApp() : service_binding_(this) {
}

TestMojoApp::~TestMojoApp() {
}

bool TestMojoApp::OnConnect(const shell::Identity& remote_identity,
                            shell::InterfaceRegistry* registry) {
  requestor_name_ = remote_identity.name();
  registry->AddInterface<mojom::TestMojoService>(this);
  return true;
}

void TestMojoApp::Create(
    const shell::Identity& remote_identity,
    mojo::InterfaceRequest<mojom::TestMojoService> request) {
  DCHECK(!service_binding_.is_bound());
  service_binding_.Bind(std::move(request));
}

void TestMojoApp::DoSomething(const DoSomethingCallback& callback) {
  callback.Run();
  base::MessageLoop::current()->QuitWhenIdle();
}

void TestMojoApp::DoTerminateProcess(
    const DoTerminateProcessCallback& callback) {
  NOTREACHED();
}

void TestMojoApp::CreateFolder(const CreateFolderCallback& callback) {
  NOTREACHED();
}

void TestMojoApp::GetRequestorName(const GetRequestorNameCallback& callback) {
  callback.Run(requestor_name_);
}

}  // namespace content
