blob: 896349a53c01fbbe4b5401a8bbadc0ccfdb3f630 [file] [log] [blame]
// Copyright 2016 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 COMPONENTS_MEDIA_ROUTER_COMMON_MOJOM_MEDIA_ROUTER_MOJOM_TRAITS_H_
#define COMPONENTS_MEDIA_ROUTER_COMMON_MOJOM_MEDIA_ROUTER_MOJOM_TRAITS_H_
#include <string>
#include "components/media_router/common/discovery/media_sink_internal.h"
#include "components/media_router/common/issue.h"
#include "components/media_router/common/mojom/media_router.mojom-shared.h"
#include "components/media_router/common/route_request_result.h"
#include "net/base/ip_endpoint.h"
namespace mojo {
// Issue
template <>
struct EnumTraits<media_router::mojom::Issue_ActionType,
media_router::IssueInfo::Action> {
static media_router::mojom::Issue_ActionType ToMojom(
media_router::IssueInfo::Action action) {
switch (action) {
case media_router::IssueInfo::Action::DISMISS:
return media_router::mojom::Issue_ActionType::DISMISS;
case media_router::IssueInfo::Action::LEARN_MORE:
return media_router::mojom::Issue_ActionType::LEARN_MORE;
}
NOTREACHED() << "Unknown issue action type " << static_cast<int>(action);
return media_router::mojom::Issue_ActionType::DISMISS;
}
static bool FromMojom(media_router::mojom::Issue_ActionType input,
media_router::IssueInfo::Action* output) {
switch (input) {
case media_router::mojom::Issue_ActionType::DISMISS:
*output = media_router::IssueInfo::Action::DISMISS;
return true;
case media_router::mojom::Issue_ActionType::LEARN_MORE:
*output = media_router::IssueInfo::Action::LEARN_MORE;
return true;
}
return false;
}
};
template <>
struct EnumTraits<media_router::mojom::Issue_Severity,
media_router::IssueInfo::Severity> {
static media_router::mojom::Issue_Severity ToMojom(
media_router::IssueInfo::Severity severity) {
switch (severity) {
case media_router::IssueInfo::Severity::FATAL:
return media_router::mojom::Issue_Severity::FATAL;
case media_router::IssueInfo::Severity::WARNING:
return media_router::mojom::Issue_Severity::WARNING;
case media_router::IssueInfo::Severity::NOTIFICATION:
return media_router::mojom::Issue_Severity::NOTIFICATION;
}
NOTREACHED() << "Unknown issue severity " << static_cast<int>(severity);
return media_router::mojom::Issue_Severity::WARNING;
}
static bool FromMojom(media_router::mojom::Issue_Severity input,
media_router::IssueInfo::Severity* output) {
switch (input) {
case media_router::mojom::Issue_Severity::FATAL:
*output = media_router::IssueInfo::Severity::FATAL;
return true;
case media_router::mojom::Issue_Severity::WARNING:
*output = media_router::IssueInfo::Severity::WARNING;
return true;
case media_router::mojom::Issue_Severity::NOTIFICATION:
*output = media_router::IssueInfo::Severity::NOTIFICATION;
return true;
}
return false;
}
};
template <>
struct UnionTraits<media_router::mojom::MediaSinkExtraDataDataView,
media_router::MediaSinkInternal> {
static media_router::mojom::MediaSinkExtraDataDataView::Tag GetTag(
const media_router::MediaSinkInternal& sink);
static bool IsNull(const media_router::MediaSinkInternal& sink) {
return !sink.is_cast_sink() && !sink.is_dial_sink();
}
static void SetToNull(media_router::MediaSinkInternal* out) {}
static const media_router::DialSinkExtraData& dial_media_sink(
const media_router::MediaSinkInternal& sink) {
return sink.dial_data();
}
static const media_router::CastSinkExtraData& cast_media_sink(
const media_router::MediaSinkInternal& sink) {
return sink.cast_data();
}
static bool Read(media_router::mojom::MediaSinkExtraDataDataView data,
media_router::MediaSinkInternal* out);
};
template <>
struct StructTraits<media_router::mojom::DialMediaSinkDataView,
media_router::DialSinkExtraData> {
static const std::string& model_name(
const media_router::DialSinkExtraData& extra_data) {
return extra_data.model_name;
}
static const net::IPAddress& ip_address(
const media_router::DialSinkExtraData& extra_data) {
return extra_data.ip_address;
}
static const GURL& app_url(
const media_router::DialSinkExtraData& extra_data) {
return extra_data.app_url;
}
static bool Read(media_router::mojom::DialMediaSinkDataView data,
media_router::DialSinkExtraData* out);
};
template <>
struct StructTraits<media_router::mojom::CastMediaSinkDataView,
media_router::CastSinkExtraData> {
static const std::string& model_name(
const media_router::CastSinkExtraData& extra_data) {
return extra_data.model_name;
}
static const net::IPEndPoint& ip_endpoint(
const media_router::CastSinkExtraData& extra_data) {
return extra_data.ip_endpoint;
}
static uint8_t capabilities(
const media_router::CastSinkExtraData& extra_data) {
return extra_data.capabilities;
}
static int32_t cast_channel_id(
const media_router::CastSinkExtraData& extra_data) {
return extra_data.cast_channel_id;
}
static bool Read(media_router::mojom::CastMediaSinkDataView data,
media_router::CastSinkExtraData* out);
};
template <>
struct StructTraits<media_router::mojom::IssueDataView,
media_router::IssueInfo> {
static bool Read(media_router::mojom::IssueDataView data,
media_router::IssueInfo* out);
static const std::string& route_id(const media_router::IssueInfo& issue) {
return issue.route_id;
}
static const std::string& sink_id(const media_router::IssueInfo& issue) {
return issue.sink_id;
}
static media_router::IssueInfo::Severity severity(
const media_router::IssueInfo& issue) {
return issue.severity;
}
static bool is_blocking(const media_router::IssueInfo& issue) {
return issue.is_blocking;
}
static const std::string& title(const media_router::IssueInfo& issue) {
return issue.title;
}
static const std::string& message(const media_router::IssueInfo& issue) {
return issue.message;
}
static media_router::IssueInfo::Action default_action(
const media_router::IssueInfo& issue) {
return issue.default_action;
}
static const std::vector<media_router::IssueInfo::Action>& secondary_actions(
const media_router::IssueInfo& issue) {
return issue.secondary_actions;
}
static int32_t help_page_id(const media_router::IssueInfo& issue) {
return issue.help_page_id;
}
};
// MediaSink
template <>
struct EnumTraits<media_router::mojom::SinkIconType,
media_router::SinkIconType> {
static media_router::mojom::SinkIconType ToMojom(
media_router::SinkIconType icon_type) {
switch (icon_type) {
case media_router::SinkIconType::CAST:
return media_router::mojom::SinkIconType::CAST;
case media_router::SinkIconType::CAST_AUDIO_GROUP:
return media_router::mojom::SinkIconType::CAST_AUDIO_GROUP;
case media_router::SinkIconType::CAST_AUDIO:
return media_router::mojom::SinkIconType::CAST_AUDIO;
case media_router::SinkIconType::WIRED_DISPLAY:
return media_router::mojom::SinkIconType::WIRED_DISPLAY;
case media_router::SinkIconType::GENERIC:
return media_router::mojom::SinkIconType::GENERIC;
case media_router::SinkIconType::TOTAL_COUNT:
break;
}
NOTREACHED() << "Unknown sink icon type " << static_cast<int>(icon_type);
return media_router::mojom::SinkIconType::GENERIC;
}
static bool FromMojom(media_router::mojom::SinkIconType input,
media_router::SinkIconType* output) {
switch (input) {
case media_router::mojom::SinkIconType::CAST:
*output = media_router::SinkIconType::CAST;
return true;
case media_router::mojom::SinkIconType::CAST_AUDIO_GROUP:
*output = media_router::SinkIconType::CAST_AUDIO_GROUP;
return true;
case media_router::mojom::SinkIconType::CAST_AUDIO:
*output = media_router::SinkIconType::CAST_AUDIO;
return true;
case media_router::mojom::SinkIconType::WIRED_DISPLAY:
*output = media_router::SinkIconType::WIRED_DISPLAY;
return true;
case media_router::mojom::SinkIconType::GENERIC:
*output = media_router::SinkIconType::GENERIC;
return true;
}
return false;
}
};
template <>
struct StructTraits<media_router::mojom::MediaSinkDataView,
media_router::MediaSinkInternal> {
static bool Read(media_router::mojom::MediaSinkDataView data,
media_router::MediaSinkInternal* out);
static const std::string& sink_id(
const media_router::MediaSinkInternal& sink_internal) {
return sink_internal.sink().id();
}
static const std::string& name(
const media_router::MediaSinkInternal& sink_internal) {
return sink_internal.sink().name();
}
static const base::Optional<std::string>& description(
const media_router::MediaSinkInternal& sink_internal) {
return sink_internal.sink().description();
}
static const base::Optional<std::string>& domain(
const media_router::MediaSinkInternal& sink_internal) {
return sink_internal.sink().domain();
}
static media_router::SinkIconType icon_type(
const media_router::MediaSinkInternal& sink_internal) {
return sink_internal.sink().icon_type();
}
static media_router::MediaRouteProviderId provider_id(
const media_router::MediaSinkInternal& sink_internal) {
return sink_internal.sink().provider_id();
}
static const media_router::MediaSinkInternal& extra_data(
const media_router::MediaSinkInternal& sink_internal) {
return sink_internal;
}
};
// MediaRoute
template <>
struct EnumTraits<media_router::mojom::RouteControllerType,
media_router::RouteControllerType> {
static media_router::mojom::RouteControllerType ToMojom(
media_router::RouteControllerType controller_type) {
switch (controller_type) {
case media_router::RouteControllerType::kNone:
return media_router::mojom::RouteControllerType::kNone;
case media_router::RouteControllerType::kGeneric:
return media_router::mojom::RouteControllerType::kGeneric;
case media_router::RouteControllerType::kMirroring:
return media_router::mojom::RouteControllerType::kMirroring;
}
NOTREACHED() << "Unknown controller type "
<< static_cast<int>(controller_type);
return media_router::mojom::RouteControllerType::kNone;
}
static bool FromMojom(media_router::mojom::RouteControllerType input,
media_router::RouteControllerType* output) {
switch (input) {
case media_router::mojom::RouteControllerType::kNone:
*output = media_router::RouteControllerType::kNone;
return true;
case media_router::mojom::RouteControllerType::kGeneric:
*output = media_router::RouteControllerType::kGeneric;
return true;
case media_router::mojom::RouteControllerType::kMirroring:
*output = media_router::RouteControllerType::kMirroring;
return true;
}
return false;
}
};
template <>
struct StructTraits<media_router::mojom::MediaRouteDataView,
media_router::MediaRoute> {
static bool Read(media_router::mojom::MediaRouteDataView data,
media_router::MediaRoute* out);
static const std::string& media_route_id(
const media_router::MediaRoute& route) {
return route.media_route_id();
}
static const std::string& presentation_id(
const media_router::MediaRoute& route) {
return route.presentation_id();
}
static base::Optional<std::string> media_source(
const media_router::MediaRoute& route) {
// TODO(imcheng): If we ever convert from C++ to Mojo outside of unit tests,
// it would be better to make the |media_source_| field on MediaRoute a
// base::Optional<MediaSource::Id> instead so it can be returned directly
// here.
return route.media_source().id().empty()
? base::Optional<std::string>()
: base::make_optional(route.media_source().id());
}
static const std::string& media_sink_id(
const media_router::MediaRoute& route) {
return route.media_sink_id();
}
static const std::string& media_sink_name(
const media_router::MediaRoute& route) {
return route.media_sink_name();
}
static const std::string& description(const media_router::MediaRoute& route) {
return route.description();
}
static bool is_local(const media_router::MediaRoute& route) {
return route.is_local();
}
static media_router::RouteControllerType controller_type(
const media_router::MediaRoute& route) {
return route.controller_type();
}
static bool for_display(const media_router::MediaRoute& route) {
return route.for_display();
}
static bool is_off_the_record(const media_router::MediaRoute& route) {
return route.is_off_the_record();
}
static bool is_local_presentation(const media_router::MediaRoute& route) {
return route.is_local_presentation();
}
};
// RouteRequestResultCode
template <>
struct EnumTraits<media_router::mojom::RouteRequestResultCode,
media_router::RouteRequestResult::ResultCode> {
static media_router::mojom::RouteRequestResultCode ToMojom(
media_router::RouteRequestResult::ResultCode code) {
switch (code) {
case media_router::RouteRequestResult::UNKNOWN_ERROR:
return media_router::mojom::RouteRequestResultCode::UNKNOWN_ERROR;
case media_router::RouteRequestResult::OK:
return media_router::mojom::RouteRequestResultCode::OK;
case media_router::RouteRequestResult::TIMED_OUT:
return media_router::mojom::RouteRequestResultCode::TIMED_OUT;
case media_router::RouteRequestResult::ROUTE_NOT_FOUND:
return media_router::mojom::RouteRequestResultCode::ROUTE_NOT_FOUND;
case media_router::RouteRequestResult::SINK_NOT_FOUND:
return media_router::mojom::RouteRequestResultCode::SINK_NOT_FOUND;
case media_router::RouteRequestResult::INVALID_ORIGIN:
return media_router::mojom::RouteRequestResultCode::INVALID_ORIGIN;
case media_router::RouteRequestResult::OFF_THE_RECORD_MISMATCH:
return media_router::mojom::RouteRequestResultCode::
OFF_THE_RECORD_MISMATCH;
case media_router::RouteRequestResult::NO_SUPPORTED_PROVIDER:
return media_router::mojom::RouteRequestResultCode::
NO_SUPPORTED_PROVIDER;
case media_router::RouteRequestResult::CANCELLED:
return media_router::mojom::RouteRequestResultCode::CANCELLED;
case media_router::RouteRequestResult::ROUTE_ALREADY_EXISTS:
return media_router::mojom::RouteRequestResultCode::
ROUTE_ALREADY_EXISTS;
case media_router::RouteRequestResult::DESKTOP_PICKER_FAILED:
return media_router::mojom::RouteRequestResultCode::
DESKTOP_PICKER_FAILED;
case media_router::RouteRequestResult::ROUTE_ALREADY_TERMINATED:
return media_router::mojom::RouteRequestResultCode::
ROUTE_ALREADY_TERMINATED;
default:
NOTREACHED() << "Unknown RouteRequestResultCode "
<< static_cast<int>(code);
return media_router::mojom::RouteRequestResultCode::UNKNOWN_ERROR;
}
}
static bool FromMojom(media_router::mojom::RouteRequestResultCode input,
media_router::RouteRequestResult::ResultCode* output) {
switch (input) {
case media_router::mojom::RouteRequestResultCode::UNKNOWN_ERROR:
*output = media_router::RouteRequestResult::UNKNOWN_ERROR;
return true;
case media_router::mojom::RouteRequestResultCode::OK:
*output = media_router::RouteRequestResult::OK;
return true;
case media_router::mojom::RouteRequestResultCode::TIMED_OUT:
*output = media_router::RouteRequestResult::TIMED_OUT;
return true;
case media_router::mojom::RouteRequestResultCode::ROUTE_NOT_FOUND:
*output = media_router::RouteRequestResult::ROUTE_NOT_FOUND;
return true;
case media_router::mojom::RouteRequestResultCode::SINK_NOT_FOUND:
*output = media_router::RouteRequestResult::SINK_NOT_FOUND;
return true;
case media_router::mojom::RouteRequestResultCode::INVALID_ORIGIN:
*output = media_router::RouteRequestResult::INVALID_ORIGIN;
return true;
case media_router::mojom::RouteRequestResultCode::OFF_THE_RECORD_MISMATCH:
*output = media_router::RouteRequestResult::OFF_THE_RECORD_MISMATCH;
return true;
case media_router::mojom::RouteRequestResultCode::NO_SUPPORTED_PROVIDER:
*output = media_router::RouteRequestResult::NO_SUPPORTED_PROVIDER;
return true;
case media_router::mojom::RouteRequestResultCode::CANCELLED:
*output = media_router::RouteRequestResult::CANCELLED;
return true;
case media_router::mojom::RouteRequestResultCode::ROUTE_ALREADY_EXISTS:
*output = media_router::RouteRequestResult::ROUTE_ALREADY_EXISTS;
return true;
case media_router::mojom::RouteRequestResultCode::DESKTOP_PICKER_FAILED:
*output = media_router::RouteRequestResult::DESKTOP_PICKER_FAILED;
return true;
case media_router::mojom::RouteRequestResultCode::
ROUTE_ALREADY_TERMINATED:
*output = media_router::RouteRequestResult::ROUTE_ALREADY_TERMINATED;
return true;
}
return false;
}
};
// MediaRouteProvider
template <>
struct EnumTraits<media_router::mojom::MediaRouteProvider_Id,
media_router::MediaRouteProviderId> {
static media_router::mojom::MediaRouteProvider_Id ToMojom(
media_router::MediaRouteProviderId provider_id) {
switch (provider_id) {
case media_router::MediaRouteProviderId::EXTENSION:
return media_router::mojom::MediaRouteProvider_Id::EXTENSION;
case media_router::MediaRouteProviderId::WIRED_DISPLAY:
return media_router::mojom::MediaRouteProvider_Id::WIRED_DISPLAY;
case media_router::MediaRouteProviderId::CAST:
return media_router::mojom::MediaRouteProvider_Id::CAST;
case media_router::MediaRouteProviderId::DIAL:
return media_router::mojom::MediaRouteProvider_Id::DIAL;
case media_router::MediaRouteProviderId::ANDROID_CAF:
return media_router::mojom::MediaRouteProvider_Id::ANDROID_CAF;
case media_router::MediaRouteProviderId::TEST:
return media_router::mojom::MediaRouteProvider_Id::TEST;
case media_router::MediaRouteProviderId::UNKNOWN:
break;
}
NOTREACHED() << "Invalid MediaRouteProvider_Id: "
<< static_cast<int>(provider_id);
return media_router::mojom::MediaRouteProvider_Id::EXTENSION;
}
static bool FromMojom(media_router::mojom::MediaRouteProvider_Id input,
media_router::MediaRouteProviderId* provider_id) {
switch (input) {
case media_router::mojom::MediaRouteProvider_Id::EXTENSION:
*provider_id = media_router::MediaRouteProviderId::EXTENSION;
return true;
case media_router::mojom::MediaRouteProvider_Id::WIRED_DISPLAY:
*provider_id = media_router::MediaRouteProviderId::WIRED_DISPLAY;
return true;
case media_router::mojom::MediaRouteProvider_Id::CAST:
*provider_id = media_router::MediaRouteProviderId::CAST;
return true;
case media_router::mojom::MediaRouteProvider_Id::DIAL:
*provider_id = media_router::MediaRouteProviderId::DIAL;
return true;
case media_router::mojom::MediaRouteProvider_Id::ANDROID_CAF:
*provider_id = media_router::MediaRouteProviderId::ANDROID_CAF;
return true;
case media_router::mojom::MediaRouteProvider_Id::TEST:
*provider_id = media_router::MediaRouteProviderId::TEST;
return true;
}
return false;
}
};
} // namespace mojo
#endif // COMPONENTS_MEDIA_ROUTER_COMMON_MOJOM_MEDIA_ROUTER_MOJOM_TRAITS_H_