summaryrefslogtreecommitdiffstats
path: root/ppapi
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi')
-rw-r--r--ppapi/api/ppb_tcp_socket.idl35
-rw-r--r--ppapi/api/ppb_udp_socket.idl36
-rw-r--r--ppapi/c/ppb_tcp_socket.h53
-rw-r--r--ppapi/c/ppb_udp_socket.h44
-rw-r--r--ppapi/cpp/tcp_socket.cc56
-rw-r--r--ppapi/cpp/udp_socket.cc37
-rw-r--r--ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c150
-rw-r--r--ppapi/proxy/tcp_socket_private_resource.cc4
-rw-r--r--ppapi/proxy/tcp_socket_resource.cc13
-rw-r--r--ppapi/proxy/tcp_socket_resource.h4
-rw-r--r--ppapi/proxy/tcp_socket_resource_base.cc5
-rw-r--r--ppapi/proxy/tcp_socket_resource_base.h1
-rw-r--r--ppapi/proxy/udp_socket_private_resource.cc4
-rw-r--r--ppapi/proxy/udp_socket_resource.cc13
-rw-r--r--ppapi/proxy/udp_socket_resource.h4
-rw-r--r--ppapi/proxy/udp_socket_resource_base.cc13
-rw-r--r--ppapi/proxy/udp_socket_resource_base.h6
-rw-r--r--ppapi/tests/test_tcp_socket.cc9
-rw-r--r--ppapi/tests/test_udp_socket.cc13
-rw-r--r--ppapi/thunk/interfaces_ppb_public_stable.h2
-rw-r--r--ppapi/thunk/ppb_tcp_socket_api.h3
-rw-r--r--ppapi/thunk/ppb_tcp_socket_thunk.cc34
-rw-r--r--ppapi/thunk/ppb_udp_socket_api.h3
-rw-r--r--ppapi/thunk/ppb_udp_socket_thunk.cc45
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