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

Side by Side Diff: chrome/browser/media/router/media_router_mojo_impl.cc

Issue 1259073004: [Presentation API] Change ListenForSessionMessages API to client-style. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 4 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/media/router/media_router_mojo_impl.h" 5 #include "chrome/browser/media/router/media_router_mojo_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/guid.h" 8 #include "base/guid.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_vector.h" 10 #include "base/memory/scoped_vector.h"
11 #include "base/observer_list.h" 11 #include "base/observer_list.h"
12 #include "base/strings/stringprintf.h" 12 #include "base/strings/stringprintf.h"
13 #include "chrome/browser/media/router/issues_observer.h" 13 #include "chrome/browser/media/router/issues_observer.h"
14 #include "chrome/browser/media/router/media_router_factory.h" 14 #include "chrome/browser/media/router/media_router_factory.h"
15 #include "chrome/browser/media/router/media_router_type_converters.h" 15 #include "chrome/browser/media/router/media_router_type_converters.h"
16 #include "chrome/browser/media/router/media_routes_observer.h" 16 #include "chrome/browser/media/router/media_routes_observer.h"
17 #include "chrome/browser/media/router/media_sinks_observer.h" 17 #include "chrome/browser/media/router/media_sinks_observer.h"
18 #include "chrome/browser/media/router/presentation_session_messages_observer.h"
18 #include "extensions/browser/process_manager.h" 19 #include "extensions/browser/process_manager.h"
19 20
20 #define DVLOG_WITH_INSTANCE(level) \ 21 #define DVLOG_WITH_INSTANCE(level) \
21 DVLOG(level) << "MR #" << instance_id_ << ": " 22 DVLOG(level) << "MR #" << instance_id_ << ": "
22 23
23 #define DLOG_WITH_INSTANCE(level) DLOG(level) << "MR #" << instance_id_ << ": " 24 #define DLOG_WITH_INSTANCE(level) DLOG(level) << "MR #" << instance_id_ << ": "
24 25
25 namespace media_router { 26 namespace media_router {
26 namespace { 27 namespace {
27 28
28 // Converts the callback result of calling Mojo CreateRoute()/JoinRoute() 29 // Converts the callback result of calling Mojo CreateRoute()/JoinRoute()
29 // into a local callback. 30 // into a local callback.
30 void RouteResponseReceived( 31 void RouteResponseReceived(
32 const std::string& presentation_id,
31 const std::vector<MediaRouteResponseCallback>& callbacks, 33 const std::vector<MediaRouteResponseCallback>& callbacks,
32 interfaces::MediaRoutePtr media_route, 34 interfaces::MediaRoutePtr media_route,
33 const mojo::String& error_text) { 35 const mojo::String& error_text) {
34 scoped_ptr<MediaRoute> route; 36 scoped_ptr<MediaRoute> route;
37 std::string actual_presentation_id;
mark a. foltz 2015/08/04 23:47:02 Is this necessary? You could use a ternary below.
imcheng 2015/08/05 21:38:35 I wanted to avoid duplicating the check for error
35 std::string error; 38 std::string error;
36 if (media_route.is_null()) { 39 if (media_route.is_null()) {
37 // An error occurred. 40 // An error occurred.
38 DCHECK(!error_text.is_null()); 41 DCHECK(!error_text.is_null());
39 error = !error_text.get().empty() ? error_text.get() : "Unknown error."; 42 error = !error_text.get().empty() ? error_text.get() : "Unknown error.";
40 } else { 43 } else {
41 route = media_route.To<scoped_ptr<MediaRoute>>(); 44 route = media_route.To<scoped_ptr<MediaRoute>>();
45 actual_presentation_id = presentation_id;
42 } 46 }
43 47
44 for (const MediaRouteResponseCallback& callback : callbacks) 48 for (const MediaRouteResponseCallback& callback : callbacks)
45 callback.Run(route.get(), error); 49 callback.Run(route.get(), actual_presentation_id, error);
46 } 50 }
47 51
48 // TODO(imcheng): We should handle failure in this case. One way is to invoke 52 // TODO(imcheng): We should handle failure in this case. One way is to invoke
49 // all pending requests with failure. (crbug.com/490787) 53 // all pending requests with failure. (crbug.com/490787)
50 void EventPageWakeComplete(bool success) { 54 void EventPageWakeComplete(bool success) {
51 if (!success) 55 if (!success)
52 LOG(ERROR) << "An error encountered while waking the event page."; 56 LOG(ERROR) << "An error encountered while waking the event page.";
53 } 57 }
54 58
55 scoped_ptr<content::PresentationSessionMessage> 59 scoped_ptr<content::PresentationSessionMessage>
56 ConvertToPresentationSessionMessage(interfaces::RouteMessagePtr input) { 60 ConvertToPresentationSessionMessage(interfaces::RouteMessagePtr input) {
57 DCHECK(!input.is_null()); 61 DCHECK(!input.is_null());
58 const auto& id_and_url = GetPresentationIdAndUrl(input->route_id);
59 const std::string& presentation_id = id_and_url.first;
60 const std::string& presentation_url = id_and_url.second;
61 scoped_ptr<content::PresentationSessionMessage> output; 62 scoped_ptr<content::PresentationSessionMessage> output;
62 switch (input->type) { 63 switch (input->type) {
63 case interfaces::RouteMessage::Type::TYPE_TEXT: { 64 case interfaces::RouteMessage::Type::TYPE_TEXT: {
64 DCHECK(!input->message.is_null()); 65 DCHECK(!input->message.is_null());
65 DCHECK(input->data.is_null()); 66 DCHECK(input->data.is_null());
66 output = content::PresentationSessionMessage::CreateStringMessage( 67 output.reset(new content::PresentationSessionMessage(
67 presentation_url, presentation_id, make_scoped_ptr(new std::string)); 68 content::PresentationMessageType::TEXT));
68 input->message.Swap(output->message.get()); 69 input->message.Swap(&output->message);
69 return output.Pass(); 70 return output.Pass();
70 } 71 }
71 case interfaces::RouteMessage::Type::TYPE_BINARY: { 72 case interfaces::RouteMessage::Type::TYPE_BINARY: {
72 DCHECK(!input->data.is_null()); 73 DCHECK(!input->data.is_null());
73 DCHECK(input->message.is_null()); 74 DCHECK(input->message.is_null());
74 output = content::PresentationSessionMessage::CreateArrayBufferMessage( 75 output.reset(new content::PresentationSessionMessage(
75 presentation_url, presentation_id, 76 content::PresentationMessageType::ARRAY_BUFFER));
76 make_scoped_ptr(new std::vector<uint8_t>)); 77 output->data.reset(new std::vector<uint8_t>);
77 input->data.Swap(output->data.get()); 78 input->data.Swap(output->data.get());
78 return output.Pass(); 79 return output.Pass();
79 } 80 }
80 } 81 }
81 82
82 NOTREACHED() << "Invalid route message type " << input->type; 83 NOTREACHED() << "Invalid route message type " << input->type;
83 return output.Pass(); 84 return output.Pass();
84 } 85 }
85 86
86 } // namespace 87 } // namespace
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 const MediaSource::Id& source_id, 195 const MediaSource::Id& source_id,
195 const MediaSink::Id& sink_id, 196 const MediaSink::Id& sink_id,
196 const GURL& origin, 197 const GURL& origin,
197 int tab_id, 198 int tab_id,
198 const std::vector<MediaRouteResponseCallback>& callbacks) { 199 const std::vector<MediaRouteResponseCallback>& callbacks) {
199 DCHECK(thread_checker_.CalledOnValidThread()); 200 DCHECK(thread_checker_.CalledOnValidThread());
200 201
201 if (!origin.is_valid()) { 202 if (!origin.is_valid()) {
202 DVLOG_WITH_INSTANCE(1) << "Invalid origin: " << origin; 203 DVLOG_WITH_INSTANCE(1) << "Invalid origin: " << origin;
203 for (const MediaRouteResponseCallback& callback : callbacks) 204 for (const MediaRouteResponseCallback& callback : callbacks)
204 callback.Run(nullptr, "Invalid origin"); 205 callback.Run(nullptr, "", "Invalid origin");
205 return; 206 return;
206 } 207 }
207 RunOrDefer(base::Bind( 208 RunOrDefer(base::Bind(
208 &MediaRouterMojoImpl::DoCreateRoute, base::Unretained(this), source_id, 209 &MediaRouterMojoImpl::DoCreateRoute, base::Unretained(this), source_id,
209 sink_id, origin.is_empty() ? "" : origin.spec(), tab_id, callbacks)); 210 sink_id, origin.is_empty() ? "" : origin.spec(), tab_id, callbacks));
210 } 211 }
211 212
212 void MediaRouterMojoImpl::JoinRoute( 213 void MediaRouterMojoImpl::JoinRoute(
213 const MediaSource::Id& source_id, 214 const MediaSource::Id& source_id,
214 const std::string& presentation_id, 215 const std::string& presentation_id,
215 const GURL& origin, 216 const GURL& origin,
216 int tab_id, 217 int tab_id,
217 const std::vector<MediaRouteResponseCallback>& callbacks) { 218 const std::vector<MediaRouteResponseCallback>& callbacks) {
218 DCHECK(thread_checker_.CalledOnValidThread()); 219 DCHECK(thread_checker_.CalledOnValidThread());
219 220
220 if (!origin.is_valid()) { 221 if (!origin.is_valid()) {
221 DVLOG_WITH_INSTANCE(1) << "Invalid origin: " << origin; 222 DVLOG_WITH_INSTANCE(1) << "Invalid origin: " << origin;
222 for (const MediaRouteResponseCallback& callback : callbacks) 223 for (const MediaRouteResponseCallback& callback : callbacks)
223 callback.Run(nullptr, "Invalid origin"); 224 callback.Run(nullptr, "", "Invalid origin");
224 return; 225 return;
225 } 226 }
226 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoJoinRoute, 227 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoJoinRoute,
227 base::Unretained(this), source_id, presentation_id, 228 base::Unretained(this), source_id, presentation_id,
228 origin.is_empty() ? "" : origin.spec(), tab_id, 229 origin.is_empty() ? "" : origin.spec(), tab_id,
229 callbacks)); 230 callbacks));
230 } 231 }
231 232
232 void MediaRouterMojoImpl::CloseRoute(const MediaRoute::Id& route_id) { 233 void MediaRouterMojoImpl::CloseRoute(const MediaRoute::Id& route_id) {
233 DCHECK(thread_checker_.CalledOnValidThread()); 234 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 16 matching lines...) Expand all
250 const MediaRoute::Id& route_id, 251 const MediaRoute::Id& route_id,
251 scoped_ptr<std::vector<uint8>> data, 252 scoped_ptr<std::vector<uint8>> data,
252 const SendRouteMessageCallback& callback) { 253 const SendRouteMessageCallback& callback) {
253 DCHECK(thread_checker_.CalledOnValidThread()); 254 DCHECK(thread_checker_.CalledOnValidThread());
254 255
255 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSendSessionBinaryMessage, 256 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSendSessionBinaryMessage,
256 base::Unretained(this), route_id, 257 base::Unretained(this), route_id,
257 base::Passed(data.Pass()), callback)); 258 base::Passed(data.Pass()), callback));
258 } 259 }
259 260
260 void MediaRouterMojoImpl::ListenForRouteMessages(
261 const std::vector<MediaRoute::Id>& route_ids,
262 const PresentationSessionMessageCallback& message_cb) {
263 DCHECK(thread_checker_.CalledOnValidThread());
264 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoListenForRouteMessages,
265 base::Unretained(this), route_ids, message_cb));
266 }
267
268 void MediaRouterMojoImpl::ClearIssue(const Issue::Id& issue_id) { 261 void MediaRouterMojoImpl::ClearIssue(const Issue::Id& issue_id) {
269 DCHECK(thread_checker_.CalledOnValidThread()); 262 DCHECK(thread_checker_.CalledOnValidThread());
270 issue_manager_.ClearIssue(issue_id); 263 issue_manager_.ClearIssue(issue_id);
271 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoClearIssue, 264 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoClearIssue,
272 base::Unretained(this), issue_id)); 265 base::Unretained(this), issue_id));
273 } 266 }
274 267
275 void MediaRouterMojoImpl::RegisterMediaSinksObserver( 268 void MediaRouterMojoImpl::RegisterMediaSinksObserver(
276 MediaSinksObserver* observer) { 269 MediaSinksObserver* observer) {
277 DCHECK(thread_checker_.CalledOnValidThread()); 270 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 15 matching lines...) Expand all
293 // TODO(imcheng): Implement caching. (crbug.com/492451) 286 // TODO(imcheng): Implement caching. (crbug.com/492451)
294 observer_list->AddObserver(observer); 287 observer_list->AddObserver(observer);
295 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks, 288 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks,
296 base::Unretained(this), source_id)); 289 base::Unretained(this), source_id));
297 } 290 }
298 291
299 void MediaRouterMojoImpl::UnregisterMediaSinksObserver( 292 void MediaRouterMojoImpl::UnregisterMediaSinksObserver(
300 MediaSinksObserver* observer) { 293 MediaSinksObserver* observer) {
301 DCHECK(thread_checker_.CalledOnValidThread()); 294 DCHECK(thread_checker_.CalledOnValidThread());
302 295
303 const std::string& source_id = observer->source().id(); 296 const MediaSource::Id& source_id = observer->source().id();
304 auto* observer_list = sinks_observers_.get(source_id); 297 auto* observer_list = sinks_observers_.get(source_id);
305 if (!observer_list || !observer_list->HasObserver(observer)) { 298 if (!observer_list || !observer_list->HasObserver(observer)) {
306 return; 299 return;
307 } 300 }
308 301
309 // If we are removing the final observer for the source, then stop 302 // If we are removing the final observer for the source, then stop
310 // observing sinks for it. 303 // observing sinks for it.
311 // might_have_observers() is reliable here on the assumption that this call 304 // might_have_observers() is reliable here on the assumption that this call
312 // is not inside the ObserverList iteration. 305 // is not inside the ObserverList iteration.
313 observer_list->RemoveObserver(observer); 306 observer_list->RemoveObserver(observer);
(...skipping 29 matching lines...) Expand all
343 void MediaRouterMojoImpl::RegisterIssuesObserver(IssuesObserver* observer) { 336 void MediaRouterMojoImpl::RegisterIssuesObserver(IssuesObserver* observer) {
344 DCHECK(thread_checker_.CalledOnValidThread()); 337 DCHECK(thread_checker_.CalledOnValidThread());
345 issue_manager_.RegisterObserver(observer); 338 issue_manager_.RegisterObserver(observer);
346 } 339 }
347 340
348 void MediaRouterMojoImpl::UnregisterIssuesObserver(IssuesObserver* observer) { 341 void MediaRouterMojoImpl::UnregisterIssuesObserver(IssuesObserver* observer) {
349 DCHECK(thread_checker_.CalledOnValidThread()); 342 DCHECK(thread_checker_.CalledOnValidThread());
350 issue_manager_.UnregisterObserver(observer); 343 issue_manager_.UnregisterObserver(observer);
351 } 344 }
352 345
346 void MediaRouterMojoImpl::RegisterPresentationSessionMessagesObserver(
347 PresentationSessionMessagesObserver* observer) {
348 DCHECK(thread_checker_.CalledOnValidThread());
349 DCHECK(observer);
350 const MediaRoute::Id& route_id = observer->route_id();
351 auto* observer_list = messages_observers_.get(route_id);
352 if (!observer_list) {
353 observer_list = new base::ObserverList<PresentationSessionMessagesObserver>;
354 messages_observers_.add(route_id, make_scoped_ptr(observer_list));
355 } else {
356 DCHECK(!observer_list->HasObserver(observer));
357 }
358
359 bool should_listen = !observer_list->might_have_observers();
360 observer_list->AddObserver(observer);
361 if (should_listen) {
362 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoListenForRouteMessages,
363 base::Unretained(this), route_id));
364 }
365 }
366
367 void MediaRouterMojoImpl::UnregisterPresentationSessionMessagesObserver(
368 PresentationSessionMessagesObserver* observer) {
369 DCHECK(thread_checker_.CalledOnValidThread());
370 DCHECK(observer);
371
372 const MediaRoute::Id& route_id = observer->route_id();
373 auto* observer_list = messages_observers_.get(route_id);
374 if (!observer_list || !observer_list->HasObserver(observer))
375 return;
376
377 observer_list->RemoveObserver(observer);
378 if (!observer_list->might_have_observers())
379 messages_observers_.erase(route_id);
380 // Note that if we are still listening for messages for that route, we will
381 // stop the next time |OnRouteMessagesReceived| is invoked.
382 // TODO(imcheng): Queue a task to stop listening for messages (by asking
mark a. foltz 2015/08/04 23:47:02 It seems like the scenario when an observer is unr
imcheng 2015/08/05 21:38:35 Yes. The issue here is mojo callbacks cannot be dr
383 // the extension to invoke |OnRouteMessagesReceived| with empty list) here.
384 }
385
353 void MediaRouterMojoImpl::DoCreateRoute( 386 void MediaRouterMojoImpl::DoCreateRoute(
354 const MediaSource::Id& source_id, 387 const MediaSource::Id& source_id,
355 const MediaSink::Id& sink_id, 388 const MediaSink::Id& sink_id,
356 const std::string& origin, 389 const std::string& origin,
357 int tab_id, 390 int tab_id,
358 const std::vector<MediaRouteResponseCallback>& callbacks) { 391 const std::vector<MediaRouteResponseCallback>& callbacks) {
359 std::string presentation_id("mr_"); 392 std::string presentation_id("mr_");
360 presentation_id += base::GenerateGUID(); 393 presentation_id += base::GenerateGUID();
361 DVLOG_WITH_INSTANCE(1) << "DoCreateRoute " << source_id << "=>" << sink_id 394 DVLOG_WITH_INSTANCE(1) << "DoCreateRoute " << source_id << "=>" << sink_id
362 << ", presentation ID: " << presentation_id; 395 << ", presentation ID: " << presentation_id;
363 media_route_provider_->CreateRoute( 396 media_route_provider_->CreateRoute(
364 source_id, sink_id, presentation_id, origin, tab_id, 397 source_id, sink_id, presentation_id, origin, tab_id,
365 base::Bind(&RouteResponseReceived, callbacks)); 398 base::Bind(&RouteResponseReceived, presentation_id, callbacks));
366 } 399 }
367 400
368 void MediaRouterMojoImpl::DoJoinRoute( 401 void MediaRouterMojoImpl::DoJoinRoute(
369 const MediaSource::Id& source_id, 402 const MediaSource::Id& source_id,
370 const std::string& presentation_id, 403 const std::string& presentation_id,
371 const std::string& origin, 404 const std::string& origin,
372 int tab_id, 405 int tab_id,
373 const std::vector<MediaRouteResponseCallback>& callbacks) { 406 const std::vector<MediaRouteResponseCallback>& callbacks) {
374 DVLOG_WITH_INSTANCE(1) << "DoJoinRoute " << source_id 407 DVLOG_WITH_INSTANCE(1) << "DoJoinRoute " << source_id
375 << ", presentation ID: " << presentation_id; 408 << ", presentation ID: " << presentation_id;
376 media_route_provider_->JoinRoute( 409 media_route_provider_->JoinRoute(
377 source_id, presentation_id, origin, tab_id, 410 source_id, presentation_id, origin, tab_id,
378 base::Bind(&RouteResponseReceived, callbacks)); 411 base::Bind(&RouteResponseReceived, presentation_id, callbacks));
379 } 412 }
380 413
381 void MediaRouterMojoImpl::DoCloseRoute(const MediaRoute::Id& route_id) { 414 void MediaRouterMojoImpl::DoCloseRoute(const MediaRoute::Id& route_id) {
382 DVLOG_WITH_INSTANCE(1) << "DoCloseRoute " << route_id; 415 DVLOG_WITH_INSTANCE(1) << "DoCloseRoute " << route_id;
383 media_route_provider_->CloseRoute(route_id); 416 media_route_provider_->CloseRoute(route_id);
384 } 417 }
385 418
386 void MediaRouterMojoImpl::DoSendSessionMessage( 419 void MediaRouterMojoImpl::DoSendSessionMessage(
387 const MediaRoute::Id& route_id, 420 const MediaRoute::Id& route_id,
388 const std::string& message, 421 const std::string& message,
389 const SendRouteMessageCallback& callback) { 422 const SendRouteMessageCallback& callback) {
390 DVLOG_WITH_INSTANCE(1) << "SendRouteMessage " << route_id; 423 DVLOG_WITH_INSTANCE(1) << "SendRouteMessage " << route_id;
391 media_route_provider_->SendRouteMessage(route_id, message, callback); 424 media_route_provider_->SendRouteMessage(route_id, message, callback);
392 } 425 }
393 426
394 void MediaRouterMojoImpl::DoSendSessionBinaryMessage( 427 void MediaRouterMojoImpl::DoSendSessionBinaryMessage(
395 const MediaRoute::Id& route_id, 428 const MediaRoute::Id& route_id,
396 scoped_ptr<std::vector<uint8>> data, 429 scoped_ptr<std::vector<uint8>> data,
397 const SendRouteMessageCallback& callback) { 430 const SendRouteMessageCallback& callback) {
398 DVLOG_WITH_INSTANCE(1) << "SendRouteBinaryMessage " << route_id; 431 DVLOG_WITH_INSTANCE(1) << "SendRouteBinaryMessage " << route_id;
399 mojo::Array<uint8> mojo_array; 432 mojo::Array<uint8> mojo_array;
400 mojo_array.Swap(data.get()); 433 mojo_array.Swap(data.get());
401 media_route_provider_->SendRouteBinaryMessage(route_id, mojo_array.Pass(), 434 media_route_provider_->SendRouteBinaryMessage(route_id, mojo_array.Pass(),
402 callback); 435 callback);
403 } 436 }
404 437
405 void MediaRouterMojoImpl::DoListenForRouteMessages( 438 void MediaRouterMojoImpl::DoListenForRouteMessages(
406 const std::vector<MediaRoute::Id>& route_ids, 439 const MediaRoute::Id& route_id) {
407 const PresentationSessionMessageCallback& message_cb) {
408 DVLOG_WITH_INSTANCE(1) << "ListenForRouteMessages"; 440 DVLOG_WITH_INSTANCE(1) << "ListenForRouteMessages";
409 media_route_provider_->ListenForRouteMessages( 441 if (!ContainsValue(listening_messages_for_routes_, route_id)) {
410 mojo::Array<mojo::String>::From(route_ids), 442 listening_messages_for_routes_.insert(route_id);
mark a. foltz 2015/08/04 23:47:02 It seems like listening_messages_for_routes_ is th
imcheng 2015/08/05 21:38:35 They are most of the time. However adding the obse
411 base::Bind(&MediaRouterMojoImpl::OnRouteMessageReceived, 443 media_route_provider_->ListenForRouteMessages(
412 base::Unretained(this), message_cb)); 444 route_id, base::Bind(&MediaRouterMojoImpl::OnRouteMessagesReceived,
445 base::Unretained(this), route_id));
446 }
413 } 447 }
414 448
415 void MediaRouterMojoImpl::OnRouteMessageReceived( 449 void MediaRouterMojoImpl::OnRouteMessagesReceived(
416 const PresentationSessionMessageCallback& message_cb, 450 const MediaRoute::Id& route_id,
417 mojo::Array<interfaces::RouteMessagePtr> messages) { 451 mojo::Array<interfaces::RouteMessagePtr> messages) {
418 scoped_ptr<ScopedVector<content::PresentationSessionMessage>> 452 DVLOG(1) << "OnRouteMessagesReceived";
419 session_messages(new ScopedVector<content::PresentationSessionMessage>()); 453
454 // Empty |messages| means there are no more messages for that route, so we
455 // can stop listening.
mark a. foltz 2015/08/04 23:47:02 See my comment above, why do we need an extra prot
imcheng 2015/08/05 21:38:35 Okay, I reworked this a little bit. When the last
456 if (messages.storage().empty()) {
457 DVLOG(2) << "Received empty messages for " << route_id;
458 listening_messages_for_routes_.erase(route_id);
459 return;
460 }
461
462 // Check if there are any observers remaining. If not, the messages
463 // can be discarded and we can stop listening for the next batch of messages.
464 auto* observer_list = messages_observers_.get(route_id);
465 if (!observer_list) {
466 listening_messages_for_routes_.erase(route_id);
467 return;
468 }
469
470 ScopedVector<content::PresentationSessionMessage> session_messages;
471 session_messages.reserve(messages.size());
420 for (size_t i = 0; i < messages.size(); ++i) { 472 for (size_t i = 0; i < messages.size(); ++i) {
421 session_messages->push_back( 473 session_messages.push_back(
422 ConvertToPresentationSessionMessage(messages[i].Pass()).Pass()); 474 ConvertToPresentationSessionMessage(messages[i].Pass()).Pass());
423 } 475 }
424 message_cb.Run(session_messages.Pass()); 476
477 FOR_EACH_OBSERVER(PresentationSessionMessagesObserver, *observer_list,
478 OnMessagesReceived(session_messages));
479
480 // Listen for more messages.
481 media_route_provider_->ListenForRouteMessages(
482 route_id, base::Bind(&MediaRouterMojoImpl::OnRouteMessagesReceived,
483 base::Unretained(this), route_id));
425 } 484 }
426 485
427 void MediaRouterMojoImpl::DoClearIssue(const Issue::Id& issue_id) { 486 void MediaRouterMojoImpl::DoClearIssue(const Issue::Id& issue_id) {
428 DVLOG_WITH_INSTANCE(1) << "DoClearIssue " << issue_id; 487 DVLOG_WITH_INSTANCE(1) << "DoClearIssue " << issue_id;
429 media_route_provider_->ClearIssue(issue_id); 488 media_route_provider_->ClearIssue(issue_id);
430 } 489 }
431 490
432 void MediaRouterMojoImpl::DoStartObservingMediaSinks( 491 void MediaRouterMojoImpl::DoStartObservingMediaSinks(
433 const MediaSource::Id& source_id) { 492 const MediaSource::Id& source_id) {
434 DVLOG_WITH_INSTANCE(1) << "DoStartObservingMediaSinks: " << source_id; 493 DVLOG_WITH_INSTANCE(1) << "DoStartObservingMediaSinks: " << source_id;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 return; 554 return;
496 } 555 }
497 556
498 for (const auto& next_request : pending_requests_) 557 for (const auto& next_request : pending_requests_)
499 next_request.Run(); 558 next_request.Run();
500 559
501 pending_requests_.clear(); 560 pending_requests_.clear();
502 } 561 }
503 562
504 } // namespace media_router 563 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698