diff options
Diffstat (limited to 'ppapi')
24 files changed, 529 insertions, 58 deletions
diff --git a/ppapi/api/ppb_tcp_socket.idl b/ppapi/api/ppb_tcp_socket.idl index 543cd30..5851f1d 100644 --- a/ppapi/api/ppb_tcp_socket.idl +++ b/ppapi/api/ppb_tcp_socket.idl @@ -9,7 +9,8 @@ label Chrome { M29 = 1.0, - M31 = 1.1 + M31 = 1.1, + M41 = 1.2 }; /** @@ -20,14 +21,18 @@ enum PP_TCPSocket_Option { /** * Disables coalescing of small writes to make TCP segments, and instead * delivers data immediately. Value's type is <code>PP_VARTYPE_BOOL</code>. - * This option can only be set after a successful <code>Connect()</code> call. + * On version 1.1 or earlier, this option can only be set after a successful + * <code>Connect()</code> call. On version 1.2 or later, there is no such + * limitation. */ PP_TCPSOCKET_OPTION_NO_DELAY = 0, /** * Specifies the total per-socket buffer space reserved for sends. Value's * type should be <code>PP_VARTYPE_INT32</code>. - * This option can only be set after a successful <code>Connect()</code> call. + * On version 1.1 or earlier, this option can only be set after a successful + * <code>Connect()</code> call. On version 1.2 or later, there is no such + * limitation. * * Note: This is only treated as a hint for the browser to set the buffer * size. Even if <code>SetOption()</code> succeeds, the browser doesn't @@ -38,7 +43,9 @@ enum PP_TCPSocket_Option { /** * Specifies the total per-socket buffer space reserved for receives. Value's * type should be <code>PP_VARTYPE_INT32</code>. - * This option can only be set after a successful <code>Connect()</code> call. + * On version 1.1 or earlier, this option can only be set after a successful + * <code>Connect()</code> call. On version 1.2 or later, there is no such + * limitation. * * Note: This is only treated as a hint for the browser to set the buffer * size. Even if <code>SetOption()</code> succeeds, the browser doesn't @@ -261,4 +268,24 @@ interface PPB_TCPSocket { [in] PP_TCPSocket_Option name, [in] PP_Var value, [in] PP_CompletionCallback callback); + + /** + * Sets a socket option on the TCP socket. + * Please see the <code>PP_TCPSocket_Option</code> description for option + * names, value types and allowed values. + * + * @param[in] tcp_socket A <code>PP_Resource</code> corresponding to a TCP + * socket. + * @param[in] name The option to set. + * @param[in] value The option value to set. + * @param[in] callback A <code>PP_CompletionCallback</code> to be called upon + * completion. + * + * @return An int32_t containing an error code from <code>pp_errors.h</code>. + */ + [version=1.2] + int32_t SetOption([in] PP_Resource tcp_socket, + [in] PP_TCPSocket_Option name, + [in] PP_Var value, + [in] PP_CompletionCallback callback); }; diff --git a/ppapi/api/ppb_udp_socket.idl b/ppapi/api/ppb_udp_socket.idl index e4c87b2..8226c00 100644 --- a/ppapi/api/ppb_udp_socket.idl +++ b/ppapi/api/ppb_udp_socket.idl @@ -7,10 +7,9 @@ * This file defines the <code>PPB_UDPSocket</code> interface. */ -[generate_thunk] - label Chrome { - M29 = 1.0 + M29 = 1.0, + M41 = 1.1 }; /** @@ -28,14 +27,17 @@ enum PP_UDPSocket_Option { /** * Allows sending and receiving packets to and from broadcast addresses. * Value's type should be <code>PP_VARTYPE_BOOL</code>. - * This option can only be set before calling <code>Bind()</code>. + * On version 1.0, this option can only be set before calling + * <code>Bind()</code>. On version 1.1 or later, there is no such limitation. */ PP_UDPSOCKET_OPTION_BROADCAST = 1, /** * Specifies the total per-socket buffer space reserved for sends. Value's * type should be <code>PP_VARTYPE_INT32</code>. - * This option can only be set after a successful <code>Bind()</code> call. + * On version 1.0, this option can only be set after a successful + * <code>Bind()</code> call. On version 1.1 or later, there is no such + * limitation. * * Note: This is only treated as a hint for the browser to set the buffer * size. Even if <code>SetOption()</code> succeeds, the browser doesn't @@ -46,7 +48,9 @@ enum PP_UDPSocket_Option { /** * Specifies the total per-socket buffer space reserved for receives. Value's * type should be <code>PP_VARTYPE_INT32</code>. - * This option can only be set after a successful <code>Bind()</code> call. + * On version 1.0, this option can only be set after a successful + * <code>Bind()</code> call. On version 1.1 or later, there is no such + * limitation. * * Note: This is only treated as a hint for the browser to set the buffer * size. Even if <code>SetOption()</code> succeeds, the browser doesn't @@ -193,4 +197,24 @@ interface PPB_UDPSocket { [in] PP_UDPSocket_Option name, [in] PP_Var value, [in] PP_CompletionCallback callback); + + /** + * Sets a socket option on the UDP socket. + * Please see the <code>PP_UDPSocket_Option</code> description for option + * names, value types and allowed values. + * + * @param[in] udp_socket A <code>PP_Resource</code> corresponding to a UDP + * socket. + * @param[in] name The option to set. + * @param[in] value The option value to set. + * @param[in] callback A <code>PP_CompletionCallback</code> to be called upon + * completion. + * + * @return An int32_t containing an error code from <code>pp_errors.h</code>. + */ + [version=1.1] + int32_t SetOption([in] PP_Resource udp_socket, + [in] PP_UDPSocket_Option name, + [in] PP_Var value, + [in] PP_CompletionCallback callback); }; diff --git a/ppapi/c/ppb_tcp_socket.h b/ppapi/c/ppb_tcp_socket.h index a6fe111..64faa36 100644 --- a/ppapi/c/ppb_tcp_socket.h +++ b/ppapi/c/ppb_tcp_socket.h @@ -3,7 +3,7 @@ * found in the LICENSE file. */ -/* From ppb_tcp_socket.idl modified Fri Sep 20 09:58:19 2013. */ +/* From ppb_tcp_socket.idl modified Mon Dec 8 16:50:44 2014. */ #ifndef PPAPI_C_PPB_TCP_SOCKET_H_ #define PPAPI_C_PPB_TCP_SOCKET_H_ @@ -18,7 +18,8 @@ #define PPB_TCPSOCKET_INTERFACE_1_0 "PPB_TCPSocket;1.0" #define PPB_TCPSOCKET_INTERFACE_1_1 "PPB_TCPSocket;1.1" -#define PPB_TCPSOCKET_INTERFACE PPB_TCPSOCKET_INTERFACE_1_1 +#define PPB_TCPSOCKET_INTERFACE_1_2 "PPB_TCPSocket;1.2" +#define PPB_TCPSOCKET_INTERFACE PPB_TCPSOCKET_INTERFACE_1_2 /** * @file @@ -37,13 +38,17 @@ typedef enum { /** * Disables coalescing of small writes to make TCP segments, and instead * delivers data immediately. Value's type is <code>PP_VARTYPE_BOOL</code>. - * This option can only be set after a successful <code>Connect()</code> call. + * On version 1.1 or earlier, this option can only be set after a successful + * <code>Connect()</code> call. On version 1.2 or later, there is no such + * limitation. */ PP_TCPSOCKET_OPTION_NO_DELAY = 0, /** * Specifies the total per-socket buffer space reserved for sends. Value's * type should be <code>PP_VARTYPE_INT32</code>. - * This option can only be set after a successful <code>Connect()</code> call. + * On version 1.1 or earlier, this option can only be set after a successful + * <code>Connect()</code> call. On version 1.2 or later, there is no such + * limitation. * * Note: This is only treated as a hint for the browser to set the buffer * size. Even if <code>SetOption()</code> succeeds, the browser doesn't @@ -53,7 +58,9 @@ typedef enum { /** * Specifies the total per-socket buffer space reserved for receives. Value's * type should be <code>PP_VARTYPE_INT32</code>. - * This option can only be set after a successful <code>Connect()</code> call. + * On version 1.1 or earlier, this option can only be set after a successful + * <code>Connect()</code> call. On version 1.2 or later, there is no such + * limitation. * * Note: This is only treated as a hint for the browser to set the buffer * size. Even if <code>SetOption()</code> succeeds, the browser doesn't @@ -79,7 +86,7 @@ PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_TCPSocket_Option, 4); * For more details about network communication permissions, please see: * http://developer.chrome.com/apps/app_network.html */ -struct PPB_TCPSocket_1_1 { +struct PPB_TCPSocket_1_2 { /** * Creates a TCP socket resource. * @@ -273,7 +280,7 @@ struct PPB_TCPSocket_1_1 { struct PP_CompletionCallback callback); }; -typedef struct PPB_TCPSocket_1_1 PPB_TCPSocket; +typedef struct PPB_TCPSocket_1_2 PPB_TCPSocket; struct PPB_TCPSocket_1_0 { PP_Resource (*Create)(PP_Instance instance); @@ -297,6 +304,38 @@ struct PPB_TCPSocket_1_0 { struct PP_Var value, struct PP_CompletionCallback callback); }; + +struct PPB_TCPSocket_1_1 { + PP_Resource (*Create)(PP_Instance instance); + PP_Bool (*IsTCPSocket)(PP_Resource resource); + int32_t (*Bind)(PP_Resource tcp_socket, + PP_Resource addr, + struct PP_CompletionCallback callback); + int32_t (*Connect)(PP_Resource tcp_socket, + PP_Resource addr, + struct PP_CompletionCallback callback); + PP_Resource (*GetLocalAddress)(PP_Resource tcp_socket); + PP_Resource (*GetRemoteAddress)(PP_Resource tcp_socket); + int32_t (*Read)(PP_Resource tcp_socket, + char* buffer, + int32_t bytes_to_read, + struct PP_CompletionCallback callback); + int32_t (*Write)(PP_Resource tcp_socket, + const char* buffer, + int32_t bytes_to_write, + struct PP_CompletionCallback callback); + int32_t (*Listen)(PP_Resource tcp_socket, + int32_t backlog, + struct PP_CompletionCallback callback); + int32_t (*Accept)(PP_Resource tcp_socket, + PP_Resource* accepted_tcp_socket, + struct PP_CompletionCallback callback); + void (*Close)(PP_Resource tcp_socket); + int32_t (*SetOption)(PP_Resource tcp_socket, + PP_TCPSocket_Option name, + struct PP_Var value, + struct PP_CompletionCallback callback); +}; /** * @} */ diff --git a/ppapi/c/ppb_udp_socket.h b/ppapi/c/ppb_udp_socket.h index 5551c33..aa3fa74 100644 --- a/ppapi/c/ppb_udp_socket.h +++ b/ppapi/c/ppb_udp_socket.h @@ -3,7 +3,7 @@ * found in the LICENSE file. */ -/* From ppb_udp_socket.idl modified Sat Jun 22 10:56:26 2013. */ +/* From ppb_udp_socket.idl modified Wed Dec 10 04:11:03 2014. */ #ifndef PPAPI_C_PPB_UDP_SOCKET_H_ #define PPAPI_C_PPB_UDP_SOCKET_H_ @@ -17,7 +17,8 @@ #include "ppapi/c/pp_var.h" #define PPB_UDPSOCKET_INTERFACE_1_0 "PPB_UDPSocket;1.0" -#define PPB_UDPSOCKET_INTERFACE PPB_UDPSOCKET_INTERFACE_1_0 +#define PPB_UDPSOCKET_INTERFACE_1_1 "PPB_UDPSocket;1.1" +#define PPB_UDPSOCKET_INTERFACE PPB_UDPSOCKET_INTERFACE_1_1 /** * @file @@ -42,13 +43,16 @@ typedef enum { /** * Allows sending and receiving packets to and from broadcast addresses. * Value's type should be <code>PP_VARTYPE_BOOL</code>. - * This option can only be set before calling <code>Bind()</code>. + * On version 1.0, this option can only be set before calling + * <code>Bind()</code>. On version 1.1 or later, there is no such limitation. */ PP_UDPSOCKET_OPTION_BROADCAST = 1, /** * Specifies the total per-socket buffer space reserved for sends. Value's * type should be <code>PP_VARTYPE_INT32</code>. - * This option can only be set after a successful <code>Bind()</code> call. + * On version 1.0, this option can only be set after a successful + * <code>Bind()</code> call. On version 1.1 or later, there is no such + * limitation. * * Note: This is only treated as a hint for the browser to set the buffer * size. Even if <code>SetOption()</code> succeeds, the browser doesn't @@ -58,7 +62,9 @@ typedef enum { /** * Specifies the total per-socket buffer space reserved for receives. Value's * type should be <code>PP_VARTYPE_INT32</code>. - * This option can only be set after a successful <code>Bind()</code> call. + * On version 1.0, this option can only be set after a successful + * <code>Bind()</code> call. On version 1.1 or later, there is no such + * limitation. * * Note: This is only treated as a hint for the browser to set the buffer * size. Even if <code>SetOption()</code> succeeds, the browser doesn't @@ -84,7 +90,7 @@ PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_UDPSocket_Option, 4); * For more details about network communication permissions, please see: * http://developer.chrome.com/apps/app_network.html */ -struct PPB_UDPSocket_1_0 { +struct PPB_UDPSocket_1_1 { /** * Creates a UDP socket resource. * @@ -208,7 +214,31 @@ struct PPB_UDPSocket_1_0 { struct PP_CompletionCallback callback); }; -typedef struct PPB_UDPSocket_1_0 PPB_UDPSocket; +typedef struct PPB_UDPSocket_1_1 PPB_UDPSocket; + +struct PPB_UDPSocket_1_0 { + PP_Resource (*Create)(PP_Instance instance); + PP_Bool (*IsUDPSocket)(PP_Resource resource); + int32_t (*Bind)(PP_Resource udp_socket, + PP_Resource addr, + struct PP_CompletionCallback callback); + PP_Resource (*GetBoundAddress)(PP_Resource udp_socket); + int32_t (*RecvFrom)(PP_Resource udp_socket, + char* buffer, + int32_t num_bytes, + PP_Resource* addr, + struct PP_CompletionCallback callback); + int32_t (*SendTo)(PP_Resource udp_socket, + const char* buffer, + int32_t num_bytes, + PP_Resource addr, + struct PP_CompletionCallback callback); + void (*Close)(PP_Resource udp_socket); + int32_t (*SetOption)(PP_Resource udp_socket, + PP_UDPSocket_Option name, + struct PP_Var value, + struct PP_CompletionCallback callback); +}; /** * @} */ diff --git a/ppapi/cpp/tcp_socket.cc b/ppapi/cpp/tcp_socket.cc index ab08ff3..900d2ad 100644 --- a/ppapi/cpp/tcp_socket.cc +++ b/ppapi/cpp/tcp_socket.cc @@ -21,13 +21,20 @@ template <> const char* interface_name<PPB_TCPSocket_1_1>() { return PPB_TCPSOCKET_INTERFACE_1_1; } +template <> const char* interface_name<PPB_TCPSocket_1_2>() { + return PPB_TCPSOCKET_INTERFACE_1_2; +} + } // namespace TCPSocket::TCPSocket() { } TCPSocket::TCPSocket(const InstanceHandle& instance) { - if (has_interface<PPB_TCPSocket_1_1>()) { + if (has_interface<PPB_TCPSocket_1_2>()) { + PassRefFromConstructor(get_interface<PPB_TCPSocket_1_2>()->Create( + instance.pp_instance())); + } else 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>()) { @@ -53,12 +60,17 @@ TCPSocket& TCPSocket::operator=(const TCPSocket& other) { // static bool TCPSocket::IsAvailable() { - return has_interface<PPB_TCPSocket_1_1>() || + return has_interface<PPB_TCPSocket_1_2>() || + 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_2>()) { + return get_interface<PPB_TCPSocket_1_2>()->Bind( + pp_resource(), addr.pp_resource(), callback.pp_completion_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()); @@ -68,6 +80,10 @@ int32_t TCPSocket::Bind(const NetAddress& addr, int32_t TCPSocket::Connect(const NetAddress& addr, const CompletionCallback& callback) { + if (has_interface<PPB_TCPSocket_1_2>()) { + return get_interface<PPB_TCPSocket_1_2>()->Connect( + pp_resource(), addr.pp_resource(), callback.pp_completion_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()); @@ -80,6 +96,11 @@ int32_t TCPSocket::Connect(const NetAddress& addr, } NetAddress TCPSocket::GetLocalAddress() const { + if (has_interface<PPB_TCPSocket_1_2>()) { + return NetAddress( + PASS_REF, + get_interface<PPB_TCPSocket_1_2>()->GetLocalAddress(pp_resource())); + } if (has_interface<PPB_TCPSocket_1_1>()) { return NetAddress( PASS_REF, @@ -94,6 +115,11 @@ NetAddress TCPSocket::GetLocalAddress() const { } NetAddress TCPSocket::GetRemoteAddress() const { + if (has_interface<PPB_TCPSocket_1_2>()) { + return NetAddress( + PASS_REF, + get_interface<PPB_TCPSocket_1_2>()->GetRemoteAddress(pp_resource())); + } if (has_interface<PPB_TCPSocket_1_1>()) { return NetAddress( PASS_REF, @@ -110,6 +136,11 @@ NetAddress TCPSocket::GetRemoteAddress() const { int32_t TCPSocket::Read(char* buffer, int32_t bytes_to_read, const CompletionCallback& callback) { + if (has_interface<PPB_TCPSocket_1_2>()) { + return get_interface<PPB_TCPSocket_1_2>()->Read( + pp_resource(), buffer, bytes_to_read, + callback.pp_completion_callback()); + } if (has_interface<PPB_TCPSocket_1_1>()) { return get_interface<PPB_TCPSocket_1_1>()->Read( pp_resource(), buffer, bytes_to_read, @@ -126,6 +157,11 @@ int32_t TCPSocket::Read(char* buffer, int32_t TCPSocket::Write(const char* buffer, int32_t bytes_to_write, const CompletionCallback& callback) { + if (has_interface<PPB_TCPSocket_1_2>()) { + return get_interface<PPB_TCPSocket_1_2>()->Write( + pp_resource(), buffer, bytes_to_write, + callback.pp_completion_callback()); + } if (has_interface<PPB_TCPSocket_1_1>()) { return get_interface<PPB_TCPSocket_1_1>()->Write( pp_resource(), buffer, bytes_to_write, @@ -141,6 +177,10 @@ int32_t TCPSocket::Write(const char* buffer, int32_t TCPSocket::Listen(int32_t backlog, const CompletionCallback& callback) { + if (has_interface<PPB_TCPSocket_1_2>()) { + return get_interface<PPB_TCPSocket_1_2>()->Listen( + pp_resource(), backlog, callback.pp_completion_callback()); + } if (has_interface<PPB_TCPSocket_1_1>()) { return get_interface<PPB_TCPSocket_1_1>()->Listen( pp_resource(), backlog, callback.pp_completion_callback()); @@ -150,6 +190,10 @@ int32_t TCPSocket::Listen(int32_t backlog, int32_t TCPSocket::Accept( const CompletionCallbackWithOutput<TCPSocket>& callback) { + if (has_interface<PPB_TCPSocket_1_2>()) { + return get_interface<PPB_TCPSocket_1_2>()->Accept( + pp_resource(), callback.output(), callback.pp_completion_callback()); + } if (has_interface<PPB_TCPSocket_1_1>()) { return get_interface<PPB_TCPSocket_1_1>()->Accept( pp_resource(), callback.output(), callback.pp_completion_callback()); @@ -158,7 +202,9 @@ int32_t TCPSocket::Accept( } void TCPSocket::Close() { - if (has_interface<PPB_TCPSocket_1_1>()) { + if (has_interface<PPB_TCPSocket_1_2>()) { + get_interface<PPB_TCPSocket_1_2>()->Close(pp_resource()); + } else 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()); @@ -168,6 +214,10 @@ void TCPSocket::Close() { int32_t TCPSocket::SetOption(PP_TCPSocket_Option name, const Var& value, const CompletionCallback& callback) { + if (has_interface<PPB_TCPSocket_1_2>()) { + return get_interface<PPB_TCPSocket_1_2>()->SetOption( + pp_resource(), name, value.pp_var(), callback.pp_completion_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()); diff --git a/ppapi/cpp/udp_socket.cc b/ppapi/cpp/udp_socket.cc index bb4b1c8..2f8c505 100644 --- a/ppapi/cpp/udp_socket.cc +++ b/ppapi/cpp/udp_socket.cc @@ -18,13 +18,20 @@ template <> const char* interface_name<PPB_UDPSocket_1_0>() { return PPB_UDPSOCKET_INTERFACE_1_0; } +template <> const char* interface_name<PPB_UDPSocket_1_1>() { + return PPB_UDPSOCKET_INTERFACE_1_1; +} + } // namespace UDPSocket::UDPSocket() { } UDPSocket::UDPSocket(const InstanceHandle& instance) { - if (has_interface<PPB_UDPSocket_1_0>()) { + if (has_interface<PPB_UDPSocket_1_1>()) { + PassRefFromConstructor(get_interface<PPB_UDPSocket_1_1>()->Create( + instance.pp_instance())); + } else if (has_interface<PPB_UDPSocket_1_0>()) { PassRefFromConstructor(get_interface<PPB_UDPSocket_1_0>()->Create( instance.pp_instance())); } @@ -47,11 +54,16 @@ UDPSocket& UDPSocket::operator=(const UDPSocket& other) { // static bool UDPSocket::IsAvailable() { - return has_interface<PPB_UDPSocket_1_0>(); + return has_interface<PPB_UDPSocket_1_1>() || + has_interface<PPB_UDPSocket_1_0>(); } int32_t UDPSocket::Bind(const NetAddress& addr, const CompletionCallback& callback) { + if (has_interface<PPB_UDPSocket_1_1>()) { + return get_interface<PPB_UDPSocket_1_1>()->Bind( + pp_resource(), addr.pp_resource(), callback.pp_completion_callback()); + } if (has_interface<PPB_UDPSocket_1_0>()) { return get_interface<PPB_UDPSocket_1_0>()->Bind( pp_resource(), addr.pp_resource(), callback.pp_completion_callback()); @@ -60,6 +72,11 @@ int32_t UDPSocket::Bind(const NetAddress& addr, } NetAddress UDPSocket::GetBoundAddress() { + if (has_interface<PPB_UDPSocket_1_1>()) { + return NetAddress( + PASS_REF, + get_interface<PPB_UDPSocket_1_1>()->GetBoundAddress(pp_resource())); + } if (has_interface<PPB_UDPSocket_1_0>()) { return NetAddress( PASS_REF, @@ -72,6 +89,11 @@ int32_t UDPSocket::RecvFrom( char* buffer, int32_t num_bytes, const CompletionCallbackWithOutput<NetAddress>& callback) { + if (has_interface<PPB_UDPSocket_1_1>()) { + return get_interface<PPB_UDPSocket_1_1>()->RecvFrom( + pp_resource(), buffer, num_bytes, callback.output(), + callback.pp_completion_callback()); + } if (has_interface<PPB_UDPSocket_1_0>()) { return get_interface<PPB_UDPSocket_1_0>()->RecvFrom( pp_resource(), buffer, num_bytes, callback.output(), @@ -84,6 +106,11 @@ int32_t UDPSocket::SendTo(const char* buffer, int32_t num_bytes, const NetAddress& addr, const CompletionCallback& callback) { + if (has_interface<PPB_UDPSocket_1_1>()) { + return get_interface<PPB_UDPSocket_1_1>()->SendTo( + pp_resource(), buffer, num_bytes, addr.pp_resource(), + callback.pp_completion_callback()); + } if (has_interface<PPB_UDPSocket_1_0>()) { return get_interface<PPB_UDPSocket_1_0>()->SendTo( pp_resource(), buffer, num_bytes, addr.pp_resource(), @@ -93,6 +120,8 @@ int32_t UDPSocket::SendTo(const char* buffer, } void UDPSocket::Close() { + if (has_interface<PPB_UDPSocket_1_1>()) + return get_interface<PPB_UDPSocket_1_1>()->Close(pp_resource()); if (has_interface<PPB_UDPSocket_1_0>()) return get_interface<PPB_UDPSocket_1_0>()->Close(pp_resource()); } @@ -100,6 +129,10 @@ void UDPSocket::Close() { int32_t UDPSocket::SetOption(PP_UDPSocket_Option name, const Var& value, const CompletionCallback& callback) { + if (has_interface<PPB_UDPSocket_1_1>()) { + return get_interface<PPB_UDPSocket_1_1>()->SetOption( + pp_resource(), name, value.pp_var(), callback.pp_completion_callback()); + } if (has_interface<PPB_UDPSocket_1_0>()) { return get_interface<PPB_UDPSocket_1_0>()->SetOption( pp_resource(), name, value.pp_var(), callback.pp_completion_callback()); diff --git a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c index 82e09e8..f2cd8ca 100644 --- a/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c +++ b/ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c @@ -132,8 +132,10 @@ static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetworkMonitor_1_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetworkProxy_1_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_1_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_1_1; +static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_1_2; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TextInputController_1_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_1_0; +static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_1_1; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_URLLoader_1_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_URLRequestInfo_1_0; static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_URLResponseInfo_1_0; @@ -1605,6 +1607,70 @@ static int32_t Pnacl_M31_PPB_TCPSocket_SetOption(PP_Resource tcp_socket, PP_TCPS /* End wrapper methods for PPB_TCPSocket_1_1 */ +/* Begin wrapper methods for PPB_TCPSocket_1_2 */ + +static PP_Resource Pnacl_M41_PPB_TCPSocket_Create(PP_Instance instance) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->Create(instance); +} + +static PP_Bool Pnacl_M41_PPB_TCPSocket_IsTCPSocket(PP_Resource resource) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->IsTCPSocket(resource); +} + +static int32_t Pnacl_M41_PPB_TCPSocket_Bind(PP_Resource tcp_socket, PP_Resource addr, struct PP_CompletionCallback* callback) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->Bind(tcp_socket, addr, *callback); +} + +static int32_t Pnacl_M41_PPB_TCPSocket_Connect(PP_Resource tcp_socket, PP_Resource addr, struct PP_CompletionCallback* callback) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->Connect(tcp_socket, addr, *callback); +} + +static PP_Resource Pnacl_M41_PPB_TCPSocket_GetLocalAddress(PP_Resource tcp_socket) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->GetLocalAddress(tcp_socket); +} + +static PP_Resource Pnacl_M41_PPB_TCPSocket_GetRemoteAddress(PP_Resource tcp_socket) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->GetRemoteAddress(tcp_socket); +} + +static int32_t Pnacl_M41_PPB_TCPSocket_Read(PP_Resource tcp_socket, char* buffer, int32_t bytes_to_read, struct PP_CompletionCallback* callback) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->Read(tcp_socket, buffer, bytes_to_read, *callback); +} + +static int32_t Pnacl_M41_PPB_TCPSocket_Write(PP_Resource tcp_socket, const char* buffer, int32_t bytes_to_write, struct PP_CompletionCallback* callback) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->Write(tcp_socket, buffer, bytes_to_write, *callback); +} + +static int32_t Pnacl_M41_PPB_TCPSocket_Listen(PP_Resource tcp_socket, int32_t backlog, struct PP_CompletionCallback* callback) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->Listen(tcp_socket, backlog, *callback); +} + +static int32_t Pnacl_M41_PPB_TCPSocket_Accept(PP_Resource tcp_socket, PP_Resource* accepted_tcp_socket, struct PP_CompletionCallback* callback) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->Accept(tcp_socket, accepted_tcp_socket, *callback); +} + +static void Pnacl_M41_PPB_TCPSocket_Close(PP_Resource tcp_socket) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + iface->Close(tcp_socket); +} + +static int32_t Pnacl_M41_PPB_TCPSocket_SetOption(PP_Resource tcp_socket, PP_TCPSocket_Option name, struct PP_Var* value, struct PP_CompletionCallback* callback) { + const struct PPB_TCPSocket_1_2 *iface = Pnacl_WrapperInfo_PPB_TCPSocket_1_2.real_iface; + return iface->SetOption(tcp_socket, name, *value, *callback); +} + +/* End wrapper methods for PPB_TCPSocket_1_2 */ + /* Begin wrapper methods for PPB_TextInputController_1_0 */ static void Pnacl_M30_PPB_TextInputController_SetTextInputType(PP_Instance instance, PP_TextInput_Type type) { @@ -1673,6 +1739,50 @@ static int32_t Pnacl_M29_PPB_UDPSocket_SetOption(PP_Resource udp_socket, PP_UDPS /* End wrapper methods for PPB_UDPSocket_1_0 */ +/* Begin wrapper methods for PPB_UDPSocket_1_1 */ + +static PP_Resource Pnacl_M41_PPB_UDPSocket_Create(PP_Instance instance) { + const struct PPB_UDPSocket_1_1 *iface = Pnacl_WrapperInfo_PPB_UDPSocket_1_1.real_iface; + return iface->Create(instance); +} + +static PP_Bool Pnacl_M41_PPB_UDPSocket_IsUDPSocket(PP_Resource resource) { + const struct PPB_UDPSocket_1_1 *iface = Pnacl_WrapperInfo_PPB_UDPSocket_1_1.real_iface; + return iface->IsUDPSocket(resource); +} + +static int32_t Pnacl_M41_PPB_UDPSocket_Bind(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback* callback) { + const struct PPB_UDPSocket_1_1 *iface = Pnacl_WrapperInfo_PPB_UDPSocket_1_1.real_iface; + return iface->Bind(udp_socket, addr, *callback); +} + +static PP_Resource Pnacl_M41_PPB_UDPSocket_GetBoundAddress(PP_Resource udp_socket) { + const struct PPB_UDPSocket_1_1 *iface = Pnacl_WrapperInfo_PPB_UDPSocket_1_1.real_iface; + return iface->GetBoundAddress(udp_socket); +} + +static int32_t Pnacl_M41_PPB_UDPSocket_RecvFrom(PP_Resource udp_socket, char* buffer, int32_t num_bytes, PP_Resource* addr, struct PP_CompletionCallback* callback) { + const struct PPB_UDPSocket_1_1 *iface = Pnacl_WrapperInfo_PPB_UDPSocket_1_1.real_iface; + return iface->RecvFrom(udp_socket, buffer, num_bytes, addr, *callback); +} + +static int32_t Pnacl_M41_PPB_UDPSocket_SendTo(PP_Resource udp_socket, const char* buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback* callback) { + const struct PPB_UDPSocket_1_1 *iface = Pnacl_WrapperInfo_PPB_UDPSocket_1_1.real_iface; + return iface->SendTo(udp_socket, buffer, num_bytes, addr, *callback); +} + +static void Pnacl_M41_PPB_UDPSocket_Close(PP_Resource udp_socket) { + const struct PPB_UDPSocket_1_1 *iface = Pnacl_WrapperInfo_PPB_UDPSocket_1_1.real_iface; + iface->Close(udp_socket); +} + +static int32_t Pnacl_M41_PPB_UDPSocket_SetOption(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var* value, struct PP_CompletionCallback* callback) { + const struct PPB_UDPSocket_1_1 *iface = Pnacl_WrapperInfo_PPB_UDPSocket_1_1.real_iface; + return iface->SetOption(udp_socket, name, *value, *callback); +} + +/* End wrapper methods for PPB_UDPSocket_1_1 */ + /* Begin wrapper methods for PPB_URLLoader_1_0 */ static PP_Resource Pnacl_M14_PPB_URLLoader_Create(PP_Instance instance) { @@ -4951,6 +5061,21 @@ static const struct PPB_TCPSocket_1_1 Pnacl_Wrappers_PPB_TCPSocket_1_1 = { .SetOption = (int32_t (*)(PP_Resource tcp_socket, PP_TCPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback))&Pnacl_M31_PPB_TCPSocket_SetOption }; +static const struct PPB_TCPSocket_1_2 Pnacl_Wrappers_PPB_TCPSocket_1_2 = { + .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M41_PPB_TCPSocket_Create, + .IsTCPSocket = (PP_Bool (*)(PP_Resource resource))&Pnacl_M41_PPB_TCPSocket_IsTCPSocket, + .Bind = (int32_t (*)(PP_Resource tcp_socket, PP_Resource addr, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_TCPSocket_Bind, + .Connect = (int32_t (*)(PP_Resource tcp_socket, PP_Resource addr, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_TCPSocket_Connect, + .GetLocalAddress = (PP_Resource (*)(PP_Resource tcp_socket))&Pnacl_M41_PPB_TCPSocket_GetLocalAddress, + .GetRemoteAddress = (PP_Resource (*)(PP_Resource tcp_socket))&Pnacl_M41_PPB_TCPSocket_GetRemoteAddress, + .Read = (int32_t (*)(PP_Resource tcp_socket, char* buffer, int32_t bytes_to_read, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_TCPSocket_Read, + .Write = (int32_t (*)(PP_Resource tcp_socket, const char* buffer, int32_t bytes_to_write, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_TCPSocket_Write, + .Listen = (int32_t (*)(PP_Resource tcp_socket, int32_t backlog, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_TCPSocket_Listen, + .Accept = (int32_t (*)(PP_Resource tcp_socket, PP_Resource* accepted_tcp_socket, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_TCPSocket_Accept, + .Close = (void (*)(PP_Resource tcp_socket))&Pnacl_M41_PPB_TCPSocket_Close, + .SetOption = (int32_t (*)(PP_Resource tcp_socket, PP_TCPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_TCPSocket_SetOption +}; + static const struct PPB_TextInputController_1_0 Pnacl_Wrappers_PPB_TextInputController_1_0 = { .SetTextInputType = (void (*)(PP_Instance instance, PP_TextInput_Type type))&Pnacl_M30_PPB_TextInputController_SetTextInputType, .UpdateCaretPosition = (void (*)(PP_Instance instance, const struct PP_Rect* caret))&Pnacl_M30_PPB_TextInputController_UpdateCaretPosition, @@ -4969,6 +5094,17 @@ static const struct PPB_UDPSocket_1_0 Pnacl_Wrappers_PPB_UDPSocket_1_0 = { .SetOption = (int32_t (*)(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback))&Pnacl_M29_PPB_UDPSocket_SetOption }; +static const struct PPB_UDPSocket_1_1 Pnacl_Wrappers_PPB_UDPSocket_1_1 = { + .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M41_PPB_UDPSocket_Create, + .IsUDPSocket = (PP_Bool (*)(PP_Resource resource))&Pnacl_M41_PPB_UDPSocket_IsUDPSocket, + .Bind = (int32_t (*)(PP_Resource udp_socket, PP_Resource addr, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_UDPSocket_Bind, + .GetBoundAddress = (PP_Resource (*)(PP_Resource udp_socket))&Pnacl_M41_PPB_UDPSocket_GetBoundAddress, + .RecvFrom = (int32_t (*)(PP_Resource udp_socket, char* buffer, int32_t num_bytes, PP_Resource* addr, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_UDPSocket_RecvFrom, + .SendTo = (int32_t (*)(PP_Resource udp_socket, const char* buffer, int32_t num_bytes, PP_Resource addr, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_UDPSocket_SendTo, + .Close = (void (*)(PP_Resource udp_socket))&Pnacl_M41_PPB_UDPSocket_Close, + .SetOption = (int32_t (*)(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, struct PP_CompletionCallback callback))&Pnacl_M41_PPB_UDPSocket_SetOption +}; + static const struct PPB_URLLoader_1_0 Pnacl_Wrappers_PPB_URLLoader_1_0 = { .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M14_PPB_URLLoader_Create, .IsURLLoader = (PP_Bool (*)(PP_Resource resource))&Pnacl_M14_PPB_URLLoader_IsURLLoader, @@ -6000,6 +6136,12 @@ static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_1_1 = { .real_iface = NULL }; +static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_1_2 = { + .iface_macro = PPB_TCPSOCKET_INTERFACE_1_2, + .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_TCPSocket_1_2, + .real_iface = NULL +}; + static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TextInputController_1_0 = { .iface_macro = PPB_TEXTINPUTCONTROLLER_INTERFACE_1_0, .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_TextInputController_1_0, @@ -6012,6 +6154,12 @@ static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_1_0 = { .real_iface = NULL }; +static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_1_1 = { + .iface_macro = PPB_UDPSOCKET_INTERFACE_1_1, + .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_UDPSocket_1_1, + .real_iface = NULL +}; + static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_URLLoader_1_0 = { .iface_macro = PPB_URLLOADER_INTERFACE_1_0, .wrapped_iface = (const void *) &Pnacl_Wrappers_PPB_URLLoader_1_0, @@ -6481,8 +6629,10 @@ static struct __PnaclWrapperInfo *s_ppb_wrappers[] = { &Pnacl_WrapperInfo_PPB_NetworkProxy_1_0, &Pnacl_WrapperInfo_PPB_TCPSocket_1_0, &Pnacl_WrapperInfo_PPB_TCPSocket_1_1, + &Pnacl_WrapperInfo_PPB_TCPSocket_1_2, &Pnacl_WrapperInfo_PPB_TextInputController_1_0, &Pnacl_WrapperInfo_PPB_UDPSocket_1_0, + &Pnacl_WrapperInfo_PPB_UDPSocket_1_1, &Pnacl_WrapperInfo_PPB_URLLoader_1_0, &Pnacl_WrapperInfo_PPB_URLRequestInfo_1_0, &Pnacl_WrapperInfo_PPB_URLResponseInfo_1_0, diff --git a/ppapi/proxy/tcp_socket_private_resource.cc b/ppapi/proxy/tcp_socket_private_resource.cc index 76ed4b9..454c3fa 100644 --- a/ppapi/proxy/tcp_socket_private_resource.cc +++ b/ppapi/proxy/tcp_socket_private_resource.cc @@ -101,7 +101,9 @@ int32_t TCPSocketPrivateResource::SetOption( case PP_TCPSOCKETOPTION_PRIVATE_INVALID: return PP_ERROR_BADARGUMENT; case PP_TCPSOCKETOPTION_PRIVATE_NO_DELAY: - return SetOptionImpl(PP_TCPSOCKET_OPTION_NO_DELAY, value, callback); + return SetOptionImpl(PP_TCPSOCKET_OPTION_NO_DELAY, value, + true, // Check connect() state. + callback); default: NOTREACHED(); return PP_ERROR_BADARGUMENT; diff --git a/ppapi/proxy/tcp_socket_resource.cc b/ppapi/proxy/tcp_socket_resource.cc index f8f8f68..5466d0d 100644 --- a/ppapi/proxy/tcp_socket_resource.cc +++ b/ppapi/proxy/tcp_socket_resource.cc @@ -115,10 +115,21 @@ void TCPSocketResource::Close() { CloseImpl(); } +int32_t TCPSocketResource::SetOption1_1( + PP_TCPSocket_Option name, + const PP_Var& value, + scoped_refptr<TrackedCallback> callback) { + return SetOptionImpl(name, value, + true, // Check connect() state. + callback); +} + int32_t TCPSocketResource::SetOption(PP_TCPSocket_Option name, const PP_Var& value, scoped_refptr<TrackedCallback> callback) { - return SetOptionImpl(name, value, callback); + return SetOptionImpl(name, value, + false, // Do not check connect() state. + callback); } PP_Resource TCPSocketResource::CreateAcceptedSocket( diff --git a/ppapi/proxy/tcp_socket_resource.h b/ppapi/proxy/tcp_socket_resource.h index 6a8e9ff..6ac0929 100644 --- a/ppapi/proxy/tcp_socket_resource.h +++ b/ppapi/proxy/tcp_socket_resource.h @@ -47,6 +47,10 @@ class PPAPI_PROXY_EXPORT TCPSocketResource : public thunk::PPB_TCPSocket_API, virtual int32_t Accept(PP_Resource* accepted_tcp_socket, scoped_refptr<TrackedCallback> callback) override; virtual void Close() override; + virtual int32_t SetOption1_1( + PP_TCPSocket_Option name, + const PP_Var& value, + scoped_refptr<TrackedCallback> callback) override; virtual int32_t SetOption(PP_TCPSocket_Option name, const PP_Var& value, scoped_refptr<TrackedCallback> callback) override; diff --git a/ppapi/proxy/tcp_socket_resource_base.cc b/ppapi/proxy/tcp_socket_resource_base.cc index 39c9fa3..fb4db5b 100644 --- a/ppapi/proxy/tcp_socket_resource_base.cc +++ b/ppapi/proxy/tcp_socket_resource_base.cc @@ -318,11 +318,12 @@ void TCPSocketResourceBase::CloseImpl() { int32_t TCPSocketResourceBase::SetOptionImpl( PP_TCPSocket_Option name, const PP_Var& value, + bool check_connect_state, scoped_refptr<TrackedCallback> callback) { SocketOptionData option_data; switch (name) { case PP_TCPSOCKET_OPTION_NO_DELAY: { - if (!state_.IsConnected()) + if (check_connect_state && !state_.IsConnected()) return PP_ERROR_FAILED; if (value.type != PP_VARTYPE_BOOL) @@ -332,7 +333,7 @@ int32_t TCPSocketResourceBase::SetOptionImpl( } case PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE: case PP_TCPSOCKET_OPTION_RECV_BUFFER_SIZE: { - if (!state_.IsConnected()) + if (check_connect_state && !state_.IsConnected()) return PP_ERROR_FAILED; if (value.type != PP_VARTYPE_INT32) diff --git a/ppapi/proxy/tcp_socket_resource_base.h b/ppapi/proxy/tcp_socket_resource_base.h index 8835ab9..3274fb9 100644 --- a/ppapi/proxy/tcp_socket_resource_base.h +++ b/ppapi/proxy/tcp_socket_resource_base.h @@ -95,6 +95,7 @@ class PPAPI_PROXY_EXPORT TCPSocketResourceBase : public PluginResource { void CloseImpl(); int32_t SetOptionImpl(PP_TCPSocket_Option name, const PP_Var& value, + bool check_connect_state, scoped_refptr<TrackedCallback> callback); void PostAbortIfNecessary(scoped_refptr<TrackedCallback>* callback); diff --git a/ppapi/proxy/udp_socket_private_resource.cc b/ppapi/proxy/udp_socket_private_resource.cc index af43c10..60afc6f 100644 --- a/ppapi/proxy/udp_socket_private_resource.cc +++ b/ppapi/proxy/udp_socket_private_resource.cc @@ -41,7 +41,9 @@ int32_t UDPSocketPrivateResource::SetSocketFeature( NOTREACHED(); return PP_ERROR_BADARGUMENT; } - int32_t result = SetOptionImpl(public_name, value, NULL); + int32_t result = SetOptionImpl(public_name, value, + true, // Check bind() state. + NULL); return result == PP_OK_COMPLETIONPENDING ? PP_OK : result; } diff --git a/ppapi/proxy/udp_socket_resource.cc b/ppapi/proxy/udp_socket_resource.cc index 9ce7c91..d815b9f 100644 --- a/ppapi/proxy/udp_socket_resource.cc +++ b/ppapi/proxy/udp_socket_resource.cc @@ -75,11 +75,22 @@ void UDPSocketResource::Close() { CloseImpl(); } +int32_t UDPSocketResource::SetOption1_0( + PP_UDPSocket_Option name, + const PP_Var& value, + scoped_refptr<TrackedCallback> callback) { + return SetOptionImpl(name, value, + true, // Check bind() state. + callback); +} + int32_t UDPSocketResource::SetOption( PP_UDPSocket_Option name, const PP_Var& value, scoped_refptr<TrackedCallback> callback) { - return SetOptionImpl(name, value, callback); + return SetOptionImpl(name, value, + false, // Check bind() state. + callback); } } // namespace proxy diff --git a/ppapi/proxy/udp_socket_resource.h b/ppapi/proxy/udp_socket_resource.h index e0d099a..81aad26 100644 --- a/ppapi/proxy/udp_socket_resource.h +++ b/ppapi/proxy/udp_socket_resource.h @@ -36,6 +36,10 @@ class PPAPI_PROXY_EXPORT UDPSocketResource : public UDPSocketResourceBase, PP_Resource addr, scoped_refptr<TrackedCallback> callback) override; virtual void Close() override; + virtual int32_t SetOption1_0( + PP_UDPSocket_Option name, + const PP_Var& value, + scoped_refptr<TrackedCallback> callback) override; virtual int32_t SetOption(PP_UDPSocket_Option name, const PP_Var& value, scoped_refptr<TrackedCallback> callback) override; diff --git a/ppapi/proxy/udp_socket_resource_base.cc b/ppapi/proxy/udp_socket_resource_base.cc index 521a6e2..8ed6d02 100644 --- a/ppapi/proxy/udp_socket_resource_base.cc +++ b/ppapi/proxy/udp_socket_resource_base.cc @@ -34,6 +34,7 @@ UDPSocketResourceBase::UDPSocketResourceBase(Connection connection, bool private_api) : PluginResource(connection, instance), private_api_(private_api), + bind_called_(false), bound_(false), closed_(false), read_buffer_(NULL), @@ -61,6 +62,7 @@ UDPSocketResourceBase::~UDPSocketResourceBase() { int32_t UDPSocketResourceBase::SetOptionImpl( PP_UDPSocket_Option name, const PP_Var& value, + bool check_bind_state, scoped_refptr<TrackedCallback> callback) { if (closed_) return PP_ERROR_FAILED; @@ -69,8 +71,14 @@ int32_t UDPSocketResourceBase::SetOptionImpl( switch (name) { case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: case PP_UDPSOCKET_OPTION_BROADCAST: { - if (bound_) + if ((check_bind_state || name == PP_UDPSOCKET_OPTION_ADDRESS_REUSE) && + bind_called_) { + // SetOption should fail in this case in order to give predictable + // behavior while binding. Note that we use |bind_called_| rather + // than |bound_| since the latter is only set on successful completion + // of Bind(). return PP_ERROR_FAILED; + } if (value.type != PP_VARTYPE_BOOL) return PP_ERROR_BADARGUMENT; option_data.SetBool(PP_ToBool(value.value.as_bool)); @@ -78,7 +86,7 @@ int32_t UDPSocketResourceBase::SetOptionImpl( } case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { - if (!bound_) + if (check_bind_state && !bound_) return PP_ERROR_FAILED; if (value.type != PP_VARTYPE_INT32) return PP_ERROR_BADARGUMENT; @@ -111,6 +119,7 @@ int32_t UDPSocketResourceBase::BindImpl( if (TrackedCallback::IsPending(bind_callback_)) return PP_ERROR_INPROGRESS; + bind_called_ = true; bind_callback_ = callback; // Send the request, the browser will call us back via BindReply. diff --git a/ppapi/proxy/udp_socket_resource_base.h b/ppapi/proxy/udp_socket_resource_base.h index 5400f6b..d21579b 100644 --- a/ppapi/proxy/udp_socket_resource_base.h +++ b/ppapi/proxy/udp_socket_resource_base.h @@ -54,6 +54,7 @@ class PPAPI_PROXY_EXPORT UDPSocketResourceBase: public PluginResource { int32_t SetOptionImpl(PP_UDPSocket_Option name, const PP_Var& value, + bool check_bind_state, scoped_refptr<TrackedCallback> callback); int32_t BindImpl(const PP_NetAddress_Private* addr, scoped_refptr<TrackedCallback> callback); @@ -106,6 +107,11 @@ class PPAPI_PROXY_EXPORT UDPSocketResourceBase: public PluginResource { PP_Resource* output_addr); bool private_api_; + + // |bind_called_| is true after Bind() is called, while |bound_| is true, + // after Bind() succeeds. Bind() is an asynchronous method, so the timing + // on which of these is set is slightly different. + bool bind_called_; bool bound_; bool closed_; diff --git a/ppapi/tests/test_tcp_socket.cc b/ppapi/tests/test_tcp_socket.cc index 604487c..a3164de 100644 --- a/ppapi/tests/test_tcp_socket.cc +++ b/ppapi/tests/test_tcp_socket.cc @@ -140,7 +140,7 @@ std::string TestTCPSocket::TestSetOption() { TestCompletionCallback cb_2(instance_->pp_instance(), callback_type()); TestCompletionCallback cb_3(instance_->pp_instance(), callback_type()); - // These options cannot be set before the socket is connected. + // These options can be set even before the socket is connected. int32_t result_1 = socket.SetOption(PP_TCPSOCKET_OPTION_NO_DELAY, true, cb_1.GetCallback()); int32_t result_2 = socket.SetOption(PP_TCPSOCKET_OPTION_SEND_BUFFER_SIZE, @@ -150,15 +150,15 @@ std::string TestTCPSocket::TestSetOption() { cb_1.WaitForResult(result_1); CHECK_CALLBACK_BEHAVIOR(cb_1); - ASSERT_EQ(PP_ERROR_FAILED, cb_1.result()); + ASSERT_EQ(PP_OK, cb_1.result()); cb_2.WaitForResult(result_2); CHECK_CALLBACK_BEHAVIOR(cb_2); - ASSERT_EQ(PP_ERROR_FAILED, cb_2.result()); + ASSERT_EQ(PP_OK, cb_2.result()); cb_3.WaitForResult(result_3); CHECK_CALLBACK_BEHAVIOR(cb_3); - ASSERT_EQ(PP_ERROR_FAILED, cb_3.result()); + ASSERT_EQ(PP_OK, cb_3.result()); cb_1.WaitForResult(socket.Connect(addr_, cb_1.GetCallback())); CHECK_CALLBACK_BEHAVIOR(cb_1); @@ -458,4 +458,3 @@ std::string TestTCPSocket::StartListen(pp::TCPSocket* socket, int32_t backlog) { PASS(); } - diff --git a/ppapi/tests/test_udp_socket.cc b/ppapi/tests/test_udp_socket.cc index e0b76f4..8972e4e 100644 --- a/ppapi/tests/test_udp_socket.cc +++ b/ppapi/tests/test_udp_socket.cc @@ -272,36 +272,35 @@ std::string TestUDPSocket::TestSetOption() { CHECK_CALLBACK_BEHAVIOR(callback); ASSERT_EQ(PP_OK, callback.result()); - // SEND_BUFFER_SIZE and RECV_BUFFER_SIZE shouldn't be set before the socket is - // bound. callback.WaitForResult(socket.SetOption( PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE, pp::Var(4096), callback.GetCallback())); CHECK_CALLBACK_BEHAVIOR(callback); - ASSERT_EQ(PP_ERROR_FAILED, callback.result()); + ASSERT_EQ(PP_OK, callback.result()); callback.WaitForResult(socket.SetOption( PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE, pp::Var(512), callback.GetCallback())); CHECK_CALLBACK_BEHAVIOR(callback); - ASSERT_EQ(PP_ERROR_FAILED, callback.result()); + ASSERT_EQ(PP_OK, callback.result()); pp::NetAddress address; ASSERT_SUBTEST_SUCCESS(LookupPortAndBindUDPSocket(&socket, &address)); - // ADDRESS_REUSE and BROADCAST won't take effect after the socket is bound. + // ADDRESS_REUSE won't take effect after the socket is bound. callback.WaitForResult(socket.SetOption( PP_UDPSOCKET_OPTION_ADDRESS_REUSE, pp::Var(true), callback.GetCallback())); CHECK_CALLBACK_BEHAVIOR(callback); ASSERT_EQ(PP_ERROR_FAILED, callback.result()); + // BROADCAST, SEND_BUFFER_SIZE and RECV_BUFFER_SIZE can be set after the + // socket is bound. callback.WaitForResult(socket.SetOption( PP_UDPSOCKET_OPTION_BROADCAST, pp::Var(true), callback.GetCallback())); CHECK_CALLBACK_BEHAVIOR(callback); - ASSERT_EQ(PP_ERROR_FAILED, callback.result()); + ASSERT_EQ(PP_OK, callback.result()); - // SEND_BUFFER_SIZE and RECV_BUFFER_SIZE can be set after the socket is bound. callback.WaitForResult(socket.SetOption( PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE, pp::Var(2048), callback.GetCallback())); diff --git a/ppapi/thunk/interfaces_ppb_public_stable.h b/ppapi/thunk/interfaces_ppb_public_stable.h index a95d505..0f430c7 100644 --- a/ppapi/thunk/interfaces_ppb_public_stable.h +++ b/ppapi/thunk/interfaces_ppb_public_stable.h @@ -86,9 +86,11 @@ PROXIED_IFACE(PPB_NETWORKMONITOR_INTERFACE_1_0, PPB_NetworkMonitor_1_0) PROXIED_IFACE(PPB_NETWORKPROXY_INTERFACE_1_0, PPB_NetworkProxy_1_0) PROXIED_IFACE(PPB_TCPSOCKET_INTERFACE_1_0, PPB_TCPSocket_1_0) PROXIED_IFACE(PPB_TCPSOCKET_INTERFACE_1_1, PPB_TCPSocket_1_1) +PROXIED_IFACE(PPB_TCPSOCKET_INTERFACE_1_2, PPB_TCPSocket_1_2) PROXIED_IFACE(PPB_TEXTINPUTCONTROLLER_INTERFACE_1_0, PPB_TextInputController_1_0) PROXIED_IFACE(PPB_UDPSOCKET_INTERFACE_1_0, PPB_UDPSocket_1_0) +PROXIED_IFACE(PPB_UDPSOCKET_INTERFACE_1_1, PPB_UDPSocket_1_1) PROXIED_IFACE(PPB_URLLOADER_INTERFACE_1_0, PPB_URLLoader_1_0) PROXIED_IFACE(PPB_URLREQUESTINFO_INTERFACE_1_0, PPB_URLRequestInfo_1_0) PROXIED_IFACE(PPB_URLRESPONSEINFO_INTERFACE_1_0, PPB_URLResponseInfo_1_0) diff --git a/ppapi/thunk/ppb_tcp_socket_api.h b/ppapi/thunk/ppb_tcp_socket_api.h index beed0c6..a3cefed 100644 --- a/ppapi/thunk/ppb_tcp_socket_api.h +++ b/ppapi/thunk/ppb_tcp_socket_api.h @@ -36,6 +36,9 @@ class PPAPI_THUNK_EXPORT PPB_TCPSocket_API { virtual int32_t Accept(PP_Resource* accepted_tcp_socket, scoped_refptr<TrackedCallback> callback) = 0; virtual void Close() = 0; + virtual int32_t SetOption1_1(PP_TCPSocket_Option name, + const PP_Var& value, + scoped_refptr<TrackedCallback> callback) = 0; virtual int32_t SetOption(PP_TCPSocket_Option name, const PP_Var& value, scoped_refptr<TrackedCallback> callback) = 0; diff --git a/ppapi/thunk/ppb_tcp_socket_thunk.cc b/ppapi/thunk/ppb_tcp_socket_thunk.cc index 42ae702..c73e593 100644 --- a/ppapi/thunk/ppb_tcp_socket_thunk.cc +++ b/ppapi/thunk/ppb_tcp_socket_thunk.cc @@ -132,6 +132,19 @@ void Close(PP_Resource tcp_socket) { enter.object()->Close(); } +int32_t SetOption1_1(PP_Resource tcp_socket, + PP_TCPSocket_Option name, + struct PP_Var value, + struct PP_CompletionCallback callback) { + VLOG(4) << "PPB_TCPSocket::SetOption1_1()"; + EnterResource<PPB_TCPSocket_API> enter(tcp_socket, callback, true); + if (enter.failed()) + return enter.retval(); + return enter.SetResult(enter.object()->SetOption1_1(name, + value, + enter.callback())); +} + int32_t SetOption(PP_Resource tcp_socket, PP_TCPSocket_Option name, struct PP_Var value, @@ -154,7 +167,7 @@ const PPB_TCPSocket_1_0 g_ppb_tcpsocket_thunk_1_0 = { &Read, &Write, &Close, - &SetOption + &SetOption1_1 }; const PPB_TCPSocket_1_1 g_ppb_tcpsocket_thunk_1_1 = { @@ -169,6 +182,21 @@ const PPB_TCPSocket_1_1 g_ppb_tcpsocket_thunk_1_1 = { &Listen, &Accept, &Close, + &SetOption1_1 +}; + +const PPB_TCPSocket_1_2 g_ppb_tcpsocket_thunk_1_2 = { + &Create, + &IsTCPSocket, + &Bind, + &Connect, + &GetLocalAddress, + &GetRemoteAddress, + &Read, + &Write, + &Listen, + &Accept, + &Close, &SetOption }; @@ -182,5 +210,9 @@ const PPB_TCPSocket_1_1* GetPPB_TCPSocket_1_1_Thunk() { return &g_ppb_tcpsocket_thunk_1_1; } +const PPB_TCPSocket_1_2* GetPPB_TCPSocket_1_2_Thunk() { + return &g_ppb_tcpsocket_thunk_1_2; +} + } // namespace thunk } // namespace ppapi diff --git a/ppapi/thunk/ppb_udp_socket_api.h b/ppapi/thunk/ppb_udp_socket_api.h index adc2799..3a03ea7 100644 --- a/ppapi/thunk/ppb_udp_socket_api.h +++ b/ppapi/thunk/ppb_udp_socket_api.h @@ -31,6 +31,9 @@ class PPAPI_THUNK_EXPORT PPB_UDPSocket_API { PP_Resource addr, scoped_refptr<TrackedCallback> callback) = 0; virtual void Close() = 0; + virtual int32_t SetOption1_0(PP_UDPSocket_Option name, + const PP_Var& value, + scoped_refptr<TrackedCallback> callback) = 0; virtual int32_t SetOption(PP_UDPSocket_Option name, const PP_Var& value, scoped_refptr<TrackedCallback> callback) = 0; diff --git a/ppapi/thunk/ppb_udp_socket_thunk.cc b/ppapi/thunk/ppb_udp_socket_thunk.cc index 7391526..7eca736 100644 --- a/ppapi/thunk/ppb_udp_socket_thunk.cc +++ b/ppapi/thunk/ppb_udp_socket_thunk.cc @@ -83,6 +83,18 @@ void Close(PP_Resource udp_socket) { enter.object()->Close(); } +int32_t SetOption1_0(PP_Resource udp_socket, + PP_UDPSocket_Option name, + struct PP_Var value, + struct PP_CompletionCallback callback) { + VLOG(4) << "PPB_UDPSocket::SetOption1_0()"; + EnterResource<PPB_UDPSocket_API> enter(udp_socket, callback, true); + if (enter.failed()) + return enter.retval(); + return enter.SetResult( + enter.object()->SetOption1_0(name, value, enter.callback())); +} + int32_t SetOption(PP_Resource udp_socket, PP_UDPSocket_Option name, struct PP_Var value, @@ -95,14 +107,27 @@ int32_t SetOption(PP_Resource udp_socket, enter.object()->SetOption(name, value, enter.callback())); } -const PPB_UDPSocket_1_0 g_ppb_udpsocket_thunk_1_0 = {&Create, - &IsUDPSocket, - &Bind, - &GetBoundAddress, - &RecvFrom, - &SendTo, - &Close, - &SetOption}; +const PPB_UDPSocket_1_0 g_ppb_udpsocket_thunk_1_0 = { + &Create, + &IsUDPSocket, + &Bind, + &GetBoundAddress, + &RecvFrom, + &SendTo, + &Close, + &SetOption1_0 +}; + +const PPB_UDPSocket_1_1 g_ppb_udpsocket_thunk_1_1 = { + &Create, + &IsUDPSocket, + &Bind, + &GetBoundAddress, + &RecvFrom, + &SendTo, + &Close, + &SetOption +}; } // namespace @@ -110,5 +135,9 @@ PPAPI_THUNK_EXPORT const PPB_UDPSocket_1_0* GetPPB_UDPSocket_1_0_Thunk() { return &g_ppb_udpsocket_thunk_1_0; } +PPAPI_THUNK_EXPORT const PPB_UDPSocket_1_1* GetPPB_UDPSocket_1_1_Thunk() { + return &g_ppb_udpsocket_thunk_1_1; +} + } // namespace thunk } // namespace ppapi |