OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/proxy/udp_socket_resource_base.h" | 5 #include "ppapi/proxy/udp_socket_resource_base.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstring> | 8 #include <cstring> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 UDPSocketResourceBase::~UDPSocketResourceBase() { | 58 UDPSocketResourceBase::~UDPSocketResourceBase() { |
59 } | 59 } |
60 | 60 |
61 int32_t UDPSocketResourceBase::SetOptionImpl( | 61 int32_t UDPSocketResourceBase::SetOptionImpl( |
62 PP_UDPSocket_Option name, | 62 PP_UDPSocket_Option name, |
63 const PP_Var& value, | 63 const PP_Var& value, |
64 scoped_refptr<TrackedCallback> callback) { | 64 scoped_refptr<TrackedCallback> callback) { |
65 if (closed_) | 65 if (closed_) |
66 return PP_ERROR_FAILED; | 66 return PP_ERROR_FAILED; |
67 | 67 |
| 68 // Check if socket is expected to be bound or not according to the option |
| 69 switch (name) { |
| 70 case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
| 71 case PP_UDPSOCKET_OPTION_BROADCAST: |
| 72 case PP_UDPSOCKET_OPTION_MULTICAST_LOOP: |
| 73 case PP_UDPSOCKET_OPTION_MULTICAST_TTL: |
| 74 case PP_UDPSOCKET_OPTION_MULTICAST_IF: { |
| 75 if (bound_) |
| 76 return PP_ERROR_FAILED; |
| 77 break; |
| 78 } |
| 79 case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
| 80 case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: |
| 81 case PP_UDPSOCKET_OPTION_MULTICAST_JOIN: |
| 82 case PP_UDPSOCKET_OPTION_MULTICAST_LEAVE: { |
| 83 if (!bound_) |
| 84 return PP_ERROR_FAILED; |
| 85 break; |
| 86 } |
| 87 } |
| 88 |
68 SocketOptionData option_data; | 89 SocketOptionData option_data; |
69 switch (name) { | 90 switch (name) { |
70 case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: | 91 case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
71 case PP_UDPSOCKET_OPTION_BROADCAST: { | 92 case PP_UDPSOCKET_OPTION_BROADCAST: { |
72 if (bound_) | |
73 return PP_ERROR_FAILED; | |
74 if (value.type != PP_VARTYPE_BOOL) | 93 if (value.type != PP_VARTYPE_BOOL) |
75 return PP_ERROR_BADARGUMENT; | 94 return PP_ERROR_BADARGUMENT; |
76 option_data.SetBool(PP_ToBool(value.value.as_bool)); | 95 option_data.SetBool(PP_ToBool(value.value.as_bool)); |
77 break; | 96 break; |
78 } | 97 } |
79 case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: | 98 case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
80 case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { | 99 case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: |
81 if (!bound_) | 100 case PP_UDPSOCKET_OPTION_MULTICAST_IF: { |
82 return PP_ERROR_FAILED; | |
83 if (value.type != PP_VARTYPE_INT32) | 101 if (value.type != PP_VARTYPE_INT32) |
84 return PP_ERROR_BADARGUMENT; | 102 return PP_ERROR_BADARGUMENT; |
85 option_data.SetInt32(value.value.as_int); | 103 option_data.SetInt32(value.value.as_int); |
86 break; | 104 break; |
87 } | 105 } |
| 106 case PP_UDPSOCKET_OPTION_MULTICAST_LOOP: { |
| 107 if (value.type != PP_VARTYPE_BOOL) |
| 108 return PP_ERROR_BADARGUMENT; |
| 109 option_data.SetBool(PP_ToBool(value.value.as_bool)); |
| 110 break; |
| 111 } |
| 112 case PP_UDPSOCKET_OPTION_MULTICAST_TTL: { |
| 113 int32_t ival = value.value.as_int; |
| 114 if (value.type != PP_VARTYPE_INT32 && (ival < 0 || ival > 255)) |
| 115 return PP_ERROR_BADARGUMENT; |
| 116 option_data.SetInt32(ival); |
| 117 break; |
| 118 } |
| 119 case PP_UDPSOCKET_OPTION_MULTICAST_JOIN: |
| 120 case PP_UDPSOCKET_OPTION_MULTICAST_LEAVE: { |
| 121 if (value.type != PP_VARTYPE_RESOURCE) |
| 122 return PP_ERROR_BADARGUMENT; |
| 123 PP_Resource resource = static_cast<PP_Resource>(value.value.as_id); |
| 124 option_data.SetInt32(resource); |
| 125 break; |
| 126 } |
88 default: { | 127 default: { |
89 NOTREACHED(); | 128 NOTREACHED(); |
90 return PP_ERROR_BADARGUMENT; | 129 return PP_ERROR_BADARGUMENT; |
91 } | 130 } |
92 } | 131 } |
93 | 132 |
94 Call<PpapiPluginMsg_UDPSocket_SetOptionReply>( | 133 Call<PpapiPluginMsg_UDPSocket_SetOptionReply>( |
95 BROWSER, | 134 BROWSER, |
96 PpapiHostMsg_UDPSocket_SetOption(name, option_data), | 135 PpapiHostMsg_UDPSocket_SetOption(name, option_data), |
97 base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply, | 136 base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply, |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 if (result == PP_OK && !data.empty()) | 383 if (result == PP_OK && !data.empty()) |
345 memcpy(output_buffer, data.c_str(), data.size()); | 384 memcpy(output_buffer, data.c_str(), data.size()); |
346 | 385 |
347 recvfrom_addr_ = addr; | 386 recvfrom_addr_ = addr; |
348 | 387 |
349 return result == PP_OK ? static_cast<int32_t>(data.size()) : result; | 388 return result == PP_OK ? static_cast<int32_t>(data.size()) : result; |
350 } | 389 } |
351 | 390 |
352 } // namespace proxy | 391 } // namespace proxy |
353 } // namespace ppapi | 392 } // namespace ppapi |
OLD | NEW |