// 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 "mojo/services/http_server/public/interfaces/http_server.mojom.h"
#include "services/http_server/http_server_impl.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
