// 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 "mojo/services/network/network_service_delegate.h"

#include "base/at_exit.h"
#include "base/base_paths.h"
#include "base/command_line.h"
#include "base/bind.h"
#include "base/threading/thread.h"
#include "base/files/file_path.h"
#include "base/message_loop/message_loop.h"
#include "base/memory/scoped_ptr.h"
#include "base/path_service.h"
#include "third_party/mojo/src/mojo/public/cpp/application/application_connection.h"

NetworkServiceDelegate::NetworkServiceDelegate() {}

NetworkServiceDelegate::~NetworkServiceDelegate() {}

void NetworkServiceDelegate::Initialize(mojo::ApplicationImpl* app) {
  tracing_.Initialize(app);
  base::FilePath base_path;
  CHECK(PathService::Get(base::DIR_TEMP, &base_path));
  base_path = base_path.Append(FILE_PATH_LITERAL("network_service"));
  base::CommandLine command_line(app->args());
  if (command_line.HasSwitch("clear")) {
    scoped_ptr<base::Thread> cache_delete_thread(
        new base::Thread("network cache delete thread"));
    cache_delete_thread->Start();
    mojo::NetworkContext::ClearCache(
        base_path, cache_delete_thread->task_runner(),
        base::Bind(&base::Thread::Stop,
                   base::Owned(cache_delete_thread.release())));
  }
  context_.reset(new mojo::NetworkContext(base_path));
}

bool NetworkServiceDelegate::ConfigureIncomingConnection(
    mojo::ApplicationConnection* connection) {
  DCHECK(context_);
  connection->AddService(this);
  return true;
}

void NetworkServiceDelegate::Quit() {
  // Destroy the NetworkContext now as it requires MessageLoop::current() upon
  // destruction and it is the last moment we know for sure that it is
  // running.
  context_.reset();
}

void NetworkServiceDelegate::Create(
    mojo::ApplicationConnection* connection,
    mojo::InterfaceRequest<mojo::NetworkService> request) {
  new mojo::NetworkServiceImpl(request.Pass(), connection, context_.get());
}
