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

#include "base/base_paths.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/services/network/network_service_impl.h"

namespace {
base::FilePath GetBasePath() {
  base::FilePath path;
  CHECK(PathService::Get(base::DIR_TEMP, &path));
  return path.Append(FILE_PATH_LITERAL("network_service"));
}
}

namespace mojo {
namespace shell {

NetworkApplicationLoader::NetworkApplicationLoader() {
}

NetworkApplicationLoader::~NetworkApplicationLoader() {
}

void NetworkApplicationLoader::Load(ApplicationManager* manager,
                                    const GURL& url,
                                    ScopedMessagePipeHandle shell_handle,
                                    LoadCallback callback) {
  DCHECK(shell_handle.is_valid());
  uintptr_t key = reinterpret_cast<uintptr_t>(manager);
  if (apps_.find(key) == apps_.end()) {
    scoped_ptr<ApplicationImpl> app(
        new ApplicationImpl(this, shell_handle.Pass()));
    apps_.add(key, app.Pass());
  }
}

void NetworkApplicationLoader::OnApplicationError(ApplicationManager* manager,
                                                  const GURL& url) {
  apps_.erase(reinterpret_cast<uintptr_t>(manager));
}

void NetworkApplicationLoader::Initialize(ApplicationImpl* app) {
  // The context must be created on the same thread as the network service.
  context_.reset(new NetworkContext(GetBasePath()));
}

bool NetworkApplicationLoader::ConfigureIncomingConnection(
    ApplicationConnection* connection) {
  connection->AddService(this);
  return true;
}

void NetworkApplicationLoader::Create(
    ApplicationConnection* connection,
    InterfaceRequest<NetworkService> request) {
  BindToRequest(new NetworkServiceImpl(connection, context_.get()), &request);
}

}  // namespace shell
}  // namespace mojo
