| OLD | NEW |
| 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 "chrome/renderer/extensions/cast_streaming_native_handler.h" | 5 #include "chrome/renderer/extensions/cast_streaming_native_handler.h" |
| 6 | 6 |
| 7 #include <functional> | 7 #include <functional> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 v8::String::NewFromUtf8( | 320 v8::String::NewFromUtf8( |
| 321 isolate, message.data(), v8::String::kNormalString, message.size())); | 321 isolate, message.data(), v8::String::kNormalString, message.size())); |
| 322 context()->DispatchEvent("cast.streaming.rtpStream.onError", event_args); | 322 context()->DispatchEvent("cast.streaming.rtpStream.onError", event_args); |
| 323 } | 323 } |
| 324 | 324 |
| 325 void CastStreamingNativeHandler::DestroyCastRtpStream( | 325 void CastStreamingNativeHandler::DestroyCastRtpStream( |
| 326 const v8::FunctionCallbackInfo<v8::Value>& args) { | 326 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 327 CHECK_EQ(1, args.Length()); | 327 CHECK_EQ(1, args.Length()); |
| 328 CHECK(args[0]->IsInt32()); | 328 CHECK(args[0]->IsInt32()); |
| 329 | 329 |
| 330 const int transport_id = args[0]->ToInt32()->Value(); | 330 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 331 if (!GetRtpStreamOrThrow(transport_id)) | 331 if (!GetRtpStreamOrThrow(transport_id)) |
| 332 return; | 332 return; |
| 333 rtp_stream_map_.erase(transport_id); | 333 rtp_stream_map_.erase(transport_id); |
| 334 } | 334 } |
| 335 | 335 |
| 336 void CastStreamingNativeHandler::GetSupportedParamsCastRtpStream( | 336 void CastStreamingNativeHandler::GetSupportedParamsCastRtpStream( |
| 337 const v8::FunctionCallbackInfo<v8::Value>& args) { | 337 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 338 CHECK_EQ(1, args.Length()); | 338 CHECK_EQ(1, args.Length()); |
| 339 CHECK(args[0]->IsInt32()); | 339 CHECK(args[0]->IsInt32()); |
| 340 | 340 |
| 341 const int transport_id = args[0]->ToInt32()->Value(); | 341 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 342 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); | 342 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); |
| 343 if (!transport) | 343 if (!transport) |
| 344 return; | 344 return; |
| 345 | 345 |
| 346 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 346 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 347 std::vector<CastRtpParams> cast_params = transport->GetSupportedParams(); | 347 std::vector<CastRtpParams> cast_params = transport->GetSupportedParams(); |
| 348 v8::Handle<v8::Array> result = | 348 v8::Handle<v8::Array> result = |
| 349 v8::Array::New(args.GetIsolate(), | 349 v8::Array::New(args.GetIsolate(), |
| 350 static_cast<int>(cast_params.size())); | 350 static_cast<int>(cast_params.size())); |
| 351 for (size_t i = 0; i < cast_params.size(); ++i) { | 351 for (size_t i = 0; i < cast_params.size(); ++i) { |
| 352 RtpParams params; | 352 RtpParams params; |
| 353 FromCastRtpParams(cast_params[i], ¶ms); | 353 FromCastRtpParams(cast_params[i], ¶ms); |
| 354 scoped_ptr<base::DictionaryValue> params_value = params.ToValue(); | 354 scoped_ptr<base::DictionaryValue> params_value = params.ToValue(); |
| 355 result->Set( | 355 result->Set( |
| 356 static_cast<int>(i), | 356 static_cast<int>(i), |
| 357 converter->ToV8Value(params_value.get(), context()->v8_context())); | 357 converter->ToV8Value(params_value.get(), context()->v8_context())); |
| 358 } | 358 } |
| 359 args.GetReturnValue().Set(result); | 359 args.GetReturnValue().Set(result); |
| 360 } | 360 } |
| 361 | 361 |
| 362 void CastStreamingNativeHandler::StartCastRtpStream( | 362 void CastStreamingNativeHandler::StartCastRtpStream( |
| 363 const v8::FunctionCallbackInfo<v8::Value>& args) { | 363 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 364 CHECK_EQ(2, args.Length()); | 364 CHECK_EQ(2, args.Length()); |
| 365 CHECK(args[0]->IsInt32()); | 365 CHECK(args[0]->IsInt32()); |
| 366 CHECK(args[1]->IsObject()); | 366 CHECK(args[1]->IsObject()); |
| 367 | 367 |
| 368 const int transport_id = args[0]->ToInt32()->Value(); | 368 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 369 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); | 369 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); |
| 370 if (!transport) | 370 if (!transport) |
| 371 return; | 371 return; |
| 372 | 372 |
| 373 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 373 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 374 scoped_ptr<base::Value> params_value( | 374 scoped_ptr<base::Value> params_value( |
| 375 converter->FromV8Value(args[1], context()->v8_context())); | 375 converter->FromV8Value(args[1], context()->v8_context())); |
| 376 if (!params_value) { | 376 if (!params_value) { |
| 377 args.GetIsolate()->ThrowException(v8::Exception::TypeError( | 377 args.GetIsolate()->ThrowException(v8::Exception::TypeError( |
| 378 v8::String::NewFromUtf8(args.GetIsolate(), kUnableToConvertParams))); | 378 v8::String::NewFromUtf8(args.GetIsolate(), kUnableToConvertParams))); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 403 weak_factory_.GetWeakPtr(), | 403 weak_factory_.GetWeakPtr(), |
| 404 transport_id); | 404 transport_id); |
| 405 transport->Start(cast_params, start_callback, stop_callback, error_callback); | 405 transport->Start(cast_params, start_callback, stop_callback, error_callback); |
| 406 } | 406 } |
| 407 | 407 |
| 408 void CastStreamingNativeHandler::StopCastRtpStream( | 408 void CastStreamingNativeHandler::StopCastRtpStream( |
| 409 const v8::FunctionCallbackInfo<v8::Value>& args) { | 409 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 410 CHECK_EQ(1, args.Length()); | 410 CHECK_EQ(1, args.Length()); |
| 411 CHECK(args[0]->IsInt32()); | 411 CHECK(args[0]->IsInt32()); |
| 412 | 412 |
| 413 const int transport_id = args[0]->ToInt32()->Value(); | 413 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 414 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); | 414 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); |
| 415 if (!transport) | 415 if (!transport) |
| 416 return; | 416 return; |
| 417 transport->Stop(); | 417 transport->Stop(); |
| 418 } | 418 } |
| 419 | 419 |
| 420 void CastStreamingNativeHandler::DestroyCastUdpTransport( | 420 void CastStreamingNativeHandler::DestroyCastUdpTransport( |
| 421 const v8::FunctionCallbackInfo<v8::Value>& args) { | 421 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 422 CHECK_EQ(1, args.Length()); | 422 CHECK_EQ(1, args.Length()); |
| 423 CHECK(args[0]->IsInt32()); | 423 CHECK(args[0]->IsInt32()); |
| 424 | 424 |
| 425 const int transport_id = args[0]->ToInt32()->Value(); | 425 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 426 if (!GetUdpTransportOrThrow(transport_id)) | 426 if (!GetUdpTransportOrThrow(transport_id)) |
| 427 return; | 427 return; |
| 428 udp_transport_map_.erase(transport_id); | 428 udp_transport_map_.erase(transport_id); |
| 429 } | 429 } |
| 430 | 430 |
| 431 void CastStreamingNativeHandler::SetDestinationCastUdpTransport( | 431 void CastStreamingNativeHandler::SetDestinationCastUdpTransport( |
| 432 const v8::FunctionCallbackInfo<v8::Value>& args) { | 432 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 433 CHECK_EQ(2, args.Length()); | 433 CHECK_EQ(2, args.Length()); |
| 434 CHECK(args[0]->IsInt32()); | 434 CHECK(args[0]->IsInt32()); |
| 435 CHECK(args[1]->IsObject()); | 435 CHECK(args[1]->IsObject()); |
| 436 | 436 |
| 437 const int transport_id = args[0]->ToInt32()->Value(); | 437 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 438 CastUdpTransport* transport = GetUdpTransportOrThrow(transport_id); | 438 CastUdpTransport* transport = GetUdpTransportOrThrow(transport_id); |
| 439 if (!transport) | 439 if (!transport) |
| 440 return; | 440 return; |
| 441 | 441 |
| 442 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 442 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 443 scoped_ptr<base::Value> destination_value( | 443 scoped_ptr<base::Value> destination_value( |
| 444 converter->FromV8Value(args[1], context()->v8_context())); | 444 converter->FromV8Value(args[1], context()->v8_context())); |
| 445 if (!destination_value) { | 445 if (!destination_value) { |
| 446 args.GetIsolate()->ThrowException(v8::Exception::TypeError( | 446 args.GetIsolate()->ThrowException(v8::Exception::TypeError( |
| 447 v8::String::NewFromUtf8(args.GetIsolate(), kUnableToConvertArgs))); | 447 v8::String::NewFromUtf8(args.GetIsolate(), kUnableToConvertArgs))); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 462 } | 462 } |
| 463 transport->SetDestination(net::IPEndPoint(ip, destination->port)); | 463 transport->SetDestination(net::IPEndPoint(ip, destination->port)); |
| 464 } | 464 } |
| 465 | 465 |
| 466 void CastStreamingNativeHandler::SetOptionsCastUdpTransport( | 466 void CastStreamingNativeHandler::SetOptionsCastUdpTransport( |
| 467 const v8::FunctionCallbackInfo<v8::Value>& args) { | 467 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 468 CHECK_EQ(2, args.Length()); | 468 CHECK_EQ(2, args.Length()); |
| 469 CHECK(args[0]->IsInt32()); | 469 CHECK(args[0]->IsInt32()); |
| 470 CHECK(args[1]->IsObject()); | 470 CHECK(args[1]->IsObject()); |
| 471 | 471 |
| 472 const int transport_id = args[0]->ToInt32()->Value(); | 472 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 473 CastUdpTransport* transport = GetUdpTransportOrThrow(transport_id); | 473 CastUdpTransport* transport = GetUdpTransportOrThrow(transport_id); |
| 474 if (!transport) | 474 if (!transport) |
| 475 return; | 475 return; |
| 476 | 476 |
| 477 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 477 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 478 base::Value* options_value = | 478 base::Value* options_value = |
| 479 converter->FromV8Value(args[1], context()->v8_context()); | 479 converter->FromV8Value(args[1], context()->v8_context()); |
| 480 base::DictionaryValue* options; | 480 base::DictionaryValue* options; |
| 481 if (!options_value || !options_value->GetAsDictionary(&options)) { | 481 if (!options_value || !options_value->GetAsDictionary(&options)) { |
| 482 delete options_value; | 482 delete options_value; |
| 483 args.GetIsolate()->ThrowException(v8::Exception::TypeError( | 483 args.GetIsolate()->ThrowException(v8::Exception::TypeError( |
| 484 v8::String::NewFromUtf8(args.GetIsolate(), kUnableToConvertArgs))); | 484 v8::String::NewFromUtf8(args.GetIsolate(), kUnableToConvertArgs))); |
| 485 return; | 485 return; |
| 486 } | 486 } |
| 487 transport->SetOptions(make_scoped_ptr(options)); | 487 transport->SetOptions(make_scoped_ptr(options)); |
| 488 } | 488 } |
| 489 | 489 |
| 490 void CastStreamingNativeHandler::ToggleLogging( | 490 void CastStreamingNativeHandler::ToggleLogging( |
| 491 const v8::FunctionCallbackInfo<v8::Value>& args) { | 491 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 492 CHECK_EQ(2, args.Length()); | 492 CHECK_EQ(2, args.Length()); |
| 493 CHECK(args[0]->IsInt32()); | 493 CHECK(args[0]->IsInt32()); |
| 494 CHECK(args[1]->IsBoolean()); | 494 CHECK(args[1]->IsBoolean()); |
| 495 | 495 |
| 496 const int stream_id = args[0]->ToInt32()->Value(); | 496 const int stream_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 497 CastRtpStream* stream = GetRtpStreamOrThrow(stream_id); | 497 CastRtpStream* stream = GetRtpStreamOrThrow(stream_id); |
| 498 if (!stream) | 498 if (!stream) |
| 499 return; | 499 return; |
| 500 | 500 |
| 501 const bool enable = args[1]->ToBoolean()->Value(); | 501 const bool enable = args[1]->ToBoolean(args.GetIsolate())->Value(); |
| 502 stream->ToggleLogging(enable); | 502 stream->ToggleLogging(enable); |
| 503 } | 503 } |
| 504 | 504 |
| 505 void CastStreamingNativeHandler::GetRawEvents( | 505 void CastStreamingNativeHandler::GetRawEvents( |
| 506 const v8::FunctionCallbackInfo<v8::Value>& args) { | 506 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 507 CHECK_EQ(3, args.Length()); | 507 CHECK_EQ(3, args.Length()); |
| 508 CHECK(args[0]->IsInt32()); | 508 CHECK(args[0]->IsInt32()); |
| 509 CHECK(args[1]->IsNull() || args[1]->IsString()); | 509 CHECK(args[1]->IsNull() || args[1]->IsString()); |
| 510 CHECK(args[2]->IsFunction()); | 510 CHECK(args[2]->IsFunction()); |
| 511 | 511 |
| 512 const int transport_id = args[0]->ToInt32()->Value(); | 512 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 513 // TODO(imcheng): Use a weak reference to ensure we don't call into an | 513 // TODO(imcheng): Use a weak reference to ensure we don't call into an |
| 514 // invalid context when the callback is invoked. | 514 // invalid context when the callback is invoked. |
| 515 linked_ptr<ScopedPersistent<v8::Function> > callback( | 515 linked_ptr<ScopedPersistent<v8::Function> > callback( |
| 516 new ScopedPersistent<v8::Function>(args[2].As<v8::Function>())); | 516 new ScopedPersistent<v8::Function>(args[2].As<v8::Function>())); |
| 517 std::string extra_data; | 517 std::string extra_data; |
| 518 if (!args[1]->IsNull()) { | 518 if (!args[1]->IsNull()) { |
| 519 extra_data = *v8::String::Utf8Value(args[1]); | 519 extra_data = *v8::String::Utf8Value(args[1]); |
| 520 } | 520 } |
| 521 | 521 |
| 522 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); | 522 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); |
| 523 if (!transport) | 523 if (!transport) |
| 524 return; | 524 return; |
| 525 | 525 |
| 526 get_raw_events_callbacks_.insert(std::make_pair(transport_id, callback)); | 526 get_raw_events_callbacks_.insert(std::make_pair(transport_id, callback)); |
| 527 | 527 |
| 528 transport->GetRawEvents( | 528 transport->GetRawEvents( |
| 529 base::Bind(&CastStreamingNativeHandler::CallGetRawEventsCallback, | 529 base::Bind(&CastStreamingNativeHandler::CallGetRawEventsCallback, |
| 530 weak_factory_.GetWeakPtr(), | 530 weak_factory_.GetWeakPtr(), |
| 531 transport_id), | 531 transport_id), |
| 532 extra_data); | 532 extra_data); |
| 533 } | 533 } |
| 534 | 534 |
| 535 void CastStreamingNativeHandler::GetStats( | 535 void CastStreamingNativeHandler::GetStats( |
| 536 const v8::FunctionCallbackInfo<v8::Value>& args) { | 536 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 537 CHECK_EQ(2, args.Length()); | 537 CHECK_EQ(2, args.Length()); |
| 538 CHECK(args[0]->IsInt32()); | 538 CHECK(args[0]->IsInt32()); |
| 539 CHECK(args[1]->IsFunction()); | 539 CHECK(args[1]->IsFunction()); |
| 540 const int transport_id = args[0]->ToInt32()->Value(); | 540 const int transport_id = args[0]->ToInt32(args.GetIsolate())->Value(); |
| 541 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); | 541 CastRtpStream* transport = GetRtpStreamOrThrow(transport_id); |
| 542 if (!transport) | 542 if (!transport) |
| 543 return; | 543 return; |
| 544 | 544 |
| 545 // TODO(imcheng): Use a weak reference to ensure we don't call into an | 545 // TODO(imcheng): Use a weak reference to ensure we don't call into an |
| 546 // invalid context when the callback is invoked. | 546 // invalid context when the callback is invoked. |
| 547 linked_ptr<ScopedPersistent<v8::Function> > callback( | 547 linked_ptr<ScopedPersistent<v8::Function> > callback( |
| 548 new ScopedPersistent<v8::Function>(args[1].As<v8::Function>())); | 548 new ScopedPersistent<v8::Function>(args[1].As<v8::Function>())); |
| 549 get_stats_callbacks_.insert(std::make_pair(transport_id, callback)); | 549 get_stats_callbacks_.insert(std::make_pair(transport_id, callback)); |
| 550 | 550 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 transport_id); | 609 transport_id); |
| 610 if (iter != udp_transport_map_.end()) | 610 if (iter != udp_transport_map_.end()) |
| 611 return iter->second.get(); | 611 return iter->second.get(); |
| 612 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); | 612 v8::Isolate* isolate = context()->v8_context()->GetIsolate(); |
| 613 isolate->ThrowException(v8::Exception::RangeError( | 613 isolate->ThrowException(v8::Exception::RangeError( |
| 614 v8::String::NewFromUtf8(isolate, kUdpTransportNotFound))); | 614 v8::String::NewFromUtf8(isolate, kUdpTransportNotFound))); |
| 615 return NULL; | 615 return NULL; |
| 616 } | 616 } |
| 617 | 617 |
| 618 } // namespace extensions | 618 } // namespace extensions |
| OLD | NEW |