// 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 "services/http_server/http_server_factory_impl.h"

#include "base/stl_util.h"
#include "services/http_server/http_server_impl.h"
#include "services/http_server/public/http_server.mojom.h"

namespace http_server {

HttpServerFactoryImpl::HttpServerFactoryImpl(mojo::ApplicationImpl* app) {
  app_ = app;
}

HttpServerFactoryImpl::~HttpServerFactoryImpl() {
  // Free the http servers.
  STLDeleteContainerPairSecondPointers(port_indicated_servers_.begin(),
                                       port_indicated_servers_.end());
  STLDeleteContainerPointers(port_any_servers_.begin(),
                             port_any_servers_.end());
}

void HttpServerFactoryImpl::AddBinding(
    mojo::InterfaceRequest<HttpServerFactory> request) {
  bindings_.AddBinding(this, request.Pass());
}

void HttpServerFactoryImpl::DeleteServer(HttpServerImpl* server,
                                         mojo::NetAddress* requested_address) {
  ServerKey key = GetServerKey(requested_address);

  if (key.second) {  // If the port is non-zero.
    DCHECK(port_indicated_servers_.count(key));
    DCHECK_EQ(server, port_indicated_servers_[key]);

    delete server;
    port_indicated_servers_.erase(key);
  } else {
    DCHECK(port_any_servers_.count(server));

    delete server;
    port_any_servers_.erase(server);
  }
}

HttpServerFactoryImpl::ServerKey HttpServerFactoryImpl::GetServerKey(
    mojo::NetAddress* local_address) {
  DCHECK(local_address);

  if (local_address->family == mojo::NET_ADDRESS_FAMILY_IPV6) {
    return ServerKey(local_address->ipv6->addr, local_address->ipv6->port);
  } else if (local_address->family == mojo::NET_ADDRESS_FAMILY_IPV4) {
    return ServerKey(local_address->ipv4->addr, local_address->ipv4->port);
  } else {
    return ServerKey();
  }
}

void HttpServerFactoryImpl::CreateHttpServer(
    mojo::InterfaceRequest<HttpServer> server_request,
    mojo::NetAddressPtr local_address) {
  if (!local_address) {
    local_address = mojo::NetAddress::New();
    local_address->family = mojo::NET_ADDRESS_FAMILY_IPV4;
    local_address->ipv4 = mojo::NetAddressIPv4::New();
    local_address->ipv4->addr.resize(4);
    local_address->ipv4->addr[0] = 0;
    local_address->ipv4->addr[1] = 0;
    local_address->ipv4->addr[2] = 0;
    local_address->ipv4->addr[3] = 0;
    local_address->ipv4->port = 0;
  }
  ServerKey key = GetServerKey(local_address.get());

  if (key.second) {  // If the port is non-zero.
    if (!port_indicated_servers_.count(key)) {
      port_indicated_servers_[key] =
          new HttpServerImpl(app_, this, local_address.Pass());
    }
    port_indicated_servers_[key]->AddBinding(server_request.Pass());
  } else {
    HttpServerImpl* server =
        new HttpServerImpl(app_, this, local_address.Pass());
    server->AddBinding(server_request.Pass());
    port_any_servers_.insert(server);
  }
}

}  // namespace http_server
