blob: 05a71cabcbdad7275bf589cbe1bb33c805135948 [file] [log] [blame]
kmarshalld2f3bea2015-03-11 23:42:221// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
takumifa34e51932017-04-19 20:38:005#include "chrome/common/media_router/media_source.h"
kmarshalld2f3bea2015-03-11 23:42:226
John Williamsd48d028c2019-05-23 23:59:127#include <algorithm>
8#include <array>
9#include <cstdio>
John Williamse955a24812019-01-19 01:35:0010#include <ostream>
kmarshalld2f3bea2015-03-11 23:42:2211#include <string>
12
John Williamsd48d028c2019-05-23 23:59:1213#include "base/strings/string_util.h"
14#include "base/strings/stringprintf.h"
15#include "chrome/common/media_router/media_source.h"
16#include "url/gurl.h"
zhaobine1ed84732016-12-20 23:16:3417
kmarshalld2f3bea2015-03-11 23:42:2218namespace media_router {
19
John Williamsd48d028c2019-05-23 23:59:1220namespace {
21
22// Prefixes used to format and detect various protocols' media source URNs.
23// See: https://www.ietf.org/rfc/rfc3406.txt
24constexpr char kTabMediaUrnFormat[] = "urn:x-org.chromium.media:source:tab:%d";
John Williams4c353442019-11-13 23:37:0025constexpr base::StringPiece kDesktopMediaUrnPrefix =
26 "urn:x-org.chromium.media:source:desktop:";
27constexpr base::StringPiece kUnknownDesktopMediaUrn =
28 "urn:x-org.chromium.media:source:desktop";
John Williamsd48d028c2019-05-23 23:59:1229constexpr char kTabRemotingUrnFormat[] =
30 "urn:x-org.chromium.media:source:tab_content_remoting:%d";
31
32// List of non-http(s) schemes that are allowed in a Presentation URL.
33constexpr std::array<const char* const, 5> kAllowedSchemes{
34 {kCastPresentationUrlScheme, kCastDialPresentationUrlScheme,
35 kDialPresentationUrlScheme, kRemotePlaybackPresentationUrlScheme, "test"}};
36
37bool IsSchemeAllowed(const GURL& url) {
38 return url.SchemeIsHTTPOrHTTPS() ||
39 std::any_of(
40 kAllowedSchemes.begin(), kAllowedSchemes.end(),
41 [&url](const char* const scheme) { return url.SchemeIs(scheme); });
42}
43
44} // namespace
45
46bool IsLegacyCastPresentationUrl(const GURL& url) {
47 return base::StartsWith(url.spec(), kLegacyCastPresentationUrlPrefix,
48 base::CompareCase::INSENSITIVE_ASCII);
49}
50
51bool IsValidPresentationUrl(const GURL& url) {
52 return url.is_valid() && IsSchemeAllowed(url);
53}
54
55bool IsAutoJoinPresentationId(const std::string& presentation_id) {
56 return presentation_id == kAutoJoinPresentationId;
57}
58
59MediaSource::MediaSource() = default;
60
kmarshall5fa0263d2015-06-03 16:07:0861MediaSource::MediaSource(const MediaSource::Id& source_id) : id_(source_id) {
zhaobine1ed84732016-12-20 23:16:3462 GURL url(source_id);
63 if (IsValidPresentationUrl(url))
64 url_ = url;
imcheng2ae6fd32015-04-10 17:59:1865}
66
mfoltz7a2c823b2016-10-08 01:35:2467MediaSource::MediaSource(const GURL& presentation_url)
zhaobin81cb26bf2016-12-07 19:42:5568 : id_(presentation_url.spec()), url_(presentation_url) {}
mfoltz7a2c823b2016-10-08 01:35:2469
John Williamsd48d028c2019-05-23 23:59:1270MediaSource::~MediaSource() = default;
kmarshalld2f3bea2015-03-11 23:42:2271
John Williamsd48d028c2019-05-23 23:59:1272// static
73MediaSource MediaSource::ForTab(int tab_id) {
74 return MediaSource(base::StringPrintf(kTabMediaUrnFormat, tab_id));
kmarshalld2f3bea2015-03-11 23:42:2275}
76
John Williamsd48d028c2019-05-23 23:59:1277// static
78MediaSource MediaSource::ForTabContentRemoting(int tab_id) {
79 return MediaSource(base::StringPrintf(kTabRemotingUrnFormat, tab_id));
zhaobin81cb26bf2016-12-07 19:42:5580}
81
John Williamsd48d028c2019-05-23 23:59:1282// static
John Williams4c353442019-11-13 23:37:0083MediaSource MediaSource::ForDesktop(const std::string& desktop_media_id) {
84 return MediaSource(kDesktopMediaUrnPrefix.as_string() + desktop_media_id);
85}
86
87// static
John Williamsd48d028c2019-05-23 23:59:1288MediaSource MediaSource::ForDesktop() {
John Williams4c353442019-11-13 23:37:0089 return MediaSource(kUnknownDesktopMediaUrn.as_string());
imcheng2ae6fd32015-04-10 17:59:1890}
91
John Williamsd48d028c2019-05-23 23:59:1292// static
93MediaSource MediaSource::ForPresentationUrl(const GURL& presentation_url) {
94 return MediaSource(presentation_url);
Bin Zhao3e0c55d2018-03-16 23:40:5195}
96
John Williamsd48d028c2019-05-23 23:59:1297bool MediaSource::IsDesktopMirroringSource() const {
John Williams4c353442019-11-13 23:37:0098 return id() == kUnknownDesktopMediaUrn ||
99 base::StartsWith(id(), kDesktopMediaUrnPrefix,
100 base::CompareCase::SENSITIVE);
John Williamsd48d028c2019-05-23 23:59:12101}
102
103bool MediaSource::IsTabMirroringSource() const {
104 int tab_id;
105 return std::sscanf(id_.c_str(), kTabMediaUrnFormat, &tab_id) == 1 &&
106 tab_id > 0;
107}
108
109bool MediaSource::IsMirroringSource() const {
110 return IsDesktopMirroringSource() || IsTabMirroringSource();
111}
112
113bool MediaSource::IsCastPresentationUrl() const {
114 return url_.SchemeIs(kCastPresentationUrlScheme) ||
115 IsLegacyCastPresentationUrl(url_);
116}
117
118int MediaSource::TabId() const {
119 int tab_id;
120 if (sscanf(id_.c_str(), kTabMediaUrnFormat, &tab_id) == 1)
121 return tab_id;
122 else if (sscanf(id_.c_str(), kTabRemotingUrnFormat, &tab_id) == 1)
123 return tab_id;
124 else
125 return -1;
126}
127
John Williams4c353442019-11-13 23:37:00128base::Optional<std::string> MediaSource::DesktopStreamId() const {
129 if (base::StartsWith(id_, kDesktopMediaUrnPrefix,
130 base::CompareCase::SENSITIVE)) {
131 return std::string(id_.begin() + kDesktopMediaUrnPrefix.size(), id_.end());
132 }
133 return base::nullopt;
134}
135
John Williamsd48d028c2019-05-23 23:59:12136bool MediaSource::IsValid() const {
137 return TabId() > 0 || IsDesktopMirroringSource() ||
138 IsValidPresentationUrl(GURL(id_));
139}
140
141bool MediaSource::IsDialSource() const {
142 return url_.SchemeIs(kCastDialPresentationUrlScheme);
143}
144
145std::string MediaSource::AppNameFromDialSource() const {
146 return IsDialSource() ? url_.path() : "";
147}
imchengab1bf6352017-02-16 03:30:07148
kmarshalld2f3bea2015-03-11 23:42:22149} // namespace media_router