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

Side by Side Diff: chrome/browser/media/router/discovery/media_sink_internal.cc

Issue 2675033002: [Media Router] Add MediaSink subtypes (Closed)
Patch Set: depend on net::IPAddress typemap patch Created 3 years, 9 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
(Empty)
1 // Copyright 2017 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
5 #include "chrome/browser/media/router/discovery/media_sink_internal.h"
6
7 #include "base/logging.h"
8 #include "base/strings/string_util.h"
9
10 namespace media_router {
11
12 MediaSinkInternal::MediaSinkInternal(const MediaSink& sink)
13 : sink_(sink), sink_type_(SinkType::GENERIC) {}
14
15 MediaSinkInternal::MediaSinkInternal(const MediaSink& sink,
16 const DialSinkExtraData& dial_data)
17 : sink_(sink), sink_type_(SinkType::DIAL) {
18 dial_data_.Init(dial_data);
19 }
20
21 MediaSinkInternal::MediaSinkInternal(const MediaSink& sink,
22 const CastSinkExtraData& cast_data)
23 : sink_(sink), sink_type_(SinkType::CAST) {
24 cast_data_.Init(cast_data);
25 }
26
27 MediaSinkInternal::MediaSinkInternal() : sink_type_(SinkType::GENERIC) {}
28
29 MediaSinkInternal::MediaSinkInternal(const MediaSinkInternal& other) {
30 InternalCopyConstructFrom(other);
31 }
32
33 MediaSinkInternal::~MediaSinkInternal() {
34 InternalCleanup();
35 }
36
37 MediaSinkInternal& MediaSinkInternal::operator=(
38 const MediaSinkInternal& other) {
39 if (this != &other) {
mark a. foltz 2017/03/13 17:47:24 The conversion to union seems to require all this
zhaobin 2017/03/14 01:23:23 dcheng@ suggests that .mojom should be consistent
40 if (sink_type_ == other.sink_type_) {
41 InternalCopyAssignFrom(other);
42 } else {
43 InternalCleanup();
44 InternalCopyConstructFrom(other);
45 }
46 }
47
48 return *this;
49 }
50
51 bool MediaSinkInternal::operator==(const MediaSinkInternal& other) const {
52 if (sink_type_ != other.sink_type_)
53 return false;
54
55 if (!(sink_ == other.sink_))
imcheng 2017/03/11 00:33:08 Can this just use MediaSink::Equals?
mark a. foltz 2017/03/13 17:47:24 Equals() methods are discouraged vs. operator==.
zhaobin 2017/03/14 01:23:23 Acknowledged.
zhaobin 2017/03/14 01:23:23 MediaSink::Equals only compares IDs. Here we want
56 return false;
57
58 switch (sink_type_) {
59 case SinkType::DIAL:
60 return *dial_data_ == *(other.dial_data_);
61 case SinkType::CAST:
62 return *cast_data_ == *(other.cast_data_);
63 case SinkType::GENERIC:
64 return true;
65 }
66 NOTREACHED();
imcheng 2017/03/11 00:33:08 Hmm.. I thought you'd still have to have a return
zhaobin 2017/03/14 01:23:23 Done.
67 }
68
69 void MediaSinkInternal::set_sink(const MediaSink& sink) {
70 sink_ = sink;
71 }
72
73 void MediaSinkInternal::set_dial_data(const DialSinkExtraData& dial_data) {
imcheng 2017/03/11 00:33:08 Is there a case set_*_data would be called more th
zhaobin 2017/03/14 01:23:23 I think it is valid to call set_dial_data() multip
74 InternalCleanup();
75
76 sink_type_ = SinkType::DIAL;
77 dial_data_.Init(dial_data);
78 }
79
80 const DialSinkExtraData& MediaSinkInternal::dial_data() const {
81 DCHECK(is_dial_sink());
82 return *dial_data_;
83 }
84
85 void MediaSinkInternal::set_cast_data(const CastSinkExtraData& cast_data) {
86 InternalCleanup();
87
88 sink_type_ = SinkType::CAST;
89 cast_data_.Init(cast_data);
90 }
91
92 const CastSinkExtraData& MediaSinkInternal::cast_data() const {
93 DCHECK(is_cast_sink());
94 return *cast_data_;
95 }
96
97 // static
98 bool MediaSinkInternal::IsValidSinkId(const std::string& sink_id) {
99 if (sink_id.empty() || !base::IsStringASCII(sink_id)) {
100 DLOG(WARNING) << "Invalid [sink_id]: " << sink_id;
101 return false;
102 }
103
104 return true;
105 }
106
107 void MediaSinkInternal::InternalCopyAssignFrom(const MediaSinkInternal& other) {
108 sink_ = other.sink_;
109 sink_type_ = other.sink_type_;
110
111 switch (sink_type_) {
112 case SinkType::DIAL:
113 *dial_data_ = *other.dial_data_;
114 return;
115 case SinkType::CAST:
116 *cast_data_ = *other.cast_data_;
117 return;
118 case SinkType::GENERIC:
119 return;
120 }
121 NOTREACHED();
122 }
123
124 void MediaSinkInternal::InternalCopyConstructFrom(
125 const MediaSinkInternal& other) {
126 sink_ = other.sink_;
127 sink_type_ = other.sink_type_;
128
129 switch (sink_type_) {
130 case SinkType::DIAL:
131 dial_data_.Init(*other.dial_data_);
132 return;
133 case SinkType::CAST:
134 cast_data_.Init(*other.cast_data_);
135 return;
136 case SinkType::GENERIC:
137 return;
138 }
139 NOTREACHED();
140 }
141
142 void MediaSinkInternal::InternalCleanup() {
143 switch (sink_type_) {
144 case SinkType::DIAL:
145 dial_data_.Destroy();
146 return;
147 case SinkType::CAST:
148 cast_data_.Destroy();
149 return;
150 case SinkType::GENERIC:
151 return;
152 }
153 NOTREACHED();
154 }
155
156 DialSinkExtraData::DialSinkExtraData() = default;
157 DialSinkExtraData::DialSinkExtraData(const DialSinkExtraData& other) = default;
158 DialSinkExtraData::~DialSinkExtraData() = default;
159
160 bool DialSinkExtraData::operator==(const DialSinkExtraData& other) const {
161 return ip_address == other.ip_address && model_name == other.model_name &&
162 app_url == other.app_url;
163 }
164
165 CastSinkExtraData::CastSinkExtraData() = default;
166 CastSinkExtraData::CastSinkExtraData(const CastSinkExtraData& other) = default;
167 CastSinkExtraData::~CastSinkExtraData() = default;
168
169 bool CastSinkExtraData::operator==(const CastSinkExtraData& other) const {
170 return ip_address == other.ip_address && model_name == other.model_name &&
171 capabilities == other.capabilities &&
172 cast_channel_id == other.cast_channel_id;
173 }
174
175 } // namespace media_router
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698