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

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

Powered by Google App Engine
This is Rietveld 408576698