// Copyright (c) 2012 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 "jingle/glue/xmpp_client_socket_factory.h"

#include "base/logging.h"
#include "jingle/glue/fake_ssl_client_socket.h"
#include "jingle/glue/proxy_resolving_client_socket.h"
#include "net/socket/client_socket_factory.h"
#include "net/socket/client_socket_handle.h"
#include "net/socket/ssl_client_socket.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"

namespace jingle_glue {

XmppClientSocketFactory::XmppClientSocketFactory(
    net::ClientSocketFactory* client_socket_factory,
    const net::SSLConfig& ssl_config,
    const scoped_refptr<net::URLRequestContextGetter>& request_context_getter,
    bool use_fake_ssl_client_socket)
    : client_socket_factory_(client_socket_factory),
      request_context_getter_(request_context_getter),
      ssl_config_(ssl_config),
      use_fake_ssl_client_socket_(use_fake_ssl_client_socket) {
  CHECK(client_socket_factory_);
}

XmppClientSocketFactory::~XmppClientSocketFactory() {}

scoped_ptr<net::StreamSocket>
XmppClientSocketFactory::CreateTransportClientSocket(
    const net::HostPortPair& host_and_port) {
  // TODO(akalin): Use socket pools.
  scoped_ptr<net::StreamSocket> transport_socket(
      new ProxyResolvingClientSocket(
          NULL,
          request_context_getter_,
          ssl_config_,
          host_and_port));
  return (use_fake_ssl_client_socket_ ?
          scoped_ptr<net::StreamSocket>(
              new FakeSSLClientSocket(transport_socket.Pass())) :
          transport_socket.Pass());
}

scoped_ptr<net::SSLClientSocket>
XmppClientSocketFactory::CreateSSLClientSocket(
    scoped_ptr<net::ClientSocketHandle> transport_socket,
    const net::HostPortPair& host_and_port) {
  net::SSLClientSocketContext context;
  context.cert_verifier =
      request_context_getter_->GetURLRequestContext()->cert_verifier();
  context.transport_security_state = request_context_getter_->
      GetURLRequestContext()->transport_security_state();
  DCHECK(context.transport_security_state);
  // TODO(rkn): context.channel_id_service is NULL because the
  // ChannelIDService class is not thread safe.
  return client_socket_factory_->CreateSSLClientSocket(
      transport_socket.Pass(), host_and_port, ssl_config_, context);
}


}  // namespace jingle_glue
