OLD | NEW |
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/mojo/media_router_mojo_impl.h" | 5 #include "chrome/browser/media/router/mojo/media_router_mojo_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 if (!observer_list) { | 591 if (!observer_list) { |
592 observer_list = new base::ObserverList<PresentationSessionMessagesObserver>; | 592 observer_list = new base::ObserverList<PresentationSessionMessagesObserver>; |
593 messages_observers_.add(route_id, base::WrapUnique(observer_list)); | 593 messages_observers_.add(route_id, base::WrapUnique(observer_list)); |
594 } else { | 594 } else { |
595 DCHECK(!observer_list->HasObserver(observer)); | 595 DCHECK(!observer_list->HasObserver(observer)); |
596 } | 596 } |
597 | 597 |
598 bool should_listen = !observer_list->might_have_observers(); | 598 bool should_listen = !observer_list->might_have_observers(); |
599 observer_list->AddObserver(observer); | 599 observer_list->AddObserver(observer); |
600 if (should_listen) { | 600 if (should_listen) { |
601 RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoListenForRouteMessages, | 601 SetWakeReason( |
602 base::Unretained(this), route_id)); | 602 MediaRouteProviderWakeReason::START_LISTENING_FOR_ROUTE_MESSAGES); |
| 603 RunOrDefer( |
| 604 base::Bind(&MediaRouterMojoImpl::DoStartListeningForRouteMessages, |
| 605 base::Unretained(this), route_id)); |
603 } | 606 } |
604 } | 607 } |
605 | 608 |
606 void MediaRouterMojoImpl::UnregisterPresentationSessionMessagesObserver( | 609 void MediaRouterMojoImpl::UnregisterPresentationSessionMessagesObserver( |
607 PresentationSessionMessagesObserver* observer) { | 610 PresentationSessionMessagesObserver* observer) { |
608 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 611 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
609 DCHECK(observer); | 612 DCHECK(observer); |
610 | 613 |
611 const MediaRoute::Id& route_id = observer->route_id(); | 614 const MediaRoute::Id& route_id = observer->route_id(); |
612 auto* observer_list = messages_observers_.get(route_id); | 615 auto* observer_list = messages_observers_.get(route_id); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 const MediaRoute::Id& route_id, | 708 const MediaRoute::Id& route_id, |
706 std::unique_ptr<std::vector<uint8_t>> data, | 709 std::unique_ptr<std::vector<uint8_t>> data, |
707 const SendRouteMessageCallback& callback) { | 710 const SendRouteMessageCallback& callback) { |
708 DVLOG_WITH_INSTANCE(1) << "SendRouteBinaryMessage " << route_id; | 711 DVLOG_WITH_INSTANCE(1) << "SendRouteBinaryMessage " << route_id; |
709 mojo::Array<uint8_t> mojo_array; | 712 mojo::Array<uint8_t> mojo_array; |
710 mojo_array.Swap(data.get()); | 713 mojo_array.Swap(data.get()); |
711 media_route_provider_->SendRouteBinaryMessage(route_id, std::move(mojo_array), | 714 media_route_provider_->SendRouteBinaryMessage(route_id, std::move(mojo_array), |
712 callback); | 715 callback); |
713 } | 716 } |
714 | 717 |
715 void MediaRouterMojoImpl::DoListenForRouteMessages( | 718 void MediaRouterMojoImpl::DoStartListeningForRouteMessages( |
716 const MediaRoute::Id& route_id) { | 719 const MediaRoute::Id& route_id) { |
717 DVLOG_WITH_INSTANCE(1) << "ListenForRouteMessages"; | 720 DVLOG_WITH_INSTANCE(1) << "DoStartListeningForRouteMessages"; |
718 if (!ContainsValue(route_ids_listening_for_messages_, route_id)) { | 721 media_route_provider_->StartListeningForRouteMessages(route_id); |
719 route_ids_listening_for_messages_.insert(route_id); | |
720 media_route_provider_->ListenForRouteMessages( | |
721 route_id, base::Bind(&MediaRouterMojoImpl::OnRouteMessagesReceived, | |
722 base::Unretained(this), route_id)); | |
723 } | |
724 } | 722 } |
725 | 723 |
726 void MediaRouterMojoImpl::DoStopListeningForRouteMessages( | 724 void MediaRouterMojoImpl::DoStopListeningForRouteMessages( |
727 const MediaRoute::Id& route_id) { | 725 const MediaRoute::Id& route_id) { |
728 DVLOG_WITH_INSTANCE(1) << "StopListeningForRouteMessages"; | 726 DVLOG_WITH_INSTANCE(1) << "StopListeningForRouteMessages"; |
729 | |
730 // No need to erase |route_ids_listening_for_messages_| entry here. | |
731 // It will be removed when there are no more observers by the time | |
732 // |OnRouteMessagesReceived| is invoked. | |
733 media_route_provider_->StopListeningForRouteMessages(route_id); | 727 media_route_provider_->StopListeningForRouteMessages(route_id); |
734 } | 728 } |
735 | 729 |
736 void MediaRouterMojoImpl::DoSearchSinks( | 730 void MediaRouterMojoImpl::DoSearchSinks( |
737 const MediaSink::Id& sink_id, | 731 const MediaSink::Id& sink_id, |
738 const MediaSource::Id& source_id, | 732 const MediaSource::Id& source_id, |
739 const std::string& search_input, | 733 const std::string& search_input, |
740 const std::string& domain, | 734 const std::string& domain, |
741 const MediaSinkSearchResponseCallback& sink_callback) { | 735 const MediaSinkSearchResponseCallback& sink_callback) { |
742 DVLOG_WITH_INSTANCE(1) << "SearchSinks"; | 736 DVLOG_WITH_INSTANCE(1) << "SearchSinks"; |
743 auto sink_search_criteria = interfaces::SinkSearchCriteria::New(); | 737 auto sink_search_criteria = interfaces::SinkSearchCriteria::New(); |
744 sink_search_criteria->input = search_input; | 738 sink_search_criteria->input = search_input; |
745 sink_search_criteria->domain = domain; | 739 sink_search_criteria->domain = domain; |
746 media_route_provider_->SearchSinks( | 740 media_route_provider_->SearchSinks( |
747 sink_id, source_id, std::move(sink_search_criteria), | 741 sink_id, source_id, std::move(sink_search_criteria), |
748 base::Bind(&ForwardSinkSearchCallback, sink_callback)); | 742 base::Bind(&ForwardSinkSearchCallback, sink_callback)); |
749 } | 743 } |
750 | 744 |
751 void MediaRouterMojoImpl::OnRouteMessagesReceived( | 745 void MediaRouterMojoImpl::OnRouteMessagesReceived( |
752 const MediaRoute::Id& route_id, | 746 const mojo::String& route_id, |
753 mojo::Array<interfaces::RouteMessagePtr> messages, | 747 mojo::Array<interfaces::RouteMessagePtr> messages) { |
754 bool error) { | 748 DVLOG_WITH_INSTANCE(1) << "OnRouteMessagesReceived"; |
755 DVLOG(1) << "OnRouteMessagesReceived"; | |
756 | 749 |
757 // If |messages| is null, then no more messages will come from this route. | 750 DCHECK(!messages.storage().empty()); |
758 // We can stop listening. | 751 |
759 if (error) { | 752 auto* observer_list = messages_observers_.get(route_id); |
760 DVLOG(2) << "Encountered error in OnRouteMessagesReceived for " << route_id; | 753 if (!observer_list) { |
761 route_ids_listening_for_messages_.erase(route_id); | |
762 return; | 754 return; |
763 } | 755 } |
764 | 756 |
765 // Check if there are any observers remaining. If not, the messages | 757 ScopedVector<content::PresentationSessionMessage> session_messages; |
766 // can be discarded and we can stop listening for the next batch of messages. | 758 session_messages.reserve(messages.size()); |
767 auto* observer_list = messages_observers_.get(route_id); | 759 for (size_t i = 0; i < messages.size(); ++i) { |
768 if (!observer_list) { | 760 session_messages.push_back( |
769 route_ids_listening_for_messages_.erase(route_id); | 761 ConvertToPresentationSessionMessage(std::move(messages[i]))); |
770 return; | |
771 } | 762 } |
772 | 763 base::ObserverList<PresentationSessionMessagesObserver>::Iterator observer_it( |
773 // If |messages| is empty, then |StopListeningForRouteMessages| was invoked | 764 observer_list); |
774 // but we have added back an observer since. Keep listening for more messages, | 765 bool single_observer = |
775 // but do not notify observers with empty list. | 766 observer_it.GetNext() != nullptr && observer_it.GetNext() == nullptr; |
776 if (!messages.storage().empty()) { | 767 FOR_EACH_OBSERVER(PresentationSessionMessagesObserver, *observer_list, |
777 ScopedVector<content::PresentationSessionMessage> session_messages; | 768 OnMessagesReceived(session_messages, single_observer)); |
778 session_messages.reserve(messages.size()); | |
779 for (size_t i = 0; i < messages.size(); ++i) { | |
780 session_messages.push_back( | |
781 ConvertToPresentationSessionMessage(std::move(messages[i]))); | |
782 } | |
783 base::ObserverList<PresentationSessionMessagesObserver>::Iterator | |
784 observer_it(observer_list); | |
785 bool single_observer = | |
786 observer_it.GetNext() != nullptr && observer_it.GetNext() == nullptr; | |
787 FOR_EACH_OBSERVER(PresentationSessionMessagesObserver, *observer_list, | |
788 OnMessagesReceived(session_messages, single_observer)); | |
789 } | |
790 | |
791 // Listen for more messages. | |
792 media_route_provider_->ListenForRouteMessages( | |
793 route_id, base::Bind(&MediaRouterMojoImpl::OnRouteMessagesReceived, | |
794 base::Unretained(this), route_id)); | |
795 } | 769 } |
796 | 770 |
797 void MediaRouterMojoImpl::OnSinkAvailabilityUpdated( | 771 void MediaRouterMojoImpl::OnSinkAvailabilityUpdated( |
798 SinkAvailability availability) { | 772 SinkAvailability availability) { |
799 if (availability_ == availability) | 773 if (availability_ == availability) |
800 return; | 774 return; |
801 | 775 |
802 availability_ = availability; | 776 availability_ = availability; |
803 if (availability_ == interfaces::MediaRouter::SinkAvailability::UNAVAILABLE) { | 777 if (availability_ == interfaces::MediaRouter::SinkAvailability::UNAVAILABLE) { |
804 // Sinks are no longer available. MRPM has already removed all sink queries. | 778 // Sinks are no longer available. MRPM has already removed all sink queries. |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1039 base::Unretained(this), source_id)); | 1013 base::Unretained(this), source_id)); |
1040 } | 1014 } |
1041 | 1015 |
1042 void MediaRouterMojoImpl::DoUpdateMediaSinks( | 1016 void MediaRouterMojoImpl::DoUpdateMediaSinks( |
1043 const MediaSource::Id& source_id) { | 1017 const MediaSource::Id& source_id) { |
1044 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks" << source_id; | 1018 DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks" << source_id; |
1045 media_route_provider_->UpdateMediaSinks(source_id); | 1019 media_route_provider_->UpdateMediaSinks(source_id); |
1046 } | 1020 } |
1047 | 1021 |
1048 } // namespace media_router | 1022 } // namespace media_router |
OLD | NEW |