123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // Copyright 2015 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "components/media_router/browser/media_router_base.h"
- #include <string>
- #include "base/bind.h"
- #include "base/check_op.h"
- #include "base/guid.h"
- #include "content/public/browser/browser_thread.h"
- using blink::mojom::PresentationConnectionState;
- namespace media_router {
- MediaRouterBase::~MediaRouterBase() = default;
- base::CallbackListSubscription
- MediaRouterBase::AddPresentationConnectionStateChangedCallback(
- const MediaRoute::Id& route_id,
- const content::PresentationConnectionStateChangedCallback& callback) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- auto& callbacks = presentation_connection_state_callbacks_[route_id];
- if (!callbacks) {
- callbacks = std::make_unique<PresentationConnectionStateChangedCallbacks>();
- callbacks->set_removal_callback(base::BindRepeating(
- &MediaRouterBase::OnPresentationConnectionStateCallbackRemoved,
- base::Unretained(this), route_id));
- }
- return callbacks->Add(callback);
- }
- MediaRouterBase::MediaRouterBase() = default;
- // static
- std::string MediaRouterBase::CreatePresentationId() {
- return "mr_" + base::GenerateGUID();
- }
- void MediaRouterBase::NotifyPresentationConnectionStateChange(
- const MediaRoute::Id& route_id,
- PresentationConnectionState state) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- // We should call NotifyPresentationConnectionClose() for the CLOSED state.
- DCHECK_NE(state, PresentationConnectionState::CLOSED);
- auto it = presentation_connection_state_callbacks_.find(route_id);
- if (it == presentation_connection_state_callbacks_.end())
- return;
- it->second->Notify(content::PresentationConnectionStateChangeInfo(state));
- }
- void MediaRouterBase::NotifyPresentationConnectionClose(
- const MediaRoute::Id& route_id,
- blink::mojom::PresentationConnectionCloseReason reason,
- const std::string& message) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- auto it = presentation_connection_state_callbacks_.find(route_id);
- if (it == presentation_connection_state_callbacks_.end())
- return;
- content::PresentationConnectionStateChangeInfo info(
- PresentationConnectionState::CLOSED);
- info.close_reason = reason;
- info.message = message;
- it->second->Notify(info);
- }
- void MediaRouterBase::OnPresentationConnectionStateCallbackRemoved(
- const MediaRoute::Id& route_id) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- auto it = presentation_connection_state_callbacks_.find(route_id);
- if (it != presentation_connection_state_callbacks_.end() &&
- it->second->empty()) {
- presentation_connection_state_callbacks_.erase(route_id);
- }
- }
- } // namespace media_router
|