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

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

Issue 16959005: Implement PPB_UDPSocket_Dev: part 2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « ppapi/proxy/udp_socket_resource_base.h ('k') | ppapi/shared_impl/socket_option_data.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
11 #include "ppapi/c/pp_bool.h" 11 #include "ppapi/c/pp_bool.h"
12 #include "ppapi/c/pp_completion_callback.h" 12 #include "ppapi/c/pp_completion_callback.h"
13 #include "ppapi/c/pp_errors.h" 13 #include "ppapi/c/pp_errors.h"
14 #include "ppapi/proxy/ppapi_messages.h" 14 #include "ppapi/proxy/ppapi_messages.h"
15 #include "ppapi/shared_impl/socket_option_data.h"
15 #include "ppapi/thunk/enter.h" 16 #include "ppapi/thunk/enter.h"
16 #include "ppapi/thunk/resource_creation_api.h" 17 #include "ppapi/thunk/resource_creation_api.h"
17 18
18 namespace ppapi { 19 namespace ppapi {
19 namespace proxy { 20 namespace proxy {
20 21
22 namespace {
23
24 int32_t ConvertPPError(int32_t pp_error, bool private_api) {
25 // The private API doesn't return network-specific error codes or
26 // PP_ERROR_NOACCESS. In order to preserve the behavior, we convert those to
27 // PP_ERROR_FAILED.
28 if (private_api &&
29 (pp_error <= PP_ERROR_CONNECTION_CLOSED ||
30 pp_error == PP_ERROR_NOACCESS)) {
31 return PP_ERROR_FAILED;
32 }
33
34 return pp_error;
35 }
36
37 } // namespace
38
21 const int32_t UDPSocketResourceBase::kMaxReadSize = 1024 * 1024; 39 const int32_t UDPSocketResourceBase::kMaxReadSize = 1024 * 1024;
22 const int32_t UDPSocketResourceBase::kMaxWriteSize = 1024 * 1024; 40 const int32_t UDPSocketResourceBase::kMaxWriteSize = 1024 * 1024;
41 const int32_t UDPSocketResourceBase::kMaxSendBufferSize =
42 1024 * UDPSocketResourceBase::kMaxWriteSize;
43 const int32_t UDPSocketResourceBase::kMaxReceiveBufferSize =
44 1024 * UDPSocketResourceBase::kMaxReadSize;
45
23 46
24 UDPSocketResourceBase::UDPSocketResourceBase(Connection connection, 47 UDPSocketResourceBase::UDPSocketResourceBase(Connection connection,
25 PP_Instance instance) 48 PP_Instance instance,
49 bool private_api)
26 : PluginResource(connection, instance), 50 : PluginResource(connection, instance),
51 private_api_(private_api),
27 bound_(false), 52 bound_(false),
28 closed_(false), 53 closed_(false),
29 read_buffer_(NULL), 54 read_buffer_(NULL),
30 bytes_to_read_(-1) { 55 bytes_to_read_(-1) {
31 recvfrom_addr_.size = 0; 56 recvfrom_addr_.size = 0;
32 memset(recvfrom_addr_.data, 0, 57 memset(recvfrom_addr_.data, 0,
33 arraysize(recvfrom_addr_.data) * sizeof(*recvfrom_addr_.data)); 58 arraysize(recvfrom_addr_.data) * sizeof(*recvfrom_addr_.data));
34 bound_addr_.size = 0; 59 bound_addr_.size = 0;
35 memset(bound_addr_.data, 0, 60 memset(bound_addr_.data, 0,
36 arraysize(bound_addr_.data) * sizeof(*bound_addr_.data)); 61 arraysize(bound_addr_.data) * sizeof(*bound_addr_.data));
37 62
38 SendCreate(BROWSER, PpapiHostMsg_UDPSocketPrivate_Create()); 63 if (private_api)
64 SendCreate(BROWSER, PpapiHostMsg_UDPSocket_CreatePrivate());
65 else
66 SendCreate(BROWSER, PpapiHostMsg_UDPSocket_Create());
39 } 67 }
40 68
41 UDPSocketResourceBase::~UDPSocketResourceBase() { 69 UDPSocketResourceBase::~UDPSocketResourceBase() {
42 } 70 }
43 71
44 int32_t UDPSocketResourceBase::SetSocketFeatureImpl( 72 int32_t UDPSocketResourceBase::SetOptionImpl(
45 PP_UDPSocketFeature_Private name, 73 PP_UDPSocket_Option_Dev name,
46 const PP_Var& value) { 74 const PP_Var& value,
47 if (bound_ || closed_) 75 scoped_refptr<TrackedCallback> callback) {
76 if (closed_)
48 return PP_ERROR_FAILED; 77 return PP_ERROR_FAILED;
49 78
79 SocketOptionData option_data;
50 switch (name) { 80 switch (name) {
51 case PP_UDPSOCKETFEATURE_ADDRESS_REUSE: 81 case PP_UDPSOCKET_OPTION_ADDRESS_REUSE:
52 case PP_UDPSOCKETFEATURE_BROADCAST: { 82 case PP_UDPSOCKET_OPTION_BROADCAST: {
83 if (bound_)
84 return PP_ERROR_FAILED;
53 if (value.type != PP_VARTYPE_BOOL) 85 if (value.type != PP_VARTYPE_BOOL)
54 return PP_ERROR_BADARGUMENT; 86 return PP_ERROR_BADARGUMENT;
55 Post(BROWSER, 87 option_data.SetBool(PP_ToBool(value.value.as_bool));
56 PpapiHostMsg_UDPSocketPrivate_SetBoolSocketFeature( 88 break;
57 static_cast<int32_t>(name), PP_ToBool(value.value.as_bool))); 89 }
90 case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE:
91 case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: {
92 if (!bound_)
93 return PP_ERROR_FAILED;
94 if (value.type != PP_VARTYPE_INT32)
95 return PP_ERROR_BADARGUMENT;
96 option_data.SetInt32(value.value.as_int);
58 break; 97 break;
59 } 98 }
60 default: { 99 default: {
100 NOTREACHED();
61 return PP_ERROR_BADARGUMENT; 101 return PP_ERROR_BADARGUMENT;
62 } 102 }
63 } 103 }
64 return PP_OK; 104
105 Call<PpapiPluginMsg_UDPSocket_SetOptionReply>(
106 BROWSER,
107 PpapiHostMsg_UDPSocket_SetOption(name, option_data),
108 base::Bind(&UDPSocketResourceBase::OnPluginMsgSetOptionReply,
109 base::Unretained(this),
110 callback));
111 return PP_OK_COMPLETIONPENDING;
65 } 112 }
66 113
67 int32_t UDPSocketResourceBase::BindImpl( 114 int32_t UDPSocketResourceBase::BindImpl(
68 const PP_NetAddress_Private* addr, 115 const PP_NetAddress_Private* addr,
69 scoped_refptr<TrackedCallback> callback) { 116 scoped_refptr<TrackedCallback> callback) {
70 if (!addr) 117 if (!addr)
71 return PP_ERROR_BADARGUMENT; 118 return PP_ERROR_BADARGUMENT;
72 if (bound_ || closed_) 119 if (bound_ || closed_)
73 return PP_ERROR_FAILED; 120 return PP_ERROR_FAILED;
74 if (TrackedCallback::IsPending(bind_callback_)) 121 if (TrackedCallback::IsPending(bind_callback_))
75 return PP_ERROR_INPROGRESS; 122 return PP_ERROR_INPROGRESS;
76 123
77 bind_callback_ = callback; 124 bind_callback_ = callback;
78 125
79 // Send the request, the browser will call us back via BindReply. 126 // Send the request, the browser will call us back via BindReply.
80 Call<PpapiPluginMsg_UDPSocketPrivate_BindReply>( 127 Call<PpapiPluginMsg_UDPSocket_BindReply>(
81 BROWSER, 128 BROWSER,
82 PpapiHostMsg_UDPSocketPrivate_Bind(*addr), 129 PpapiHostMsg_UDPSocket_Bind(*addr),
83 base::Bind(&UDPSocketResourceBase::OnPluginMsgBindReply, 130 base::Bind(&UDPSocketResourceBase::OnPluginMsgBindReply,
84 base::Unretained(this))); 131 base::Unretained(this)));
85 return PP_OK_COMPLETIONPENDING; 132 return PP_OK_COMPLETIONPENDING;
86 } 133 }
87 134
88 PP_Bool UDPSocketResourceBase::GetBoundAddressImpl( 135 PP_Bool UDPSocketResourceBase::GetBoundAddressImpl(
89 PP_NetAddress_Private* addr) { 136 PP_NetAddress_Private* addr) {
90 if (!addr || !bound_ || closed_) 137 if (!addr || !bound_ || closed_)
91 return PP_FALSE; 138 return PP_FALSE;
92 139
(...skipping 11 matching lines...) Expand all
104 if (!bound_) 151 if (!bound_)
105 return PP_ERROR_FAILED; 152 return PP_ERROR_FAILED;
106 if (TrackedCallback::IsPending(recvfrom_callback_)) 153 if (TrackedCallback::IsPending(recvfrom_callback_))
107 return PP_ERROR_INPROGRESS; 154 return PP_ERROR_INPROGRESS;
108 155
109 read_buffer_ = buffer; 156 read_buffer_ = buffer;
110 bytes_to_read_ = std::min(num_bytes, kMaxReadSize); 157 bytes_to_read_ = std::min(num_bytes, kMaxReadSize);
111 recvfrom_callback_ = callback; 158 recvfrom_callback_ = callback;
112 159
113 // Send the request, the browser will call us back via RecvFromReply. 160 // Send the request, the browser will call us back via RecvFromReply.
114 Call<PpapiPluginMsg_UDPSocketPrivate_RecvFromReply>( 161 Call<PpapiPluginMsg_UDPSocket_RecvFromReply>(
115 BROWSER, 162 BROWSER,
116 PpapiHostMsg_UDPSocketPrivate_RecvFrom(bytes_to_read_), 163 PpapiHostMsg_UDPSocket_RecvFrom(bytes_to_read_),
117 base::Bind(&UDPSocketResourceBase::OnPluginMsgRecvFromReply, 164 base::Bind(&UDPSocketResourceBase::OnPluginMsgRecvFromReply,
118 base::Unretained(this), addr)); 165 base::Unretained(this), addr));
119 return PP_OK_COMPLETIONPENDING; 166 return PP_OK_COMPLETIONPENDING;
120 } 167 }
121 168
122 PP_Bool UDPSocketResourceBase::GetRecvFromAddressImpl( 169 PP_Bool UDPSocketResourceBase::GetRecvFromAddressImpl(
123 PP_NetAddress_Private* addr) { 170 PP_NetAddress_Private* addr) {
124 if (!addr) 171 if (!addr)
125 return PP_FALSE; 172 return PP_FALSE;
126 *addr = recvfrom_addr_; 173 *addr = recvfrom_addr_;
(...skipping 11 matching lines...) Expand all
138 return PP_ERROR_FAILED; 185 return PP_ERROR_FAILED;
139 if (TrackedCallback::IsPending(sendto_callback_)) 186 if (TrackedCallback::IsPending(sendto_callback_))
140 return PP_ERROR_INPROGRESS; 187 return PP_ERROR_INPROGRESS;
141 188
142 if (num_bytes > kMaxWriteSize) 189 if (num_bytes > kMaxWriteSize)
143 num_bytes = kMaxWriteSize; 190 num_bytes = kMaxWriteSize;
144 191
145 sendto_callback_ = callback; 192 sendto_callback_ = callback;
146 193
147 // Send the request, the browser will call us back via SendToReply. 194 // Send the request, the browser will call us back via SendToReply.
148 Call<PpapiPluginMsg_UDPSocketPrivate_SendToReply>( 195 Call<PpapiPluginMsg_UDPSocket_SendToReply>(
149 BROWSER, 196 BROWSER,
150 PpapiHostMsg_UDPSocketPrivate_SendTo( 197 PpapiHostMsg_UDPSocket_SendTo(std::string(buffer, num_bytes), *addr),
151 std::string(buffer, num_bytes), *addr),
152 base::Bind(&UDPSocketResourceBase::OnPluginMsgSendToReply, 198 base::Bind(&UDPSocketResourceBase::OnPluginMsgSendToReply,
153 base::Unretained(this))); 199 base::Unretained(this)));
154 return PP_OK_COMPLETIONPENDING; 200 return PP_OK_COMPLETIONPENDING;
155 } 201 }
156 202
157 void UDPSocketResourceBase::CloseImpl() { 203 void UDPSocketResourceBase::CloseImpl() {
158 if(closed_) 204 if(closed_)
159 return; 205 return;
160 206
161 bound_ = false; 207 bound_ = false;
162 closed_ = true; 208 closed_ = true;
163 209
164 Post(BROWSER, PpapiHostMsg_UDPSocketPrivate_Close()); 210 Post(BROWSER, PpapiHostMsg_UDPSocket_Close());
165 211
166 PostAbortIfNecessary(&bind_callback_); 212 PostAbortIfNecessary(&bind_callback_);
167 PostAbortIfNecessary(&recvfrom_callback_); 213 PostAbortIfNecessary(&recvfrom_callback_);
168 PostAbortIfNecessary(&sendto_callback_); 214 PostAbortIfNecessary(&sendto_callback_);
169 } 215 }
170 216
171 void UDPSocketResourceBase::PostAbortIfNecessary( 217 void UDPSocketResourceBase::PostAbortIfNecessary(
172 scoped_refptr<TrackedCallback>* callback) { 218 scoped_refptr<TrackedCallback>* callback) {
173 if (TrackedCallback::IsPending(*callback)) 219 if (TrackedCallback::IsPending(*callback))
174 (*callback)->PostAbort(); 220 (*callback)->PostAbort();
175 } 221 }
176 222
223 void UDPSocketResourceBase::OnPluginMsgSetOptionReply(
224 scoped_refptr<TrackedCallback> callback,
225 const ResourceMessageReplyParams& params) {
226 if (TrackedCallback::IsPending(callback))
227 callback->Run(ConvertPPError(params.result(), private_api_));
228 }
229
177 void UDPSocketResourceBase::OnPluginMsgBindReply( 230 void UDPSocketResourceBase::OnPluginMsgBindReply(
178 const ResourceMessageReplyParams& params, 231 const ResourceMessageReplyParams& params,
179 const PP_NetAddress_Private& bound_addr) { 232 const PP_NetAddress_Private& bound_addr) {
180 if (!TrackedCallback::IsPending(bind_callback_)) { 233 if (!TrackedCallback::IsPending(bind_callback_)) {
181 NOTREACHED(); 234 NOTREACHED();
182 return; 235 return;
183 } 236 }
184 if (params.result() == PP_OK) 237 if (params.result() == PP_OK)
185 bound_ = true; 238 bound_ = true;
186 bound_addr_ = bound_addr; 239 bound_addr_ = bound_addr;
187 bind_callback_->Run(params.result()); 240 bind_callback_->Run(ConvertPPError(params.result(), private_api_));
188 } 241 }
189 242
190 void UDPSocketResourceBase::OnPluginMsgRecvFromReply( 243 void UDPSocketResourceBase::OnPluginMsgRecvFromReply(
191 PP_Resource* output_addr, 244 PP_Resource* output_addr,
192 const ResourceMessageReplyParams& params, 245 const ResourceMessageReplyParams& params,
193 const std::string& data, 246 const std::string& data,
194 const PP_NetAddress_Private& addr) { 247 const PP_NetAddress_Private& addr) {
195 if (!TrackedCallback::IsPending(recvfrom_callback_)) { 248 if (!TrackedCallback::IsPending(recvfrom_callback_)) {
196 NOTREACHED(); 249 NOTREACHED();
197 return; 250 return;
198 } 251 }
199 bool succeeded = (params.result() == PP_OK); 252 int32_t result = params.result();
200 if (succeeded && output_addr) { 253 if (result == PP_OK && output_addr) {
201 thunk::EnterResourceCreationNoLock enter(pp_instance()); 254 thunk::EnterResourceCreationNoLock enter(pp_instance());
202 if (enter.succeeded()) { 255 if (enter.succeeded()) {
203 *output_addr = enter.functions()->CreateNetAddressFromNetAddressPrivate( 256 *output_addr = enter.functions()->CreateNetAddressFromNetAddressPrivate(
204 pp_instance(), addr); 257 pp_instance(), addr);
205 } else { 258 } else {
206 succeeded = false; 259 result = PP_ERROR_FAILED;
207 } 260 }
208 } 261 }
209 262
210 if (succeeded) { 263 if (result == PP_OK) {
211 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_); 264 CHECK_LE(static_cast<int32_t>(data.size()), bytes_to_read_);
212 if (!data.empty()) 265 if (!data.empty())
213 memcpy(read_buffer_, data.c_str(), data.size()); 266 memcpy(read_buffer_, data.c_str(), data.size());
214 } 267 }
215 268
216 read_buffer_ = NULL; 269 read_buffer_ = NULL;
217 bytes_to_read_ = -1; 270 bytes_to_read_ = -1;
218 recvfrom_addr_ = addr; 271 recvfrom_addr_ = addr;
219 272
220 if (succeeded) 273 if (result == PP_OK)
221 recvfrom_callback_->Run(static_cast<int32_t>(data.size())); 274 recvfrom_callback_->Run(static_cast<int32_t>(data.size()));
222 else 275 else
223 recvfrom_callback_->Run(params.result()); 276 recvfrom_callback_->Run(ConvertPPError(result, private_api_));
224 } 277 }
225 278
226 void UDPSocketResourceBase::OnPluginMsgSendToReply( 279 void UDPSocketResourceBase::OnPluginMsgSendToReply(
227 const ResourceMessageReplyParams& params, 280 const ResourceMessageReplyParams& params,
228 int32_t bytes_written) { 281 int32_t bytes_written) {
229 if (!TrackedCallback::IsPending(sendto_callback_)) { 282 if (!TrackedCallback::IsPending(sendto_callback_)) {
230 NOTREACHED(); 283 NOTREACHED();
231 return; 284 return;
232 } 285 }
233 if (params.result() == PP_OK) 286 if (params.result() == PP_OK)
234 sendto_callback_->Run(bytes_written); 287 sendto_callback_->Run(bytes_written);
235 else 288 else
236 sendto_callback_->Run(params.result()); 289 sendto_callback_->Run(ConvertPPError(params.result(), private_api_));
237 } 290 }
238 291
239 } // namespace proxy 292 } // namespace proxy
240 } // namespace ppapi 293 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/proxy/udp_socket_resource_base.h ('k') | ppapi/shared_impl/socket_option_data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698