Index: chrome/browser/media/router/mojo/media_router_struct_traits.cc |
diff --git a/chrome/browser/media/router/mojo/media_router_struct_traits.cc b/chrome/browser/media/router/mojo/media_router_struct_traits.cc |
index d96e3b6dcef05ee5c1b8f1892ce6d97c2e5fbae3..a259ba62f532fe6bd89f04c7d5f35aee0b77af11 100644 |
--- a/chrome/browser/media/router/mojo/media_router_struct_traits.cc |
+++ b/chrome/browser/media/router/mojo/media_router_struct_traits.cc |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include "chrome/browser/media/router/mojo/media_router_struct_traits.h" |
+#include "url/mojo/url_gurl_struct_traits.h" |
namespace mojo { |
@@ -40,4 +41,101 @@ bool StructTraits<media_router::mojom::IssueDataView, media_router::IssueInfo>:: |
return true; |
} |
+// static |
+bool StructTraits<media_router::mojom::MediaSinkDataView, |
+ std::unique_ptr<media_router::MediaSink>>:: |
+ Read(media_router::mojom::MediaSinkDataView data, |
+ std::unique_ptr<media_router::MediaSink>* out) { |
+ media_router::MediaSink::Id id; |
+ if (!data.ReadSinkId(&id)) |
+ return false; |
+ |
+ std::string name; |
+ if (!data.ReadName(&name)) |
+ return false; |
+ |
+ media_router::MediaSink::IconType icon_type; |
+ if (!data.ReadIconType(&icon_type)) |
+ return false; |
+ |
+ std::unique_ptr<media_router::MediaSink> sink; |
+ media_router::mojom::MediaSinkExtraDataDataView extra_data_data_view; |
+ data.GetExtraDataDataView(&extra_data_data_view); |
+ |
+ if (extra_data_data_view.is_null()) { |
imcheng
2017/02/09 02:19:57
We shouldn't be returning non-generic MediaSinks f
|
+ sink = base::MakeUnique<media_router::MediaSink>(id, name, icon_type); |
+ } else if (extra_data_data_view.is_dial_media_sink()) { |
+ sink = base::MakeUnique<media_router::DialMediaSink>(id, name, icon_type); |
+ if (!extra_data_data_view.ReadDialMediaSink(sink.get())) |
+ return false; |
+ } else if (extra_data_data_view.is_cast_media_sink()) { |
+ sink = base::MakeUnique<media_router::CastMediaSink>(id, name, icon_type); |
+ if (!extra_data_data_view.ReadCastMediaSink(sink.get())) |
+ return false; |
+ } |
+ |
+ base::Optional<std::string> description; |
+ if (!data.ReadDescription(&description)) |
+ return false; |
+ |
+ if (description) |
+ sink->set_description(*description); |
+ |
+ base::Optional<std::string> domain; |
+ if (!data.ReadDomain(&domain)) |
+ return false; |
+ |
+ if (domain) |
+ sink->set_domain(*domain); |
+ |
+ base::Optional<std::string> model_name; |
+ if (!data.ReadModelName(&model_name)) |
+ return false; |
+ |
+ if (model_name) |
+ sink->set_model_name(*model_name); |
+ |
+ *out = std::move(sink); |
+ return true; |
+} |
+ |
+// static |
+bool StructTraits<media_router::mojom::DialMediaSinkDataView, |
+ media_router::MediaSink>:: |
+ Read(media_router::mojom::DialMediaSinkDataView data, |
+ media_router::MediaSink* out) { |
+ auto* dial_sink = media_router::DialMediaSink::Cast(out); |
+ |
+ std::string ip_address; |
+ if (!data.ReadIpAddress(&ip_address)) |
+ return false; |
+ dial_sink->set_ip_address(ip_address); |
+ |
+ GURL url; |
+ if (!data.ReadAppUrl(&url)) |
+ return false; |
+ dial_sink->set_app_url(url); |
+ |
+ return true; |
+} |
+ |
+// static |
+bool StructTraits<media_router::mojom::CastMediaSinkDataView, |
+ media_router::MediaSink>:: |
+ Read(media_router::mojom::CastMediaSinkDataView data, |
+ media_router::MediaSink* out) { |
+ auto* cast_sink = media_router::CastMediaSink::Cast(out); |
+ |
+ cast_sink->set_capabilities(data.capabilities()); |
+ |
+ std::string ip_address; |
+ if (!data.ReadIpAddress(&ip_address)) |
+ return false; |
+ cast_sink->set_ip_address(ip_address); |
+ |
+ cast_sink->set_cast_channel_id(data.cast_channel_id()); |
+ |
+ return true; |
+} |
+ |
} // namespace mojo |