Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(28)

Side by Side Diff: ppapi/proxy/udp_socket_resource_base.cc

Issue 704133005: Pepper: Add support for multicast in PPB_UDPSocket API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase, remove IF option, JoinGroup and LeaveGroup as functions Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 } 61 }
62 62
63 int32_t UDPSocketResourceBase::SetOptionImpl( 63 int32_t UDPSocketResourceBase::SetOptionImpl(
64 PP_UDPSocket_Option name, 64 PP_UDPSocket_Option name,
65 const PP_Var& value, 65 const PP_Var& value,
66 bool check_bind_state, 66 bool check_bind_state,
67 scoped_refptr<TrackedCallback> callback) { 67 scoped_refptr<TrackedCallback> callback) {
68 if (closed_) 68 if (closed_)
69 return PP_ERROR_FAILED; 69 return PP_ERROR_FAILED;
70 70
71 SocketOptionData option_data; 71 // Check if socket is expected to be bound or not according to the option
bbudge 2015/02/13 00:03:16 nit: period at end of sentence.
etrunko 2015/02/13 20:19:58 Done.
72 switch (name) { 72 switch (name) {
73 case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: 73 case PP_UDPSOCKET_OPTION_ADDRESS_REUSE:
74 case PP_UDPSOCKET_OPTION_BROADCAST: { 74 check_bind_state = true; // fallthrough
75 if ((check_bind_state || name == PP_UDPSOCKET_OPTION_ADDRESS_REUSE) && 75 case PP_UDPSOCKET_OPTION_BROADCAST:
76 bind_called_) { 76 case PP_UDPSOCKET_OPTION_MULTICAST_LOOP:
77 case PP_UDPSOCKET_OPTION_MULTICAST_TTL: {
78 if (check_bind_state && bind_called_) {
77 // SetOption should fail in this case in order to give predictable 79 // SetOption should fail in this case in order to give predictable
78 // behavior while binding. Note that we use |bind_called_| rather 80 // behavior while binding. Note that we use |bind_called_| rather
79 // than |bound_| since the latter is only set on successful completion 81 // than |bound_| since the latter is only set on successful completion
80 // of Bind(). 82 // of Bind().
81 return PP_ERROR_FAILED; 83 return PP_ERROR_FAILED;
82 } 84 }
85 break;
86 }
87 case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE:
88 case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: {
89 if (check_bind_state && !bound_)
90 return PP_ERROR_FAILED;
91 break;
92 }
93 }
94
95 SocketOptionData option_data;
96 switch (name) {
97 case PP_UDPSOCKET_OPTION_ADDRESS_REUSE:
98 case PP_UDPSOCKET_OPTION_BROADCAST:
99 case PP_UDPSOCKET_OPTION_MULTICAST_LOOP: {
83 if (value.type != PP_VARTYPE_BOOL) 100 if (value.type != PP_VARTYPE_BOOL)
84 return PP_ERROR_BADARGUMENT; 101 return PP_ERROR_BADARGUMENT;
85 option_data.SetBool(PP_ToBool(value.value.as_bool)); 102 option_data.SetBool(PP_ToBool(value.value.as_bool));
86 break; 103 break;
87 } 104 }
88 case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: 105 case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE:
89 case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { 106 case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: {
90 if (check_bind_state && !bound_)
91 return PP_ERROR_FAILED;
92 if (value.type != PP_VARTYPE_INT32) 107 if (value.type != PP_VARTYPE_INT32)
93 return PP_ERROR_BADARGUMENT; 108 return PP_ERROR_BADARGUMENT;
94 option_data.SetInt32(value.value.as_int); 109 option_data.SetInt32(value.value.as_int);
95 break; 110 break;
96 } 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 }
97 default: { 119 default: {
98 NOTREACHED(); 120 NOTREACHED();
99 return PP_ERROR_BADARGUMENT; 121 return PP_ERROR_BADARGUMENT;
100 } 122 }
101 } 123 }
102 124
103 Call<PpapiPluginMsg_UDPSocket_SetOptionReply>( 125 Call<PpapiPluginMsg_UDPSocket_SetOptionReply>(
104 BROWSER, 126 BROWSER,
105 PpapiHostMsg_UDPSocket_SetOption(name, option_data), 127 PpapiHostMsg_UDPSocket_SetOption(name, option_data),
106 base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply, 128 base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply,
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 while (!sendto_callbacks_.empty()) { 248 while (!sendto_callbacks_.empty()) {
227 scoped_refptr<TrackedCallback> callback = sendto_callbacks_.front(); 249 scoped_refptr<TrackedCallback> callback = sendto_callbacks_.front();
228 sendto_callbacks_.pop(); 250 sendto_callbacks_.pop();
229 PostAbortIfNecessary(&callback); 251 PostAbortIfNecessary(&callback);
230 } 252 }
231 253
232 read_buffer_ = NULL; 254 read_buffer_ = NULL;
233 bytes_to_read_ = -1; 255 bytes_to_read_ = -1;
234 } 256 }
235 257
258 int32_t UDPSocketResourceBase::JoinGroupImpl(
259 const PP_NetAddress_Private *group,
260 scoped_refptr<TrackedCallback> callback) {
261 if (!group)
262 return PP_ERROR_BADARGUMENT;
bbudge 2015/02/13 00:03:16 A plugin error isn't quite right here, because the
etrunko 2015/02/13 20:19:58 Done.
263
264 Call<PpapiPluginMsg_UDPSocket_JoinGroupReply>(
265 BROWSER,
266 PpapiHostMsg_UDPSocket_JoinGroup(*group),
267 base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply,
bbudge 2015/02/13 00:03:16 I think at this point we should rename this method
etrunko 2015/02/13 20:19:58 Done. I guess so, by the time I wondered if this
268 base::Unretained(this),
269 callback),
270 callback);
271 return PP_OK_COMPLETIONPENDING;
272 }
273
274 int32_t UDPSocketResourceBase::LeaveGroupImpl(
275 const PP_NetAddress_Private *group,
276 scoped_refptr<TrackedCallback> callback) {
277 if (!group)
278 return PP_ERROR_BADARGUMENT;
bbudge 2015/02/13 00:03:16 DCHECK
etrunko 2015/02/13 20:19:58 Done.
279
280 Call<PpapiPluginMsg_UDPSocket_LeaveGroupReply>(
281 BROWSER,
282 PpapiHostMsg_UDPSocket_LeaveGroup(*group),
283 base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply,
284 base::Unretained(this),
285 callback),
286 callback);
287 return PP_OK_COMPLETIONPENDING;
288 }
289
236 void UDPSocketResourceBase::OnReplyReceived( 290 void UDPSocketResourceBase::OnReplyReceived(
237 const ResourceMessageReplyParams& params, 291 const ResourceMessageReplyParams& params,
238 const IPC::Message& msg) { 292 const IPC::Message& msg) {
239 PPAPI_BEGIN_MESSAGE_MAP(UDPSocketResourceBase, msg) 293 PPAPI_BEGIN_MESSAGE_MAP(UDPSocketResourceBase, msg)
240 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( 294 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(
241 PpapiPluginMsg_UDPSocket_PushRecvResult, 295 PpapiPluginMsg_UDPSocket_PushRecvResult,
242 OnPluginMsgPushRecvResult) 296 OnPluginMsgPushRecvResult)
243 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL_UNHANDLED( 297 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL_UNHANDLED(
244 PluginResource::OnReplyReceived(params, msg)) 298 PluginResource::OnReplyReceived(params, msg))
245 PPAPI_END_MESSAGE_MAP() 299 PPAPI_END_MESSAGE_MAP()
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 if (result == PP_OK && !data.empty()) 419 if (result == PP_OK && !data.empty())
366 memcpy(output_buffer, data.c_str(), data.size()); 420 memcpy(output_buffer, data.c_str(), data.size());
367 421
368 recvfrom_addr_ = addr; 422 recvfrom_addr_ = addr;
369 423
370 return result == PP_OK ? static_cast<int32_t>(data.size()) : result; 424 return result == PP_OK ? static_cast<int32_t>(data.size()) : result;
371 } 425 }
372 426
373 } // namespace proxy 427 } // namespace proxy
374 } // namespace ppapi 428 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698