OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/extensions/api/socket/socket_api.h" | 5 #include "chrome/browser/extensions/api/socket/socket_api.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "chrome/browser/browser_process.h" | 8 #include "chrome/browser/browser_process.h" |
9 #include "chrome/browser/extensions/api/api_resource_controller.h" | 9 #include "chrome/browser/extensions/api/api_resource_controller.h" |
10 #include "chrome/browser/extensions/api/dns/host_resolver_wrapper.h" | 10 #include "chrome/browser/extensions/api/dns/host_resolver_wrapper.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 Socket* socket = NULL; | 116 Socket* socket = NULL; |
117 if (socket_type_ == kSocketTypeTCP) { | 117 if (socket_type_ == kSocketTypeTCP) { |
118 socket = new TCPSocket(event_notifier_); | 118 socket = new TCPSocket(event_notifier_); |
119 } else if (socket_type_== kSocketTypeUDP) { | 119 } else if (socket_type_== kSocketTypeUDP) { |
120 socket = new UDPSocket(event_notifier_); | 120 socket = new UDPSocket(event_notifier_); |
121 } | 121 } |
122 DCHECK(socket); | 122 DCHECK(socket); |
123 | 123 |
124 DictionaryValue* result = new DictionaryValue(); | 124 DictionaryValue* result = new DictionaryValue(); |
125 result->SetInteger(kSocketIdKey, controller()->AddAPIResource(socket)); | 125 result->SetInteger(kSocketIdKey, controller()->AddAPIResource(socket)); |
126 result_.reset(result); | 126 SetResult(result); |
127 } | 127 } |
128 | 128 |
129 bool SocketDestroyFunction::Prepare() { | 129 bool SocketDestroyFunction::Prepare() { |
130 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); | 130 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); |
131 return true; | 131 return true; |
132 } | 132 } |
133 | 133 |
134 void SocketDestroyFunction::Work() { | 134 void SocketDestroyFunction::Work() { |
135 if (!controller()->RemoveSocket(socket_id_)) | 135 if (!controller()->RemoveSocket(socket_id_)) |
136 error_ = kSocketNotFoundError; | 136 error_ = kSocketNotFoundError; |
(...skipping 13 matching lines...) Expand all Loading... |
150 } | 150 } |
151 | 151 |
152 void SocketConnectFunction::AsyncWorkStart() { | 152 void SocketConnectFunction::AsyncWorkStart() { |
153 StartDnsLookup(hostname_); | 153 StartDnsLookup(hostname_); |
154 } | 154 } |
155 | 155 |
156 void SocketConnectFunction::AfterDnsLookup(int lookup_result) { | 156 void SocketConnectFunction::AfterDnsLookup(int lookup_result) { |
157 if (lookup_result == net::OK) { | 157 if (lookup_result == net::OK) { |
158 StartConnect(); | 158 StartConnect(); |
159 } else { | 159 } else { |
160 result_.reset(Value::CreateIntegerValue(lookup_result)); | 160 SetResult(Value::CreateIntegerValue(lookup_result)); |
161 AsyncWorkCompleted(); | 161 AsyncWorkCompleted(); |
162 } | 162 } |
163 } | 163 } |
164 | 164 |
165 void SocketConnectFunction::StartConnect() { | 165 void SocketConnectFunction::StartConnect() { |
166 Socket* socket = controller()->GetSocket(socket_id_); | 166 Socket* socket = controller()->GetSocket(socket_id_); |
167 if (!socket) { | 167 if (!socket) { |
168 error_ = kSocketNotFoundError; | 168 error_ = kSocketNotFoundError; |
169 OnConnect(-1); | 169 OnConnect(-1); |
170 return; | 170 return; |
171 } | 171 } |
172 | 172 |
173 socket->Connect(resolved_address_, port_, | 173 socket->Connect(resolved_address_, port_, |
174 base::Bind(&SocketConnectFunction::OnConnect, this)); | 174 base::Bind(&SocketConnectFunction::OnConnect, this)); |
175 } | 175 } |
176 | 176 |
177 void SocketConnectFunction::OnConnect(int result) { | 177 void SocketConnectFunction::OnConnect(int result) { |
178 result_.reset(Value::CreateIntegerValue(result)); | 178 SetResult(Value::CreateIntegerValue(result)); |
179 AsyncWorkCompleted(); | 179 AsyncWorkCompleted(); |
180 } | 180 } |
181 | 181 |
182 bool SocketDisconnectFunction::Prepare() { | 182 bool SocketDisconnectFunction::Prepare() { |
183 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); | 183 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); |
184 return true; | 184 return true; |
185 } | 185 } |
186 | 186 |
187 void SocketDisconnectFunction::Work() { | 187 void SocketDisconnectFunction::Work() { |
188 Socket* socket = controller()->GetSocket(socket_id_); | 188 Socket* socket = controller()->GetSocket(socket_id_); |
189 if (socket) | 189 if (socket) |
190 socket->Disconnect(); | 190 socket->Disconnect(); |
191 else | 191 else |
192 error_ = kSocketNotFoundError; | 192 error_ = kSocketNotFoundError; |
193 result_.reset(Value::CreateNullValue()); | 193 SetResult(Value::CreateNullValue()); |
194 } | 194 } |
195 | 195 |
196 bool SocketBindFunction::Prepare() { | 196 bool SocketBindFunction::Prepare() { |
197 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); | 197 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); |
198 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &address_)); | 198 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &address_)); |
199 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(2, &port_)); | 199 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(2, &port_)); |
200 return true; | 200 return true; |
201 } | 201 } |
202 | 202 |
203 void SocketBindFunction::Work() { | 203 void SocketBindFunction::Work() { |
204 int result = -1; | 204 int result = -1; |
205 Socket* socket = controller()->GetSocket(socket_id_); | 205 Socket* socket = controller()->GetSocket(socket_id_); |
206 if (socket) | 206 if (socket) |
207 result = socket->Bind(address_, port_); | 207 result = socket->Bind(address_, port_); |
208 else | 208 else |
209 error_ = kSocketNotFoundError; | 209 error_ = kSocketNotFoundError; |
210 | 210 |
211 result_.reset(Value::CreateIntegerValue(result)); | 211 SetResult(Value::CreateIntegerValue(result)); |
212 } | 212 } |
213 | 213 |
214 SocketReadFunction::SocketReadFunction() | 214 SocketReadFunction::SocketReadFunction() |
215 : params_(NULL) { | 215 : params_(NULL) { |
216 } | 216 } |
217 | 217 |
218 SocketReadFunction::~SocketReadFunction() {} | 218 SocketReadFunction::~SocketReadFunction() {} |
219 | 219 |
220 bool SocketReadFunction::Prepare() { | 220 bool SocketReadFunction::Prepare() { |
221 params_ = api::experimental_socket::Read::Params::Create(*args_); | 221 params_ = api::experimental_socket::Read::Params::Create(*args_); |
(...skipping 19 matching lines...) Expand all Loading... |
241 result->SetInteger(kResultCodeKey, bytes_read); | 241 result->SetInteger(kResultCodeKey, bytes_read); |
242 if (bytes_read > 0) { | 242 if (bytes_read > 0) { |
243 result->Set(kDataKey, | 243 result->Set(kDataKey, |
244 base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(), | 244 base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(), |
245 bytes_read)); | 245 bytes_read)); |
246 } else { | 246 } else { |
247 // BinaryValue does not support NULL buffer. Workaround it with new char[1]. | 247 // BinaryValue does not support NULL buffer. Workaround it with new char[1]. |
248 // http://crbug.com/127630 | 248 // http://crbug.com/127630 |
249 result->Set(kDataKey, base::BinaryValue::Create(new char[1], 0)); | 249 result->Set(kDataKey, base::BinaryValue::Create(new char[1], 0)); |
250 } | 250 } |
251 result_.reset(result); | 251 SetResult(result); |
252 | 252 |
253 AsyncWorkCompleted(); | 253 AsyncWorkCompleted(); |
254 } | 254 } |
255 | 255 |
256 SocketWriteFunction::SocketWriteFunction() | 256 SocketWriteFunction::SocketWriteFunction() |
257 : socket_id_(0), | 257 : socket_id_(0), |
258 io_buffer_(NULL), | 258 io_buffer_(NULL), |
259 io_buffer_size_(0) { | 259 io_buffer_size_(0) { |
260 } | 260 } |
261 | 261 |
(...skipping 18 matching lines...) Expand all Loading... |
280 return; | 280 return; |
281 } | 281 } |
282 | 282 |
283 socket->Write(io_buffer_, io_buffer_size_, | 283 socket->Write(io_buffer_, io_buffer_size_, |
284 base::Bind(&SocketWriteFunction::OnCompleted, this)); | 284 base::Bind(&SocketWriteFunction::OnCompleted, this)); |
285 } | 285 } |
286 | 286 |
287 void SocketWriteFunction::OnCompleted(int bytes_written) { | 287 void SocketWriteFunction::OnCompleted(int bytes_written) { |
288 DictionaryValue* result = new DictionaryValue(); | 288 DictionaryValue* result = new DictionaryValue(); |
289 result->SetInteger(kBytesWrittenKey, bytes_written); | 289 result->SetInteger(kBytesWrittenKey, bytes_written); |
290 result_.reset(result); | 290 SetResult(result); |
291 | 291 |
292 AsyncWorkCompleted(); | 292 AsyncWorkCompleted(); |
293 } | 293 } |
294 | 294 |
295 SocketRecvFromFunction::SocketRecvFromFunction() | 295 SocketRecvFromFunction::SocketRecvFromFunction() |
296 : params_(NULL) { | 296 : params_(NULL) { |
297 } | 297 } |
298 | 298 |
299 SocketRecvFromFunction::~SocketRecvFromFunction() {} | 299 SocketRecvFromFunction::~SocketRecvFromFunction() {} |
300 | 300 |
(...skipping 25 matching lines...) Expand all Loading... |
326 result->Set(kDataKey, | 326 result->Set(kDataKey, |
327 base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(), | 327 base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(), |
328 bytes_read)); | 328 bytes_read)); |
329 } else { | 329 } else { |
330 // BinaryValue does not support NULL buffer. Workaround it with new char[1]. | 330 // BinaryValue does not support NULL buffer. Workaround it with new char[1]. |
331 // http://crbug.com/127630 | 331 // http://crbug.com/127630 |
332 result->Set(kDataKey, base::BinaryValue::Create(new char[1], 0)); | 332 result->Set(kDataKey, base::BinaryValue::Create(new char[1], 0)); |
333 } | 333 } |
334 result->SetString(kAddressKey, address); | 334 result->SetString(kAddressKey, address); |
335 result->SetInteger(kPortKey, port); | 335 result->SetInteger(kPortKey, port); |
336 result_.reset(result); | 336 SetResult(result); |
337 | 337 |
338 AsyncWorkCompleted(); | 338 AsyncWorkCompleted(); |
339 } | 339 } |
340 | 340 |
341 SocketSendToFunction::SocketSendToFunction() | 341 SocketSendToFunction::SocketSendToFunction() |
342 : socket_id_(0), | 342 : socket_id_(0), |
343 io_buffer_(NULL), | 343 io_buffer_(NULL), |
344 io_buffer_size_(0) { | 344 io_buffer_size_(0) { |
345 } | 345 } |
346 | 346 |
(...skipping 12 matching lines...) Expand all Loading... |
359 } | 359 } |
360 | 360 |
361 void SocketSendToFunction::AsyncWorkStart() { | 361 void SocketSendToFunction::AsyncWorkStart() { |
362 StartDnsLookup(hostname_); | 362 StartDnsLookup(hostname_); |
363 } | 363 } |
364 | 364 |
365 void SocketSendToFunction::AfterDnsLookup(int lookup_result) { | 365 void SocketSendToFunction::AfterDnsLookup(int lookup_result) { |
366 if (lookup_result == net::OK) { | 366 if (lookup_result == net::OK) { |
367 StartSendTo(); | 367 StartSendTo(); |
368 } else { | 368 } else { |
369 result_.reset(Value::CreateIntegerValue(lookup_result)); | 369 SetResult(Value::CreateIntegerValue(lookup_result)); |
370 AsyncWorkCompleted(); | 370 AsyncWorkCompleted(); |
371 } | 371 } |
372 } | 372 } |
373 | 373 |
374 void SocketSendToFunction::StartSendTo() { | 374 void SocketSendToFunction::StartSendTo() { |
375 Socket* socket = controller()->GetSocket(socket_id_); | 375 Socket* socket = controller()->GetSocket(socket_id_); |
376 if (!socket) { | 376 if (!socket) { |
377 error_ = kSocketNotFoundError; | 377 error_ = kSocketNotFoundError; |
378 OnCompleted(-1); | 378 OnCompleted(-1); |
379 return; | 379 return; |
380 } | 380 } |
381 | 381 |
382 socket->SendTo(io_buffer_, io_buffer_size_, resolved_address_, port_, | 382 socket->SendTo(io_buffer_, io_buffer_size_, resolved_address_, port_, |
383 base::Bind(&SocketSendToFunction::OnCompleted, this)); | 383 base::Bind(&SocketSendToFunction::OnCompleted, this)); |
384 } | 384 } |
385 | 385 |
386 void SocketSendToFunction::OnCompleted(int bytes_written) { | 386 void SocketSendToFunction::OnCompleted(int bytes_written) { |
387 DictionaryValue* result = new DictionaryValue(); | 387 DictionaryValue* result = new DictionaryValue(); |
388 result->SetInteger(kBytesWrittenKey, bytes_written); | 388 result->SetInteger(kBytesWrittenKey, bytes_written); |
389 result_.reset(result); | 389 SetResult(result); |
390 | 390 |
391 AsyncWorkCompleted(); | 391 AsyncWorkCompleted(); |
392 } | 392 } |
393 | 393 |
394 SocketSetKeepAliveFunction::SocketSetKeepAliveFunction() | 394 SocketSetKeepAliveFunction::SocketSetKeepAliveFunction() |
395 : params_(NULL) { | 395 : params_(NULL) { |
396 } | 396 } |
397 | 397 |
398 SocketSetKeepAliveFunction::~SocketSetKeepAliveFunction() {} | 398 SocketSetKeepAliveFunction::~SocketSetKeepAliveFunction() {} |
399 | 399 |
400 bool SocketSetKeepAliveFunction::Prepare() { | 400 bool SocketSetKeepAliveFunction::Prepare() { |
401 params_ = api::experimental_socket::SetKeepAlive::Params::Create(*args_); | 401 params_ = api::experimental_socket::SetKeepAlive::Params::Create(*args_); |
402 EXTENSION_FUNCTION_VALIDATE(params_.get()); | 402 EXTENSION_FUNCTION_VALIDATE(params_.get()); |
403 return true; | 403 return true; |
404 } | 404 } |
405 | 405 |
406 void SocketSetKeepAliveFunction::Work() { | 406 void SocketSetKeepAliveFunction::Work() { |
407 bool result = false; | 407 bool result = false; |
408 Socket* socket = controller()->GetSocket(params_->socket_id); | 408 Socket* socket = controller()->GetSocket(params_->socket_id); |
409 if (socket) { | 409 if (socket) { |
410 int delay = 0; | 410 int delay = 0; |
411 if (params_->delay.get()) | 411 if (params_->delay.get()) |
412 delay = *params_->delay; | 412 delay = *params_->delay; |
413 result = socket->SetKeepAlive(params_->enable, delay); | 413 result = socket->SetKeepAlive(params_->enable, delay); |
414 } else { | 414 } else { |
415 error_ = kSocketNotFoundError; | 415 error_ = kSocketNotFoundError; |
416 } | 416 } |
417 result_.reset(Value::CreateBooleanValue(result)); | 417 SetResult(Value::CreateBooleanValue(result)); |
418 } | 418 } |
419 | 419 |
420 SocketSetNoDelayFunction::SocketSetNoDelayFunction() | 420 SocketSetNoDelayFunction::SocketSetNoDelayFunction() |
421 : params_(NULL) { | 421 : params_(NULL) { |
422 } | 422 } |
423 | 423 |
424 SocketSetNoDelayFunction::~SocketSetNoDelayFunction() {} | 424 SocketSetNoDelayFunction::~SocketSetNoDelayFunction() {} |
425 | 425 |
426 bool SocketSetNoDelayFunction::Prepare() { | 426 bool SocketSetNoDelayFunction::Prepare() { |
427 params_ = api::experimental_socket::SetNoDelay::Params::Create(*args_); | 427 params_ = api::experimental_socket::SetNoDelay::Params::Create(*args_); |
428 EXTENSION_FUNCTION_VALIDATE(params_.get()); | 428 EXTENSION_FUNCTION_VALIDATE(params_.get()); |
429 return true; | 429 return true; |
430 } | 430 } |
431 | 431 |
432 void SocketSetNoDelayFunction::Work() { | 432 void SocketSetNoDelayFunction::Work() { |
433 bool result = false; | 433 bool result = false; |
434 Socket* socket = controller()->GetSocket(params_->socket_id); | 434 Socket* socket = controller()->GetSocket(params_->socket_id); |
435 if (socket) | 435 if (socket) |
436 result = socket->SetNoDelay(params_->no_delay); | 436 result = socket->SetNoDelay(params_->no_delay); |
437 else | 437 else |
438 error_ = kSocketNotFoundError; | 438 error_ = kSocketNotFoundError; |
439 result_.reset(Value::CreateBooleanValue(result)); | 439 SetResult(Value::CreateBooleanValue(result)); |
440 } | 440 } |
441 | 441 |
442 } // namespace extensions | 442 } // namespace extensions |
OLD | NEW |