// 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 "ppapi/cpp/tcp_socket.h"

#include "ppapi/c/pp_errors.h"
#include "ppapi/cpp/completion_callback.h"
#include "ppapi/cpp/instance_handle.h"
#include "ppapi/cpp/module_impl.h"

namespace pp {

namespace {

template <> const char* interface_name<PPB_TCPSocket_1_0>() {
  return PPB_TCPSOCKET_INTERFACE_1_0;
}

template <> const char* interface_name<PPB_TCPSocket_1_1>() {
  return PPB_TCPSOCKET_INTERFACE_1_1;
}

}  // namespace

TCPSocket::TCPSocket() {
}

TCPSocket::TCPSocket(const InstanceHandle& instance) {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    PassRefFromConstructor(get_interface<PPB_TCPSocket_1_1>()->Create(
        instance.pp_instance()));
  } else if (has_interface<PPB_TCPSocket_1_0>()) {
    PassRefFromConstructor(get_interface<PPB_TCPSocket_1_0>()->Create(
        instance.pp_instance()));
  }
}

TCPSocket::TCPSocket(PassRef, PP_Resource resource)
    : Resource(PASS_REF, resource) {
}

TCPSocket::TCPSocket(const TCPSocket& other) : Resource(other) {
}

TCPSocket::~TCPSocket() {
}

TCPSocket& TCPSocket::operator=(const TCPSocket& other) {
  Resource::operator=(other);
  return *this;
}

// static
bool TCPSocket::IsAvailable() {
  return has_interface<PPB_TCPSocket_1_1>() ||
         has_interface<PPB_TCPSocket_1_0>();
}

int32_t TCPSocket::Bind(const NetAddress& addr,
                        const CompletionCallback& callback) {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return get_interface<PPB_TCPSocket_1_1>()->Bind(
        pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
  }
  return callback.MayForce(PP_ERROR_NOINTERFACE);
}

int32_t TCPSocket::Connect(const NetAddress& addr,
                           const CompletionCallback& callback) {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return get_interface<PPB_TCPSocket_1_1>()->Connect(
        pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
  }
  if (has_interface<PPB_TCPSocket_1_0>()) {
    return get_interface<PPB_TCPSocket_1_0>()->Connect(
        pp_resource(), addr.pp_resource(), callback.pp_completion_callback());
  }
  return callback.MayForce(PP_ERROR_NOINTERFACE);
}

NetAddress TCPSocket::GetLocalAddress() const {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return NetAddress(
        PASS_REF,
        get_interface<PPB_TCPSocket_1_1>()->GetLocalAddress(pp_resource()));
  }
  if (has_interface<PPB_TCPSocket_1_0>()) {
    return NetAddress(
        PASS_REF,
        get_interface<PPB_TCPSocket_1_0>()->GetLocalAddress(pp_resource()));
  }
  return NetAddress();
}

NetAddress TCPSocket::GetRemoteAddress() const {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return NetAddress(
        PASS_REF,
        get_interface<PPB_TCPSocket_1_1>()->GetRemoteAddress(pp_resource()));
  }
  if (has_interface<PPB_TCPSocket_1_0>()) {
    return NetAddress(
        PASS_REF,
        get_interface<PPB_TCPSocket_1_0>()->GetRemoteAddress(pp_resource()));
  }
  return NetAddress();
}

int32_t TCPSocket::Read(char* buffer,
                        int32_t bytes_to_read,
                        const CompletionCallback& callback) {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return get_interface<PPB_TCPSocket_1_1>()->Read(
        pp_resource(), buffer, bytes_to_read,
        callback.pp_completion_callback());
  }
  if (has_interface<PPB_TCPSocket_1_0>()) {
    return get_interface<PPB_TCPSocket_1_0>()->Read(
        pp_resource(), buffer, bytes_to_read,
        callback.pp_completion_callback());
  }
  return callback.MayForce(PP_ERROR_NOINTERFACE);
}

int32_t TCPSocket::Write(const char* buffer,
                         int32_t bytes_to_write,
                         const CompletionCallback& callback) {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return get_interface<PPB_TCPSocket_1_1>()->Write(
        pp_resource(), buffer, bytes_to_write,
        callback.pp_completion_callback());
  }
  if (has_interface<PPB_TCPSocket_1_0>()) {
    return get_interface<PPB_TCPSocket_1_0>()->Write(
        pp_resource(), buffer, bytes_to_write,
        callback.pp_completion_callback());
  }
  return callback.MayForce(PP_ERROR_NOINTERFACE);
}

int32_t TCPSocket::Listen(int32_t backlog,
                          const CompletionCallback& callback) {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return get_interface<PPB_TCPSocket_1_1>()->Listen(
        pp_resource(), backlog, callback.pp_completion_callback());
  }
  return callback.MayForce(PP_ERROR_NOINTERFACE);
}

int32_t TCPSocket::Accept(
    const CompletionCallbackWithOutput<TCPSocket>& callback) {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return get_interface<PPB_TCPSocket_1_1>()->Accept(
        pp_resource(), callback.output(), callback.pp_completion_callback());
  }
  return callback.MayForce(PP_ERROR_NOINTERFACE);
}

void TCPSocket::Close() {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    get_interface<PPB_TCPSocket_1_1>()->Close(pp_resource());
  } else if (has_interface<PPB_TCPSocket_1_0>()) {
    get_interface<PPB_TCPSocket_1_0>()->Close(pp_resource());
  }
}

int32_t TCPSocket::SetOption(PP_TCPSocket_Option name,
                             const Var& value,
                             const CompletionCallback& callback) {
  if (has_interface<PPB_TCPSocket_1_1>()) {
    return get_interface<PPB_TCPSocket_1_1>()->SetOption(
        pp_resource(), name, value.pp_var(), callback.pp_completion_callback());
  }
  if (has_interface<PPB_TCPSocket_1_0>()) {
    return get_interface<PPB_TCPSocket_1_0>()->SetOption(
        pp_resource(), name, value.pp_var(), callback.pp_completion_callback());
  }
  return callback.MayForce(PP_ERROR_NOINTERFACE);
}

}  // namespace pp
