// 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.

#ifndef PPAPI_CPP_WEBSOCKET_H_
#define PPAPI_CPP_WEBSOCKET_H_

#include "ppapi/c/ppb_websocket.h"
#include "ppapi/cpp/resource.h"

/// @file
/// This file defines the WebSocket interface providing bi-directional,
/// full-duplex, communications over a single TCP socket.

namespace pp {

class CompletionCallback;
class InstanceHandle;
class Var;

/// The <code>WebSocket</code> class providing bi-directional,
/// full-duplex, communications over a single TCP socket.
class WebSocket : public Resource {
 public:
  /// Constructs a WebSocket object.
  ///
  /// @param[in] instance The instance with which this resource will be
  /// associated.
  explicit WebSocket(const InstanceHandle& instance);

  /// Destructs a WebSocket object.
  virtual ~WebSocket();

  /// Connect() connects to the specified WebSocket server. You can call this
  /// function once for an object.
  ///
  /// @param[in] url A <code>Var</code> of string type representing a WebSocket
  /// server URL.
  ///
  /// @param[in] protocols A pointer to an array of <code>Var</code> of string
  /// type specifying sub-protocols. Each <code>Var</code> represents one
  /// sub-protocol. This argument can be null only if
  /// <code>protocol_count</code> is 0.
  ///
  /// @param[in] protocol_count The number of sub-protocols in
  /// <code>protocols</code>.
  ///
  /// @param[in] callback A <code>CompletionCallback</code> called
  /// when a connection is established or an error occurs in establishing
  /// connection.
  ///
  /// @return An int32_t containing an error code from
  /// <code>pp_errors.h</code>.
  /// Returns <code>PP_ERROR_BADARGUMENT</code> if specified <code>url</code>,
  /// or <code>protocols</code> contains invalid string as defined in
  /// the WebSocket API specification. <code>PP_ERROR_BADARGUMENT</code>
  /// corresponds to a SyntaxError in the WebSocket API specification.
  /// Returns <code>PP_ERROR_NOACCESS</code> if the protocol specified in the
  /// <code>url</code> is not a secure protocol, but the origin of the caller
  /// has a secure scheme. Also returns <code>PP_ERROR_NOACCESS</code> if the
  /// port specified in the <code>url</code> is a port that the user agent is
  /// configured to block access to because it is a well-known port like SMTP.
  /// <code>PP_ERROR_NOACCESS</code> corresponds to a SecurityError of the
  /// specification.
  /// Returns <code>PP_ERROR_INPROGRESS</code> if this is not the first call to
  /// Connect().
  int32_t Connect(const Var& url, const Var protocols[],
                  uint32_t protocol_count, const CompletionCallback& callback);

  /// Close() closes the specified WebSocket connection by specifying
  /// <code>code</code> and <code>reason</code>.
  ///
  /// @param[in] code The WebSocket close code. This is ignored if it is 0.
  /// <code>PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE</code> must be used for the
  /// usual case. To indicate some specific error cases, codes in the range
  /// <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN</code> to
  /// <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MAX</code>, and in the range
  /// <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MIN</code> to
  /// <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX</code> are available.
  ///
  /// @param[in] reason A <code>Var</code> of string type representing the
  /// close reason. This is ignored if it is an undefined type.
  ///
  /// @param[in] callback A <code>CompletionCallback</code> called when the
  /// connection is closed or an error occurs in closing the connection.
  ///
  /// @return An int32_t containing an error code from
  /// <code>pp_errors.h</code>.
  /// Returns <code>PP_ERROR_BADARGUMENT</code> if <code>reason</code> contains
  /// an invalid character as a UTF-8 string, or is longer than 123 bytes.
  /// <code>PP_ERROR_BADARGUMENT</code> corresponds to a JavaScript
  /// SyntaxError in the WebSocket API specification.
  /// Returns <code>PP_ERROR_NOACCESS</code> if the code is not an integer
  /// equal to 1000 or in the range 3000 to 4999.
  /// <code>PP_ERROR_NOACCESS</code> corresponds to an InvalidAccessError in
  /// the WebSocket API specification. Returns <code>PP_ERROR_INPROGRESS</code>
  /// if this is not the first call to Close().
  int32_t Close(uint16_t code, const Var& reason,
                const CompletionCallback& callback);

