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

#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/environment/environment.h"
#include "mojo/public/cpp/environment/logging.h"
#include "mojo/public/cpp/utility/run_loop.h"

namespace mojo {
namespace {
bool g_running = false;
}  // namespace

// static
void ApplicationImpl::Terminate() {
  RunLoop::current()->Quit();
}

ApplicationRunner::ApplicationRunner(
    std::unique_ptr<ApplicationDelegate> delegate)
    : delegate_(std::move(delegate)) {}

ApplicationRunner::~ApplicationRunner() {
  assert(!delegate_);
}

// static
void ApplicationRunner::SetDefaultLogger(const MojoLogger* logger) {
  MOJO_DCHECK(g_running);
  Environment::SetDefaultLogger(logger);
}

// static
const MojoLogger* ApplicationRunner::GetDefaultLogger() {
  MOJO_DCHECK(g_running);
  return Environment::GetDefaultLogger();
}

MojoResult ApplicationRunner::Run(MojoHandle app_request_handle) {
  MOJO_DCHECK(!g_running)
      << "Another ApplicationRunner::Run() is already running!";

  g_running = true;
  Environment env;
  {
    RunLoop loop;
    ApplicationImpl app(delegate_.get(),
                        MakeRequest<Application>(MakeScopedHandle(
                            MessagePipeHandle(app_request_handle))));
    loop.Run();
  }

  delegate_.reset();

  g_running = false;

  return MOJO_RESULT_OK;
}

}  // namespace mojo
