123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // Copyright 2018 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.
- #ifndef CHROMECAST_BROWSER_CAST_SESSION_ID_MAP_H_
- #define CHROMECAST_BROWSER_CAST_SESSION_ID_MAP_H_
- #include <memory>
- #include <string>
- #include <utility>
- #include "base/containers/flat_map.h"
- #include "base/no_destructor.h"
- #include "base/sequence_checker.h"
- #include "base/task/sequenced_task_runner.h"
- #include "base/unguessable_token.h"
- #include "chromecast/media/audio/cast_audio_manager_helper.h"
- namespace base {
- class SequencedTaskRunner;
- } // namespace base
- namespace content {
- class WebContents;
- } // namespace content
- namespace chromecast {
- namespace shell {
- class CastSessionIdMap : public media::CastAudioManagerHelper::Delegate {
- public:
- // Retrieve the map instance. The first time this is called, a task runner can
- // be specified for the instance to run on. Any subsequent calls to this
- // function will return the same map instance, but will not change the task
- // runner.
- // This must be called for the first time on the browser main thread.
- static CastSessionIdMap* GetInstance(
- base::SequencedTaskRunner* task_runner = nullptr);
- CastSessionIdMap(const CastSessionIdMap&) = delete;
- CastSessionIdMap& operator=(const CastSessionIdMap&) = delete;
- // Map a session id to a particular group id in the provided WebContents.
- // Record whether the session is an audio only session.
- // Can be called on any thread.
- void SetAppProperties(std::string session_id,
- bool is_audio_app,
- content::WebContents* web_contents);
- // Record whether the session is launched in a group.
- // Can be called on any thread.
- void SetGroupInfo(std::string session_id, bool is_group);
- // CastAudioManagerHelper::Delegate implementation:
- // Fetch the session id that is mapped to the provided group_id. Defaults to
- // empty string if the mapping is not found.
- // Must be called on the sequence for |task_runner_|.
- std::string GetSessionId(const std::string& group_id) override;
- // Fetch whether the session is an audio only session based on the provided
- // session id. Defaults to false if the mapping is not found.
- // Must be called on the sequence for |task_runner_|.
- bool IsAudioOnlySession(const std::string& session_id) override;
- // Fetch whether the session is launched in a group based on the provided
- // session id. Defaults to false if the mapping is not found.
- // Must be called on the sequence for |task_runner_|.
- bool IsGroup(const std::string& session_id) override;
- private:
- class GroupObserver;
- friend class base::NoDestructor<CastSessionIdMap>;
- explicit CastSessionIdMap(base::SequencedTaskRunner* task_runner);
- ~CastSessionIdMap() override;
- // Callback for the group being destroyed.
- void OnGroupDestroyed(base::UnguessableToken group_id);
- // Removes the mapping between group_id and session_id and release the
- // GroupObserver. This must not be called in the group destructor callback,
- // because it releases the GroupObserver who owns the destuctor callback.
- void RemoveGroupId(base::UnguessableToken group_id);
- // Maps the session id for the provided group id.
- // Record whether the session is an audio only session.
- // This call be called on any thread.
- void SetAppPropertiesInternal(std::string session_id,
- bool is_audio_app,
- base::UnguessableToken group_id,
- std::unique_ptr<GroupObserver> group_observer);
- base::flat_map<
- std::string,
- std::pair<std::string /* group_id */, std::unique_ptr<GroupObserver>>>
- mapping_;
- base::flat_map<std::string /* session_id */, bool /* is_audio_app */>
- application_capability_mapping_;
- base::flat_map<std::string /* session_id */, bool /* is_group */>
- group_info_mapping_;
- base::SequencedTaskRunner* const task_runner_;
- SEQUENCE_CHECKER(sequence_checker_);
- };
- } // namespace shell
- } // namespace chromecast
- #endif // CHROMECAST_BROWSER_CAST_SESSION_ID_MAP_H_
|