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/webrtc_native_handler.h" | 5 #include "chrome/renderer/extensions/webrtc_native_handler.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "chrome/common/extensions/api/webrtc_cast_send_transport.h" |
| 9 #include "chrome/common/extensions/api/webrtc_cast_udp_transport.h" |
| 10 #include "chrome/renderer/extensions/chrome_v8_context.h" |
| 11 #include "chrome/renderer/media/cast_send_transport.h" |
| 12 #include "chrome/renderer/media/cast_session.h" |
| 13 #include "chrome/renderer/media/cast_udp_transport.h" |
| 14 #include "content/public/renderer/v8_value_converter.h" |
| 15 #include "net/base/host_port_pair.h" |
| 16 |
| 17 using content::V8ValueConverter; |
| 18 |
| 19 // Extension types. |
| 20 using extensions::api::webrtc_cast_send_transport::RtpCaps; |
| 21 using extensions::api::webrtc_cast_send_transport::RtpParams; |
| 22 using extensions::api::webrtc_cast_send_transport::RtpPayloadParams; |
| 23 using extensions::api::webrtc_cast_udp_transport::CreateInfo; |
| 24 using extensions::api::webrtc_cast_udp_transport::UdpParams; |
8 | 25 |
9 namespace extensions { | 26 namespace extensions { |
10 | 27 |
| 28 namespace { |
| 29 const char kSendTransportNotFound[] = "The send transport cannot be found"; |
| 30 const char kUdpTransportNotFound[] = "The UDP transport cannot be found"; |
| 31 const char kInvalidUdpParams[] = "Invalid UDP params"; |
| 32 const char kInvalidRtpCaps[] = "Invalid value for RTP caps"; |
| 33 const char kInvalidRtpParams[] = "Invalid value for RTP params"; |
| 34 const char kUnableToConvertArgs[] = "Unable to convert arguments"; |
| 35 const char kUnableToConvertCaps[] = "Unable to convert caps"; |
| 36 const char kUnableToConvertParams[] = "Unable to convert params"; |
| 37 |
| 38 // These helper methods are used to convert between Extension API |
| 39 // types and Cast types. |
| 40 bool ToCastRtpCaps(const RtpCaps& ext_caps, CastRtpCaps* cast_caps) { |
| 41 NOTIMPLEMENTED(); |
| 42 return true; |
| 43 } |
| 44 |
| 45 bool FromCastRtpCaps(const CastRtpCaps& cast_caps, RtpCaps* ext_caps) { |
| 46 NOTIMPLEMENTED(); |
| 47 return true; |
| 48 } |
| 49 |
| 50 bool ToCastRtpParams(const RtpParams& ext_params, CastRtpParams* cast_params) { |
| 51 NOTIMPLEMENTED(); |
| 52 return true; |
| 53 } |
| 54 |
| 55 bool FromCastRtpParams(const CastRtpParams& cast_params, |
| 56 RtpParams* ext_params) { |
| 57 NOTIMPLEMENTED(); |
| 58 return true; |
| 59 } |
| 60 |
| 61 } // namespace |
| 62 |
11 WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context) | 63 WebRtcNativeHandler::WebRtcNativeHandler(ChromeV8Context* context) |
12 : ObjectBackedNativeHandler(context) { | 64 : ObjectBackedNativeHandler(context), |
| 65 last_transport_id_(0) { |
13 RouteFunction("CreateCastSendTransport", | 66 RouteFunction("CreateCastSendTransport", |
14 base::Bind(&WebRtcNativeHandler::CreateCastSendTransport, | 67 base::Bind(&WebRtcNativeHandler::CreateCastSendTransport, |
15 base::Unretained(this))); | 68 base::Unretained(this))); |
16 RouteFunction("DestroyCastSendTransport", | 69 RouteFunction("DestroyCastSendTransport", |
17 base::Bind(&WebRtcNativeHandler::DestroyCastSendTransport, | 70 base::Bind(&WebRtcNativeHandler::DestroyCastSendTransport, |
18 base::Unretained(this))); | 71 base::Unretained(this))); |
19 RouteFunction("CreateParamsCastSendTransport", | 72 RouteFunction("CreateParamsCastSendTransport", |
20 base::Bind(&WebRtcNativeHandler::CreateParamsCastSendTransport, | 73 base::Bind(&WebRtcNativeHandler::CreateParamsCastSendTransport, |
21 base::Unretained(this))); | 74 base::Unretained(this))); |
22 RouteFunction("GetCapsCastSendTransport", | 75 RouteFunction("GetCapsCastSendTransport", |
23 base::Bind(&WebRtcNativeHandler::GetCapsCastSendTransport, | 76 base::Bind(&WebRtcNativeHandler::GetCapsCastSendTransport, |
24 base::Unretained(this))); | 77 base::Unretained(this))); |
25 RouteFunction("StartCastSendTransport", | 78 RouteFunction("StartCastSendTransport", |
26 base::Bind(&WebRtcNativeHandler::StartCastSendTransport, | 79 base::Bind(&WebRtcNativeHandler::StartCastSendTransport, |
27 base::Unretained(this))); | 80 base::Unretained(this))); |
28 RouteFunction("StopCastSendTransport", | 81 RouteFunction("StopCastSendTransport", |
29 base::Bind(&WebRtcNativeHandler::StopCastSendTransport, | 82 base::Bind(&WebRtcNativeHandler::StopCastSendTransport, |
30 base::Unretained(this))); | 83 base::Unretained(this))); |
31 RouteFunction("CreateCastUdpTransport", | 84 RouteFunction("CreateCastUdpTransport", |
32 base::Bind(&WebRtcNativeHandler::CreateCastUdpTransport, | 85 base::Bind(&WebRtcNativeHandler::CreateCastUdpTransport, |
33 base::Unretained(this))); | 86 base::Unretained(this))); |
| 87 RouteFunction("DestroyCastUdpTransport", |
| 88 base::Bind(&WebRtcNativeHandler::DestroyCastUdpTransport, |
| 89 base::Unretained(this))); |
34 RouteFunction("StartCastUdpTransport", | 90 RouteFunction("StartCastUdpTransport", |
35 base::Bind(&WebRtcNativeHandler::StartCastUdpTransport, | 91 base::Bind(&WebRtcNativeHandler::StartCastUdpTransport, |
36 base::Unretained(this))); | 92 base::Unretained(this))); |
37 RouteFunction("StopCastUdpTransport", | 93 RouteFunction("StopCastUdpTransport", |
38 base::Bind(&WebRtcNativeHandler::StopCastUdpTransport, | 94 base::Bind(&WebRtcNativeHandler::StopCastUdpTransport, |
39 base::Unretained(this))); | 95 base::Unretained(this))); |
40 } | 96 } |
41 | 97 |
42 WebRtcNativeHandler::~WebRtcNativeHandler() { | 98 WebRtcNativeHandler::~WebRtcNativeHandler() { |
43 } | 99 } |
44 | 100 |
45 void WebRtcNativeHandler::CreateCastSendTransport( | 101 void WebRtcNativeHandler::CreateCastSendTransport( |
46 const v8::FunctionCallbackInfo<v8::Value>& args) { | 102 const v8::FunctionCallbackInfo<v8::Value>& args) { |
47 NOTIMPLEMENTED(); | 103 CHECK_EQ(3, args.Length()); |
| 104 CHECK(args[0]->IsInt32()); |
| 105 CHECK(args[1]->IsObject()); |
| 106 CHECK(args[2]->IsFunction()); |
| 107 |
| 108 const int inner_transport_id = args[0]->ToInt32()->Value(); |
| 109 CastUdpTransport* inner_transport = GetUdpTransportOrThrow( |
| 110 inner_transport_id); |
| 111 if (!inner_transport) |
| 112 return; |
| 113 |
| 114 // TODO(hclam): Convert second argument from v8::Value to |
| 115 // WebMediaStreamTrack. |
| 116 int transport_id = last_transport_id_++; |
| 117 send_transport_map_[transport_id] = |
| 118 linked_ptr<CastSendTransport>(new CastSendTransport(inner_transport)); |
| 119 |
| 120 v8::Handle<v8::Value> transport_id_v8 = v8::Integer::New(transport_id); |
| 121 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[2]), 1, |
| 122 &transport_id_v8); |
48 } | 123 } |
49 | 124 |
50 void WebRtcNativeHandler::DestroyCastSendTransport( | 125 void WebRtcNativeHandler::DestroyCastSendTransport( |
51 const v8::FunctionCallbackInfo<v8::Value>& args) { | 126 const v8::FunctionCallbackInfo<v8::Value>& args) { |
52 NOTIMPLEMENTED(); | 127 CHECK_EQ(1, args.Length()); |
| 128 CHECK(args[0]->IsInt32()); |
| 129 |
| 130 const int transport_id = args[0]->ToInt32()->Value(); |
| 131 if (!GetSendTransportOrThrow(transport_id)) |
| 132 return; |
| 133 send_transport_map_.erase(transport_id); |
53 } | 134 } |
54 | 135 |
55 void WebRtcNativeHandler::CreateParamsCastSendTransport( | 136 void WebRtcNativeHandler::CreateParamsCastSendTransport( |
56 const v8::FunctionCallbackInfo<v8::Value>& args) { | 137 const v8::FunctionCallbackInfo<v8::Value>& args) { |
57 NOTIMPLEMENTED(); | 138 CHECK_EQ(3, args.Length()); |
| 139 CHECK(args[0]->IsInt32()); |
| 140 CHECK(args[1]->IsObject()); |
| 141 CHECK(args[2]->IsFunction()); |
| 142 |
| 143 const int transport_id = args[0]->ToInt32()->Value(); |
| 144 CastSendTransport* transport = GetSendTransportOrThrow(transport_id); |
| 145 if (!transport) |
| 146 return; |
| 147 |
| 148 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 149 scoped_ptr<Value> remote_caps_value( |
| 150 converter->FromV8Value(args[1], context()->v8_context())); |
| 151 if (!remote_caps_value) { |
| 152 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 153 kUnableToConvertArgs))); |
| 154 return; |
| 155 } |
| 156 scoped_ptr<RtpCaps> remote_caps = |
| 157 RtpCaps::FromValue(*remote_caps_value); |
| 158 if (!remote_caps) { |
| 159 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 160 kInvalidRtpCaps))); |
| 161 return; |
| 162 } |
| 163 |
| 164 CastRtpCaps cast_remote_caps; |
| 165 if (!ToCastRtpCaps(*remote_caps, &cast_remote_caps)) { |
| 166 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 167 kUnableToConvertCaps))); |
| 168 return; |
| 169 } |
| 170 CastRtpParams cast_params = transport->CreateParams(cast_remote_caps); |
| 171 RtpParams params; |
| 172 if (!FromCastRtpParams(cast_params, ¶ms)) { |
| 173 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 174 kUnableToConvertParams))); |
| 175 return; |
| 176 } |
| 177 |
| 178 scoped_ptr<base::DictionaryValue> params_value = params.ToValue(); |
| 179 v8::Handle<v8::Value> params_v8 = converter->ToV8Value( |
| 180 params_value.get(), context()->v8_context()); |
| 181 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[2]), 1, |
| 182 ¶ms_v8); |
58 } | 183 } |
59 | 184 |
60 void WebRtcNativeHandler::GetCapsCastSendTransport( | 185 void WebRtcNativeHandler::GetCapsCastSendTransport( |
61 const v8::FunctionCallbackInfo<v8::Value>& args) { | 186 const v8::FunctionCallbackInfo<v8::Value>& args) { |
62 NOTIMPLEMENTED(); | 187 CHECK_EQ(2, args.Length()); |
| 188 CHECK(args[0]->IsInt32()); |
| 189 CHECK(args[1]->IsFunction()); |
| 190 |
| 191 const int transport_id = args[0]->ToInt32()->Value(); |
| 192 CastSendTransport* transport = GetSendTransportOrThrow(transport_id); |
| 193 if (!transport) |
| 194 return; |
| 195 |
| 196 CastRtpCaps cast_caps = transport->GetCaps(); |
| 197 RtpCaps caps; |
| 198 if (!FromCastRtpCaps(cast_caps, &caps)) { |
| 199 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 200 kUnableToConvertCaps))); |
| 201 return; |
| 202 } |
| 203 |
| 204 scoped_ptr<base::DictionaryValue> caps_value = caps.ToValue(); |
| 205 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 206 v8::Handle<v8::Value> caps_v8 = converter->ToV8Value( |
| 207 caps_value.get(), context()->v8_context()); |
| 208 context()->CallFunction(v8::Handle<v8::Function>::Cast(args[1]), 1, |
| 209 &caps_v8); |
63 } | 210 } |
64 | 211 |
65 void WebRtcNativeHandler::StartCastSendTransport( | 212 void WebRtcNativeHandler::StartCastSendTransport( |
66 const v8::FunctionCallbackInfo<v8::Value>& args) { | 213 const v8::FunctionCallbackInfo<v8::Value>& args) { |
67 NOTIMPLEMENTED(); | 214 CHECK_EQ(2, args.Length()); |
| 215 CHECK(args[0]->IsInt32()); |
| 216 CHECK(args[1]->IsObject()); |
| 217 |
| 218 const int transport_id = args[0]->ToInt32()->Value(); |
| 219 CastSendTransport* transport = GetSendTransportOrThrow(transport_id); |
| 220 if (!transport) |
| 221 return; |
| 222 |
| 223 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 224 scoped_ptr<Value> params_value( |
| 225 converter->FromV8Value(args[1], context()->v8_context())); |
| 226 if (!params_value) { |
| 227 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 228 kUnableToConvertParams))); |
| 229 return; |
| 230 } |
| 231 scoped_ptr<RtpParams> params = RtpParams::FromValue(*params_value); |
| 232 if (!params) { |
| 233 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 234 kInvalidRtpParams))); |
| 235 return; |
| 236 } |
| 237 |
| 238 CastRtpCaps cast_params; |
| 239 if (!ToCastRtpParams(*params, &cast_params)) { |
| 240 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 241 kUnableToConvertParams))); |
| 242 return; |
| 243 } |
| 244 transport->Start(cast_params); |
68 } | 245 } |
69 | 246 |
70 void WebRtcNativeHandler::StopCastSendTransport( | 247 void WebRtcNativeHandler::StopCastSendTransport( |
71 const v8::FunctionCallbackInfo<v8::Value>& args) { | 248 const v8::FunctionCallbackInfo<v8::Value>& args) { |
72 NOTIMPLEMENTED(); | 249 CHECK_EQ(1, args.Length()); |
| 250 CHECK(args[0]->IsInt32()); |
| 251 |
| 252 const int transport_id = args[0]->ToInt32()->Value(); |
| 253 CastSendTransport* transport = GetSendTransportOrThrow(transport_id); |
| 254 if (!transport) |
| 255 return; |
| 256 transport->Stop(); |
73 } | 257 } |
74 | 258 |
75 void WebRtcNativeHandler::CreateCastUdpTransport( | 259 void WebRtcNativeHandler::CreateCastUdpTransport( |
76 const v8::FunctionCallbackInfo<v8::Value>& args) { | 260 const v8::FunctionCallbackInfo<v8::Value>& args) { |
77 NOTIMPLEMENTED(); | 261 CHECK_EQ(1, args.Length()); |
| 262 CHECK(args[0]->IsFunction()); |
| 263 |
| 264 // TODO(hclam): Fill in |create_info| properly. |
| 265 CreateInfo create_info; |
| 266 create_info.transport_id = last_transport_id_++; |
| 267 udp_transport_map_[create_info.transport_id] = |
| 268 linked_ptr<CastUdpTransport>(new CastUdpTransport()); |
| 269 |
| 270 scoped_ptr<base::DictionaryValue> create_info_value = create_info.ToValue(); |
| 271 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 272 v8::Handle<v8::Value> create_info_v8 = converter->ToV8Value( |
| 273 create_info_value.get(), context()->v8_context()); |
| 274 context()->CallFunction(v8::Handle<v8::Function>::Cast( |
| 275 args[0]), 1, &create_info_v8); |
| 276 } |
| 277 |
| 278 void WebRtcNativeHandler::DestroyCastUdpTransport( |
| 279 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 280 CHECK_EQ(1, args.Length()); |
| 281 CHECK(args[0]->IsInt32()); |
| 282 |
| 283 const int transport_id = args[0]->ToInt32()->Value(); |
| 284 if (!GetUdpTransportOrThrow(transport_id)) |
| 285 return; |
| 286 udp_transport_map_.erase(transport_id); |
78 } | 287 } |
79 | 288 |
80 void WebRtcNativeHandler::StartCastUdpTransport( | 289 void WebRtcNativeHandler::StartCastUdpTransport( |
81 const v8::FunctionCallbackInfo<v8::Value>& args) { | 290 const v8::FunctionCallbackInfo<v8::Value>& args) { |
82 NOTIMPLEMENTED(); | 291 CHECK_EQ(2, args.Length()); |
| 292 CHECK(args[0]->IsInt32()); |
| 293 CHECK(args[1]->IsObject()); |
| 294 |
| 295 const int transport_id = args[0]->ToInt32()->Value(); |
| 296 CastUdpTransport* transport = GetUdpTransportOrThrow(transport_id); |
| 297 if (!transport) |
| 298 return; |
| 299 |
| 300 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
| 301 scoped_ptr<Value> udp_params_value( |
| 302 converter->FromV8Value(args[1], context()->v8_context())); |
| 303 if (!udp_params_value) { |
| 304 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 305 kUnableToConvertArgs))); |
| 306 return; |
| 307 } |
| 308 scoped_ptr<UdpParams> udp_params = UdpParams::FromValue(*udp_params_value); |
| 309 if (!udp_params) { |
| 310 v8::ThrowException(v8::Exception::TypeError(v8::String::New( |
| 311 kInvalidUdpParams))); |
| 312 return; |
| 313 } |
| 314 transport->Start(net::HostPortPair(udp_params->address, udp_params->port)); |
83 } | 315 } |
84 | 316 |
85 void WebRtcNativeHandler::StopCastUdpTransport( | 317 void WebRtcNativeHandler::StopCastUdpTransport( |
86 const v8::FunctionCallbackInfo<v8::Value>& args) { | 318 const v8::FunctionCallbackInfo<v8::Value>& args) { |
87 NOTIMPLEMENTED(); | 319 CHECK_EQ(1, args.Length()); |
| 320 CHECK(args[0]->IsInt32()); |
| 321 |
| 322 const int transport_id = args[0]->ToInt32()->Value(); |
| 323 CastUdpTransport* transport = GetUdpTransportOrThrow(transport_id); |
| 324 if (!transport) |
| 325 return; |
| 326 transport->Stop(); |
| 327 } |
| 328 |
| 329 CastSendTransport* WebRtcNativeHandler::GetSendTransportOrThrow( |
| 330 int transport_id) const { |
| 331 SendTransportMap::const_iterator iter = send_transport_map_.find( |
| 332 transport_id); |
| 333 if (iter != send_transport_map_.end()) |
| 334 return iter->second.get(); |
| 335 v8::ThrowException(v8::Exception::RangeError(v8::String::New( |
| 336 kSendTransportNotFound))); |
| 337 return NULL; |
| 338 } |
| 339 |
| 340 CastUdpTransport* WebRtcNativeHandler::GetUdpTransportOrThrow( |
| 341 int transport_id) const { |
| 342 UdpTransportMap::const_iterator iter = udp_transport_map_.find( |
| 343 transport_id); |
| 344 if (iter != udp_transport_map_.end()) |
| 345 return iter->second.get(); |
| 346 v8::ThrowException(v8::Exception::RangeError(v8::String::New( |
| 347 kUdpTransportNotFound))); |
| 348 return NULL; |
88 } | 349 } |
89 | 350 |
90 } // namespace extensions | 351 } // namespace extensions |
OLD | NEW |