// Copyright 2013 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 "net/websockets/websocket_handshake_stream_create_helper.h"

#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "net/socket/client_socket_handle.h"
#include "net/spdy/spdy_session.h"
#include "net/websockets/websocket_basic_handshake_stream.h"

namespace net {

WebSocketHandshakeStreamCreateHelper::WebSocketHandshakeStreamCreateHelper(
    WebSocketStream::ConnectDelegate* connect_delegate,
    const std::vector<std::string>& requested_subprotocols)
    : requested_subprotocols_(requested_subprotocols),
      stream_(NULL),
      connect_delegate_(connect_delegate),
      failure_message_(NULL) {
  DCHECK(connect_delegate_);
}

WebSocketHandshakeStreamCreateHelper::~WebSocketHandshakeStreamCreateHelper() {}

WebSocketHandshakeStreamBase*
WebSocketHandshakeStreamCreateHelper::CreateBasicStream(
    scoped_ptr<ClientSocketHandle> connection,
    bool using_proxy) {
  DCHECK(failure_message_) << "set_failure_message() must be called";
  // The list of supported extensions and parameters is hard-coded.
  // TODO(ricea): If more extensions are added, consider a more flexible
  // method.
  std::vector<std::string> extensions(
      1, "permessage-deflate; client_max_window_bits");
  WebSocketBasicHandshakeStream* stream =
      new WebSocketBasicHandshakeStream(connection.Pass(),
                                        connect_delegate_,
                                        using_proxy,
                                        requested_subprotocols_,
                                        extensions,
                                        failure_message_);
  OnStreamCreated(stream);
  stream_ = stream;
  return stream;
}

// TODO(ricea): Create a WebSocketSpdyHandshakeStream. crbug.com/323852
WebSocketHandshakeStreamBase*
WebSocketHandshakeStreamCreateHelper::CreateSpdyStream(
    const base::WeakPtr<SpdySession>& session,
    bool use_relative_url) {
  NOTREACHED() << "Not implemented";
  return NULL;
}

scoped_ptr<WebSocketStream> WebSocketHandshakeStreamCreateHelper::Upgrade() {
  DCHECK(stream_);
  WebSocketHandshakeStreamBase* stream = stream_;
  stream_ = NULL;
  return stream->Upgrade();
}

void WebSocketHandshakeStreamCreateHelper::OnStreamCreated(
    WebSocketBasicHandshakeStream* stream) {
}

}  // namespace net
