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

Side by Side Diff: chrome/renderer/extensions/webrtc_native_handler.cc

Issue 47303005: Implement native bindings for cast extensions API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix build again Created 7 years, 1 month 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 "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, &params)) {
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 &params_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
OLDNEW
« no previous file with comments | « chrome/renderer/extensions/webrtc_native_handler.h ('k') | chrome/renderer/media/cast_send_transport.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698