Home | History | Annotate | Download | only in c
      1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 /* From ppb_websocket.idl modified Thu May 31 15:47:38 2012. */
      7 
      8 #ifndef PPAPI_C_PPB_WEBSOCKET_H_
      9 #define PPAPI_C_PPB_WEBSOCKET_H_
     10 
     11 #include "ppapi/c/pp_bool.h"
     12 #include "ppapi/c/pp_completion_callback.h"
     13 #include "ppapi/c/pp_instance.h"
     14 #include "ppapi/c/pp_macros.h"
     15 #include "ppapi/c/pp_resource.h"
     16 #include "ppapi/c/pp_stdint.h"
     17 #include "ppapi/c/pp_var.h"
     18 
     19 #define PPB_WEBSOCKET_INTERFACE_1_0 "PPB_WebSocket;1.0"
     20 #define PPB_WEBSOCKET_INTERFACE PPB_WEBSOCKET_INTERFACE_1_0
     21 
     22 /**
     23  * @file
     24  * This file defines the <code>PPB_WebSocket</code> interface providing
     25  * bi-directional, full-duplex, communications over a single TCP socket.
     26  */
     27 
     28 
     29 /**
     30  * @addtogroup Enums
     31  * @{
     32  */
     33 /**
     34  * This enumeration contains the types representing the WebSocket ready state
     35  * and these states are based on the JavaScript WebSocket API specification.
     36  * GetReadyState() returns one of these states.
     37  */
     38 typedef enum {
     39   /**
     40    * Ready state is queried on an invalid resource.
     41    */
     42   PP_WEBSOCKETREADYSTATE_INVALID = -1,
     43   /**
     44    * Ready state that the connection has not yet been established.
     45    */
     46   PP_WEBSOCKETREADYSTATE_CONNECTING = 0,
     47   /**
     48    * Ready state that the WebSocket connection is established and communication
     49    * is possible.
     50    */
     51   PP_WEBSOCKETREADYSTATE_OPEN = 1,
     52   /**
     53    * Ready state that the connection is going through the closing handshake.
     54    */
     55   PP_WEBSOCKETREADYSTATE_CLOSING = 2,
     56   /**
     57    * Ready state that the connection has been closed or could not be opened.
     58    */
     59   PP_WEBSOCKETREADYSTATE_CLOSED = 3
     60 } PP_WebSocketReadyState;
     61 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_WebSocketReadyState, 4);
     62 
     63 /**
     64  * This enumeration contains status codes. These codes are used in Close() and
     65  * GetCloseCode(). Refer to RFC 6455, The WebSocket Protocol, for further
     66  * information.
     67  * <code>PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE</code> and codes in the range
     68  * <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN</code> to
     69  * <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MAX</code>, and
     70  * <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MIN</code> to
     71  * <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX</code> are valid for Close().
     72  */
     73 typedef enum {
     74   /**
     75    * Indicates to request closing connection without status code and reason.
     76    *
     77    * (Note that the code 1005 is forbidden to send in actual close frames by
     78    * the RFC. PP_WebSocket reuses this code internally and the code will never
     79    * appear in the actual close frames.)
     80    */
     81   PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED = 1005,
     82   /**
     83    * Status codes in the range 0-999 are not used.
     84    */
     85   /**
     86    * Indicates a normal closure.
     87    */
     88   PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE = 1000,
     89   /**
     90    * Indicates that an endpoint is "going away", such as a server going down.
     91    */
     92   PP_WEBSOCKETSTATUSCODE_GOING_AWAY = 1001,
     93   /**
     94    * Indicates that an endpoint is terminating the connection due to a protocol
     95    * error.
     96    */
     97   PP_WEBSOCKETSTATUSCODE_PROTOCOL_ERROR = 1002,
     98   /**
     99    * Indicates that an endpoint is terminating the connection because it has
    100    * received a type of data it cannot accept.
    101    */
    102   PP_WEBSOCKETSTATUSCODE_UNSUPPORTED_DATA = 1003,
    103   /**
    104    * Status code 1004 is reserved.
    105    */
    106   /**
    107    * Pseudo code to indicate that receiving close frame doesn't contain any
    108    * status code.
    109    */
    110   PP_WEBSOCKETSTATUSCODE_NO_STATUS_RECEIVED = 1005,
    111   /**
    112    * Pseudo code to indicate that connection was closed abnormally, e.g.,
    113    * without closing handshake.
    114    */
    115   PP_WEBSOCKETSTATUSCODE_ABNORMAL_CLOSURE = 1006,
    116   /**
    117    * Indicates that an endpoint is terminating the connection because it has
    118    * received data within a message that was not consistent with the type of
    119    * the message (e.g., non-UTF-8 data within a text message).
    120    */
    121   PP_WEBSOCKETSTATUSCODE_INVALID_FRAME_PAYLOAD_DATA = 1007,
    122   /**
    123    * Indicates that an endpoint is terminating the connection because it has
    124    * received a message that violates its policy.
    125    */
    126   PP_WEBSOCKETSTATUSCODE_POLICY_VIOLATION = 1008,
    127   /**
    128    * Indicates that an endpoint is terminating the connection because it has
    129    * received a message that is too big for it to process.
    130    */
    131   PP_WEBSOCKETSTATUSCODE_MESSAGE_TOO_BIG = 1009,
    132   /**
    133    * Indicates that an endpoint (client) is terminating the connection because
    134    * it has expected the server to negotiate one or more extension, but the
    135    * server didn't return them in the response message of the WebSocket
    136    * handshake.
    137    */
    138   PP_WEBSOCKETSTATUSCODE_MANDATORY_EXTENSION = 1010,
    139   /**
    140    * Indicates that a server is terminating the connection because it
    141    * encountered an unexpected condition.
    142    */
    143   PP_WEBSOCKETSTATUSCODE_INTERNAL_SERVER_ERROR = 1011,
    144   /**
    145    * Status codes in the range 1012-1014 are reserved.
    146    */
    147   /**
    148    * Pseudo code to indicate that the connection was closed due to a failure to
    149    * perform a TLS handshake.
    150    */
    151   PP_WEBSOCKETSTATUSCODE_TLS_HANDSHAKE = 1015,
    152   /**
    153    * Status codes in the range 1016-2999 are reserved.
    154    */
    155   /**
    156    * Status codes in the range 3000-3999 are reserved for use by libraries,
    157    * frameworks, and applications. These codes are registered directly with
    158    * IANA.
    159    */
    160   PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN = 3000,
    161   PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MAX = 3999,
    162   /**
    163    * Status codes in the range 4000-4999 are reserved for private use.
    164    * Application can use these codes for application specific purposes freely.
    165    */
    166   PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MIN = 4000,
    167   PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX = 4999
    168 } PP_WebSocketCloseCode;
    169 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_WebSocketCloseCode, 4);
    170 /**
    171  * @}
    172  */
    173 
    174 /**
    175  * @addtogroup Interfaces
    176  * @{
    177  */
    178 /**
    179  * The <code>PPB_WebSocket</code> interface provides bi-directional,
    180  * full-duplex, communications over a single TCP socket.
    181  */
    182 struct PPB_WebSocket_1_0 {
    183   /**
    184    * Create() creates a WebSocket instance.
    185    *
    186    * @param[in] instance A <code>PP_Instance</code> identifying the instance
    187    * with the WebSocket.
    188    *
    189    * @return A <code>PP_Resource</code> corresponding to a WebSocket if
    190    * successful.
    191    */
    192   PP_Resource (*Create)(PP_Instance instance);
    193   /**
    194    * IsWebSocket() determines if the provided <code>resource</code> is a
    195    * WebSocket instance.
    196    *
    197    * @param[in] resource A <code>PP_Resource</code> corresponding to a
    198    * WebSocket.
    199    *
    200    * @return Returns <code>PP_TRUE</code> if <code>resource</code> is a
    201    * <code>PPB_WebSocket</code>, <code>PP_FALSE</code> if the
    202    * <code>resource</code> is invalid or some type other than
    203    * <code>PPB_WebSocket</code>.
    204    */
    205   PP_Bool (*IsWebSocket)(PP_Resource resource);
    206   /**
    207    * Connect() connects to the specified WebSocket server. You can call this
    208    * function once for a <code>web_socket</code>.
    209    *
    210    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    211    * WebSocket.
    212    *
    213    * @param[in] url A <code>PP_Var</code> representing a WebSocket server URL.
    214    * The <code>PP_VarType</code> must be <code>PP_VARTYPE_STRING</code>.
    215    *
    216    * @param[in] protocols A pointer to an array of <code>PP_Var</code>
    217    * specifying sub-protocols. Each <code>PP_Var</code> represents one
    218    * sub-protocol and its <code>PP_VarType</code> must be
    219    * <code>PP_VARTYPE_STRING</code>. This argument can be null only if
    220    * <code>protocol_count</code> is 0.
    221    *
    222    * @param[in] protocol_count The number of sub-protocols in
    223    * <code>protocols</code>.
    224    *
    225    * @param[in] callback A <code>PP_CompletionCallback</code> called
    226    * when a connection is established or an error occurs in establishing
    227    * connection.
    228    *
    229    * @return An int32_t containing an error code from <code>pp_errors.h</code>.
    230    * Returns <code>PP_ERROR_BADARGUMENT</code> if the specified
    231    * <code>url</code>, or <code>protocols</code> contain an invalid string as
    232    * defined in the WebSocket API specification.
    233    * <code>PP_ERROR_BADARGUMENT</code> corresponds to a SyntaxError in the
    234    * WebSocket API specification.
    235    * Returns <code>PP_ERROR_NOACCESS</code> if the protocol specified in the
    236    * <code>url</code> is not a secure protocol, but the origin of the caller
    237    * has a secure scheme. Also returns <code>PP_ERROR_NOACCESS</code> if the
    238    * port specified in the <code>url</code> is a port that the user agent
    239    * is configured to block access to because it is a well-known port like
    240    * SMTP. <code>PP_ERROR_NOACCESS</code> corresponds to a SecurityError of the
    241    * specification.
    242    * Returns <code>PP_ERROR_INPROGRESS</code> if this is not the first call to
    243    * Connect().
    244    */
    245   int32_t (*Connect)(PP_Resource web_socket,
    246                      struct PP_Var url,
    247                      const struct PP_Var protocols[],
    248                      uint32_t protocol_count,
    249                      struct PP_CompletionCallback callback);
    250   /**
    251    * Close() closes the specified WebSocket connection by specifying
    252    * <code>code</code> and <code>reason</code>.
    253    *
    254    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    255    * WebSocket.
    256    *
    257    * @param[in] code The WebSocket close code. This is ignored if it is
    258    * <code>PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED</code>.
    259    * <code>PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE</code> must be used for the
    260    * usual case. To indicate some specific error cases, codes in the range
    261    * <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN</code> to
    262    * <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MAX</code>, and in the range
    263    * <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MIN</code> to
    264    * <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX</code> are available.
    265    *
    266    * @param[in] reason A <code>PP_Var</code> representing the WebSocket
    267    * close reason. This is ignored if it is <code>PP_VARTYPE_UNDEFINED</code>.
    268    * Otherwise, its <code>PP_VarType</code> must be
    269    * <code>PP_VARTYPE_STRING</code>.
    270    *
    271    * @param[in] callback A <code>PP_CompletionCallback</code> called
    272    * when the connection is closed or an error occurs in closing the
    273    * connection.
    274    *
    275    * @return An int32_t containing an error code from <code>pp_errors.h</code>.
    276    * Returns <code>PP_ERROR_BADARGUMENT</code> if <code>reason</code> contains
    277    * an invalid character as a UTF-8 string, or is longer than 123 bytes.
    278    * <code>PP_ERROR_BADARGUMENT</code> corresponds to a JavaScript SyntaxError
    279    * in the WebSocket API specification.
    280    * Returns <code>PP_ERROR_NOACCESS</code> if the code is not an integer
    281    * equal to 1000 or in the range 3000 to 4999. <code>PP_ERROR_NOACCESS</code>
    282    * corresponds to an InvalidAccessError in the WebSocket API specification.
    283    * Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to Close() is
    284    * not finished.
    285    */
    286   int32_t (*Close)(PP_Resource web_socket,
    287                    uint16_t code,
    288                    struct PP_Var reason,
    289                    struct PP_CompletionCallback callback);
    290   /**
    291    * ReceiveMessage() receives a message from the WebSocket server.
    292    * This interface only returns a single message. That is, this interface must
    293    * be called at least N times to receive N messages, no matter the size of
    294    * each message.
    295    *
    296    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    297    * WebSocket.
    298    *
    299    * @param[out] message The received message is copied to provided
    300    * <code>message</code>. The <code>message</code> must remain valid until
    301    * ReceiveMessage() completes. Its received <code>PP_VarType</code> will be
    302    * <code>PP_VARTYPE_STRING</code> or <code>PP_VARTYPE_ARRAY_BUFFER</code>.
    303    *
    304    * @param[in] callback A <code>PP_CompletionCallback</code> called
    305    * when ReceiveMessage() completes. This callback is ignored if
    306    * ReceiveMessage() completes synchronously and returns <code>PP_OK</code>.
    307    *
    308    * @return An int32_t containing an error code from <code>pp_errors.h</code>.
    309    * If an error is detected or connection is closed, ReceiveMessage() returns
    310    * <code>PP_ERROR_FAILED</code> after all buffered messages are received.
    311    * Until buffered message become empty, ReceiveMessage() continues to return
    312    * <code>PP_OK</code> as if connection is still established without errors.
    313    */
    314   int32_t (*ReceiveMessage)(PP_Resource web_socket,
    315                             struct PP_Var* message,
    316                             struct PP_CompletionCallback callback);
    317   /**
    318    * SendMessage() sends a message to the WebSocket server.
    319    *
    320    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    321    * WebSocket.
    322    *
    323    * @param[in] message A message to send. The message is copied to an internal
    324    * buffer, so the caller can free <code>message</code> safely after returning
    325    * from the function. Its sent <code>PP_VarType</code> must be
    326    * <code>PP_VARTYPE_STRING</code> or <code>PP_VARTYPE_ARRAY_BUFFER</code>.
    327    *
    328    * @return An int32_t containing an error code from <code>pp_errors.h</code>.
    329    * Returns <code>PP_ERROR_FAILED</code> if the ReadyState is
    330    * <code>PP_WEBSOCKETREADYSTATE_CONNECTING</code>.
    331    * <code>PP_ERROR_FAILED</code> corresponds to a JavaScript
    332    * InvalidStateError in the WebSocket API specification.
    333    * Returns <code>PP_ERROR_BADARGUMENT</code> if the provided
    334    * <code>message</code> contains an invalid character as a UTF-8 string.
    335    * <code>PP_ERROR_BADARGUMENT</code> corresponds to a JavaScript
    336    * SyntaxError in the WebSocket API specification.
    337    * Otherwise, returns <code>PP_OK</code>, which doesn't necessarily mean
    338    * that the server received the message.
    339    */
    340   int32_t (*SendMessage)(PP_Resource web_socket, struct PP_Var message);
    341   /**
    342    * GetBufferedAmount() returns the number of bytes of text and binary
    343    * messages that have been queued for the WebSocket connection to send, but
    344    * have not been transmitted to the network yet.
    345    *
    346    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    347    * WebSocket.
    348    *
    349    * @return Returns the number of bytes.
    350    */
    351   uint64_t (*GetBufferedAmount)(PP_Resource web_socket);
    352   /**
    353    * GetCloseCode() returns the connection close code for the WebSocket
    354    * connection.
    355    *
    356    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    357    * WebSocket.
    358    *
    359    * @return Returns 0 if called before the close code is set.
    360    */
    361   uint16_t (*GetCloseCode)(PP_Resource web_socket);
    362   /**
    363    * GetCloseReason() returns the connection close reason for the WebSocket
    364    * connection.
    365    *
    366    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    367    * WebSocket.
    368    *
    369    * @return Returns a <code>PP_VARTYPE_STRING</code> var. If called before the
    370    * close reason is set, the return value contains an empty string. Returns a
    371    * <code>PP_VARTYPE_UNDEFINED</code> if called on an invalid resource.
    372    */
    373   struct PP_Var (*GetCloseReason)(PP_Resource web_socket);
    374   /**
    375    * GetCloseWasClean() returns if the connection was closed cleanly for the
    376    * specified WebSocket connection.
    377    *
    378    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    379    * WebSocket.
    380    *
    381    * @return Returns <code>PP_FALSE</code> if called before the connection is
    382    * closed, called on an invalid resource, or closed for abnormal reasons.
    383    * Otherwise, returns <code>PP_TRUE</code> if the connection was closed
    384    * cleanly.
    385    */
    386   PP_Bool (*GetCloseWasClean)(PP_Resource web_socket);
    387   /**
    388    * GetExtensions() returns the extensions selected by the server for the
    389    * specified WebSocket connection.
    390    *
    391    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    392    * WebSocket.
    393    *
    394    * @return Returns a <code>PP_VARTYPE_STRING</code> var. If called before the
    395    * connection is established, the var's data is an empty string. Returns a
    396    * <code>PP_VARTYPE_UNDEFINED</code> if called on an invalid resource.
    397    */
    398   struct PP_Var (*GetExtensions)(PP_Resource web_socket);
    399   /**
    400    * GetProtocol() returns the sub-protocol chosen by the server for the
    401    * specified WebSocket connection.
    402    *
    403    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    404    * WebSocket.
    405    *
    406    * @return Returns a <code>PP_VARTYPE_STRING</code> var. If called before the
    407    * connection is established, the var contains the empty string. Returns a
    408    * <code>PP_VARTYPE_UNDEFINED</code> if called on an invalid resource.
    409    */
    410   struct PP_Var (*GetProtocol)(PP_Resource web_socket);
    411   /**
    412    * GetReadyState() returns the ready state of the specified WebSocket
    413    * connection.
    414    *
    415    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    416    * WebSocket.
    417    *
    418    * @return Returns <code>PP_WEBSOCKETREADYSTATE_INVALID</code> if called
    419    * before Connect() is called, or if this function is called on an
    420    * invalid resource.
    421    */
    422   PP_WebSocketReadyState (*GetReadyState)(PP_Resource web_socket);
    423   /**
    424    * GetURL() returns the URL associated with specified WebSocket connection.
    425    *
    426    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    427    * WebSocket.
    428    *
    429    * @return Returns a <code>PP_VARTYPE_STRING</code> var. If called before the
    430    * connection is established, the var contains the empty string. Returns a
    431    * <code>PP_VARTYPE_UNDEFINED</code> if this function is called on an
    432    * invalid resource.
    433    */
    434   struct PP_Var (*GetURL)(PP_Resource web_socket);
    435 };
    436 
    437 typedef struct PPB_WebSocket_1_0 PPB_WebSocket;
    438 /**
    439  * @}
    440  */
    441 
    442 #endif  /* PPAPI_C_PPB_WEBSOCKET_H_ */
    443 
    444