  /// ReceiveMessage() receives a message from the WebSocket server.
  /// This interface only returns a single message. That is, this interface
  /// must be called at least N times to receive N messages, no matter the size
  /// of each message.
  ///
  /// @param[out] message The received message is copied to provided
  /// <code>message</code>. The <code>message</code> must remain valid until
  /// ReceiveMessage() completes. Its received <code>Var</code> will be of
  /// string or ArrayBuffer type.
  ///
  /// @param[in] callback A <code>CompletionCallback</code> called when
  /// ReceiveMessage() completes. This callback is ignored if ReceiveMessage()
  /// completes synchronously and returns <code>PP_OK</code>.
  ///
  /// @return An int32_t containing an error code from
  /// <code>pp_errors.h</code>.
  /// If an error is detected or connection is closed, ReceiveMessage() returns
  /// <code>PP_ERROR_FAILED</code> after all buffered messages are received.
  /// Until buffered message become empty, ReceiveMessage() continues to return
  /// <code>PP_OK</code> as if connection is still established without errors.
  int32_t ReceiveMessage(Var* message,
                         const CompletionCallback& callback);

  /// SendMessage() sends a message to the WebSocket server.
  ///
  /// @param[in] message A message to send. The message is copied to an internal
  /// buffer, so the caller can free <code>message</code> safely after returning
  /// from the function. This <code>Var</code> must be of string or
  /// ArrayBuffer types.
  ///
  /// @return An int32_t containing an error code from
  /// <code>pp_errors.h</code>.
  /// Returns <code>PP_ERROR_FAILED</code> if the ReadyState is
  /// <code>PP_WEBSOCKETREADYSTATE_CONNECTING</code>.
  /// <code>PP_ERROR_FAILED</code> corresponds to a JavaScript
  /// InvalidStateError in the WebSocket API specification.
  /// Returns <code>PP_ERROR_BADARGUMENT</code> if the provided
  /// <code>message</code> contains an invalid character as a
  /// UTF-8 string. <code>PP_ERROR_BADARGUMENT</code> corresponds to a
  /// JavaScript SyntaxError in the WebSocket API specification.
  /// Otherwise, returns <code>PP_OK</code>, but it doesn't necessarily mean
  /// that the server received the message.
  int32_t SendMessage(const Var& message);

  /// GetBufferedAmount() returns the number of bytes of text and binary
  /// messages that have been queued for the WebSocket connection to send, but
  /// have not been transmitted to the network yet.
  ///
  /// @return Returns the number of bytes.
  uint64_t GetBufferedAmount();

  /// GetCloseCode() returns the connection close code for the WebSocket
  /// connection.
  ///
  /// @return Returns 0 if called before the close code is set.
  uint16_t GetCloseCode();

  /// GetCloseReason() returns the connection close reason for the WebSocket
  /// connection.
  ///
  /// @return Returns a <code>Var</code> of string type. If called before the
  /// close reason is set, the return value contains an empty string. Returns a
  /// <code>PP_VARTYPE_UNDEFINED</code> if called on an invalid resource.
  Var GetCloseReason();

  /// GetCloseWasClean() returns if the connection was closed cleanly for the
  /// specified WebSocket connection.
  ///
  /// @return Returns <code>false</code> if called before the connection is
  /// closed, called on an invalid resource, or closed for abnormal reasons.
  /// Otherwise, returns <code>true</code> if the connection was closed
  /// cleanly.
  bool GetCloseWasClean();

  /// GetExtensions() returns the extensions selected by the server for the
  /// specified WebSocket connection.
  ///
  /// @return Returns a <code>Var</code> of string type. If called before the
  /// connection is established, the <code>Var</code>'s data is an empty
  /// string. Returns a <code>PP_VARTYPE_UNDEFINED</code> if called on an
  /// invalid resource. Currently the <code>Var</code>'s data for valid
  /// resources are always an empty string.
  Var GetExtensions();

  /// GetProtocol() returns the sub-protocol chosen by the server for the
  /// specified WebSocket connection.
  ///
  /// @return Returns a <code>Var</code> of string type. If called before the
  /// connection is established, the <code>Var</code> contains the empty
  /// string. Returns a code>PP_VARTYPE_UNDEFINED</code> if called on an
  /// invalid resource.
  Var GetProtocol();

  /// GetReadyState() returns the ready state of the specified WebSocket
  /// connection.
  ///
  /// @return Returns <code>PP_WEBSOCKETREADYSTATE_INVALID</code> if called
  /// before Connect() is called, or if this function is called on an
  /// invalid resource.
  PP_WebSocketReadyState GetReadyState();

  /// GetURL() returns the URL associated with specified WebSocket connection.
  ///
  /// @return Returns a <code>Var</code> of string type. If called before the
  /// connection is established, the <code>Var</code> contains the empty
  /// string. Returns a <code>PP_VARTYPE_UNDEFINED</code> if this function
  /// is called on an invalid resource.
  Var GetURL();
};

}  // namespace pp

#endif  // PPAPI_CPP_WEBSOCKET_H_
