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

#include "mojo/services/network/cookie_store_impl.h"
#include "mojo/services/network/host_resolver_impl.h"
#include "mojo/services/network/http_server_impl.h"
#include "mojo/services/network/net_adapters.h"
#include "mojo/services/network/tcp_bound_socket_impl.h"
#include "mojo/services/network/udp_socket_impl.h"
#include "mojo/services/network/url_loader_impl.h"
#include "mojo/services/network/web_socket_impl.h"
#include "third_party/mojo/src/mojo/public/cpp/application/application_connection.h"

namespace mojo {

NetworkServiceImpl::NetworkServiceImpl(InterfaceRequest<NetworkService> request,
                                       ApplicationConnection* connection,
                                       NetworkContext* context)
    : binding_(this, request.Pass()),
      context_(context),
      origin_(GURL(connection->GetRemoteApplicationURL()).GetOrigin()) {
}

NetworkServiceImpl::~NetworkServiceImpl() {
}

void NetworkServiceImpl::CreateURLLoader(InterfaceRequest<URLLoader> loader) {
  // TODO(darin): Plumb origin_. Use for CORS.
  // The loader will delete itself when the pipe is closed, unless a request is
  // in progress. In which case, the loader will delete itself when the request
  // is finished.
  std::vector<URLLoaderInterceptorPtr> interceptors;
  url_loader_interceptor_factories_.ForAllPtrs(
      [&interceptors](URLLoaderInterceptorFactory* factory) {
        URLLoaderInterceptorPtr interceptor;
        factory->Create(GetProxy(&interceptor));
        interceptors.push_back(interceptor.Pass());
      });
  new URLLoaderImpl(context_, loader.Pass(), std::move(interceptors));
}

void NetworkServiceImpl::GetCookieStore(InterfaceRequest<CookieStore> store) {
  new CookieStoreImpl(store.Pass(), context_, origin_);
}

void NetworkServiceImpl::CreateWebSocket(InterfaceRequest<WebSocket> socket) {
  new WebSocketImpl(socket.Pass(), context_);
}

void NetworkServiceImpl::CreateTCPBoundSocket(
    NetAddressPtr local_address,
    InterfaceRequest<TCPBoundSocket> bound_socket,
    const CreateTCPBoundSocketCallback& callback) {
  scoped_ptr<TCPBoundSocketImpl> bound(
      new TCPBoundSocketImpl(bound_socket.Pass()));
  int net_error = bound->Bind(local_address.Pass());
  if (net_error != net::OK) {
    callback.Run(MakeNetworkError(net_error), NetAddressPtr());
    return;
  }
  NetAddressPtr resulting_local_address(bound->GetLocalAddress());
  // Release the implementation and let its lifecycle be managed by the pipe.
  ignore_result(bound.release());
  callback.Run(MakeNetworkError(net::OK), resulting_local_address.Pass());
}

void NetworkServiceImpl::CreateTCPConnectedSocket(
    NetAddressPtr remote_address,
    ScopedDataPipeConsumerHandle send_stream,
    ScopedDataPipeProducerHandle receive_stream,
    InterfaceRequest<TCPConnectedSocket> client_socket,
    const CreateTCPConnectedSocketCallback& callback) {
  // TODO(brettw) implement this. We need to know what type of socket to use
  // so we can create the right one (i.e. to pass to TCPSocket::Open) before
  // doing the connect.
  callback.Run(MakeNetworkError(net::ERR_NOT_IMPLEMENTED), NetAddressPtr());
}

void NetworkServiceImpl::CreateUDPSocket(InterfaceRequest<UDPSocket> request) {
  // The lifetime of this UDPSocketImpl is bound to that of the underlying pipe.
  new UDPSocketImpl(request.Pass());
}

void NetworkServiceImpl::CreateHttpServer(
    NetAddressPtr local_address,
    InterfaceHandle<HttpServerDelegate> delegate,
    const CreateHttpServerCallback& callback) {
  HttpServerImpl::Create(local_address.Pass(), delegate.Pass(), callback);
}

void NetworkServiceImpl::RegisterURLLoaderInterceptor(
    InterfaceHandle<URLLoaderInterceptorFactory> factory) {
  url_loader_interceptor_factories_.AddInterfacePtr(
      URLLoaderInterceptorFactoryPtr::Create(factory.Pass()));
}

void NetworkServiceImpl::CreateHostResolver(
    InterfaceRequest<HostResolver> host_resolver) {
  // The lifetime of this HostResolverImpl is bound to that of the underlying
  // pipe.
  new HostResolverImpl(host_resolver.Pass());
}

}  // namespace mojo
