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

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

Powered by Google App Engine
This is Rietveld 408576698