xref: /aosp_15_r20/external/openscreen/cast/common/channel/message_util.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef CAST_COMMON_CHANNEL_MESSAGE_UTIL_H_
6*3f982cf4SFabien Sanglard #define CAST_COMMON_CHANNEL_MESSAGE_UTIL_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <string>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include "absl/strings/string_view.h"
11*3f982cf4SFabien Sanglard #include "cast/common/channel/proto/cast_channel.pb.h"
12*3f982cf4SFabien Sanglard #include "util/enum_name_table.h"
13*3f982cf4SFabien Sanglard 
14*3f982cf4SFabien Sanglard namespace Json {
15*3f982cf4SFabien Sanglard class Value;
16*3f982cf4SFabien Sanglard }
17*3f982cf4SFabien Sanglard 
18*3f982cf4SFabien Sanglard namespace openscreen {
19*3f982cf4SFabien Sanglard namespace cast {
20*3f982cf4SFabien Sanglard 
21*3f982cf4SFabien Sanglard // Reserved message namespaces for internal messages.
22*3f982cf4SFabien Sanglard static constexpr char kCastInternalNamespacePrefix[] =
23*3f982cf4SFabien Sanglard     "urn:x-cast:com.google.cast.";
24*3f982cf4SFabien Sanglard static constexpr char kTransportNamespacePrefix[] =
25*3f982cf4SFabien Sanglard     "urn:x-cast:com.google.cast.tp.";
26*3f982cf4SFabien Sanglard static constexpr char kAuthNamespace[] =
27*3f982cf4SFabien Sanglard     "urn:x-cast:com.google.cast.tp.deviceauth";
28*3f982cf4SFabien Sanglard static constexpr char kHeartbeatNamespace[] =
29*3f982cf4SFabien Sanglard     "urn:x-cast:com.google.cast.tp.heartbeat";
30*3f982cf4SFabien Sanglard static constexpr char kConnectionNamespace[] =
31*3f982cf4SFabien Sanglard     "urn:x-cast:com.google.cast.tp.connection";
32*3f982cf4SFabien Sanglard static constexpr char kReceiverNamespace[] =
33*3f982cf4SFabien Sanglard     "urn:x-cast:com.google.cast.receiver";
34*3f982cf4SFabien Sanglard static constexpr char kBroadcastNamespace[] =
35*3f982cf4SFabien Sanglard     "urn:x-cast:com.google.cast.broadcast";
36*3f982cf4SFabien Sanglard static constexpr char kMediaNamespace[] = "urn:x-cast:com.google.cast.media";
37*3f982cf4SFabien Sanglard 
38*3f982cf4SFabien Sanglard // Sender and receiver IDs to use for platform messages.
39*3f982cf4SFabien Sanglard static constexpr char kPlatformSenderId[] = "sender-0";
40*3f982cf4SFabien Sanglard static constexpr char kPlatformReceiverId[] = "receiver-0";
41*3f982cf4SFabien Sanglard 
42*3f982cf4SFabien Sanglard static constexpr char kBroadcastId[] = "*";
43*3f982cf4SFabien Sanglard 
44*3f982cf4SFabien Sanglard static constexpr ::cast::channel::CastMessage_ProtocolVersion
45*3f982cf4SFabien Sanglard     kDefaultOutgoingMessageVersion =
46*3f982cf4SFabien Sanglard         ::cast::channel::CastMessage_ProtocolVersion_CASTV2_1_0;
47*3f982cf4SFabien Sanglard 
48*3f982cf4SFabien Sanglard // JSON message key strings.
49*3f982cf4SFabien Sanglard static constexpr char kMessageKeyType[] = "type";
50*3f982cf4SFabien Sanglard static constexpr char kMessageKeyProtocolVersion[] = "protocolVersion";
51*3f982cf4SFabien Sanglard static constexpr char kMessageKeyProtocolVersionList[] = "protocolVersionList";
52*3f982cf4SFabien Sanglard static constexpr char kMessageKeyReasonCode[] = "reasonCode";
53*3f982cf4SFabien Sanglard static constexpr char kMessageKeyAppId[] = "appId";
54*3f982cf4SFabien Sanglard static constexpr char kMessageKeyRequestId[] = "requestId";
55*3f982cf4SFabien Sanglard static constexpr char kMessageKeyResponseType[] = "responseType";
56*3f982cf4SFabien Sanglard static constexpr char kMessageKeyTransportId[] = "transportId";
57*3f982cf4SFabien Sanglard static constexpr char kMessageKeySessionId[] = "sessionId";
58*3f982cf4SFabien Sanglard 
59*3f982cf4SFabien Sanglard // JSON message field values.
60*3f982cf4SFabien Sanglard static constexpr char kMessageTypeConnect[] = "CONNECT";
61*3f982cf4SFabien Sanglard static constexpr char kMessageTypeClose[] = "CLOSE";
62*3f982cf4SFabien Sanglard static constexpr char kMessageTypeConnected[] = "CONNECTED";
63*3f982cf4SFabien Sanglard static constexpr char kMessageValueAppAvailable[] = "APP_AVAILABLE";
64*3f982cf4SFabien Sanglard static constexpr char kMessageValueAppUnavailable[] = "APP_UNAVAILABLE";
65*3f982cf4SFabien Sanglard 
66*3f982cf4SFabien Sanglard // JSON message key strings specific to CONNECT messages.
67*3f982cf4SFabien Sanglard static constexpr char kMessageKeyBrowserVersion[] = "browserVersion";
68*3f982cf4SFabien Sanglard static constexpr char kMessageKeyConnType[] = "connType";
69*3f982cf4SFabien Sanglard static constexpr char kMessageKeyConnectionType[] = "connectionType";
70*3f982cf4SFabien Sanglard static constexpr char kMessageKeyUserAgent[] = "userAgent";
71*3f982cf4SFabien Sanglard static constexpr char kMessageKeyOrigin[] = "origin";
72*3f982cf4SFabien Sanglard static constexpr char kMessageKeyPlatform[] = "platform";
73*3f982cf4SFabien Sanglard static constexpr char kMessageKeySdkType[] = "skdType";
74*3f982cf4SFabien Sanglard static constexpr char kMessageKeySenderInfo[] = "senderInfo";
75*3f982cf4SFabien Sanglard static constexpr char kMessageKeyVersion[] = "version";
76*3f982cf4SFabien Sanglard 
77*3f982cf4SFabien Sanglard // JSON message key strings specific to application control messages.
78*3f982cf4SFabien Sanglard static constexpr char kMessageKeyAvailability[] = "availability";
79*3f982cf4SFabien Sanglard static constexpr char kMessageKeyAppParams[] = "appParams";
80*3f982cf4SFabien Sanglard static constexpr char kMessageKeyApplications[] = "applications";
81*3f982cf4SFabien Sanglard static constexpr char kMessageKeyControlType[] = "controlType";
82*3f982cf4SFabien Sanglard static constexpr char kMessageKeyDisplayName[] = "displayName";
83*3f982cf4SFabien Sanglard static constexpr char kMessageKeyIsIdleScreen[] = "isIdleScreen";
84*3f982cf4SFabien Sanglard static constexpr char kMessageKeyLaunchedFromCloud[] = "launchedFromCloud";
85*3f982cf4SFabien Sanglard static constexpr char kMessageKeyLevel[] = "level";
86*3f982cf4SFabien Sanglard static constexpr char kMessageKeyMuted[] = "muted";
87*3f982cf4SFabien Sanglard static constexpr char kMessageKeyName[] = "name";
88*3f982cf4SFabien Sanglard static constexpr char kMessageKeyNamespaces[] = "namespaces";
89*3f982cf4SFabien Sanglard static constexpr char kMessageKeyReason[] = "reason";
90*3f982cf4SFabien Sanglard static constexpr char kMessageKeyStatus[] = "status";
91*3f982cf4SFabien Sanglard static constexpr char kMessageKeyStepInterval[] = "stepInterval";
92*3f982cf4SFabien Sanglard static constexpr char kMessageKeyUniversalAppId[] = "universalAppId";
93*3f982cf4SFabien Sanglard static constexpr char kMessageKeyUserEq[] = "userEq";
94*3f982cf4SFabien Sanglard static constexpr char kMessageKeyVolume[] = "volume";
95*3f982cf4SFabien Sanglard 
96*3f982cf4SFabien Sanglard // JSON message field value strings specific to application control messages.
97*3f982cf4SFabien Sanglard static constexpr char kMessageValueAttenuation[] = "attenuation";
98*3f982cf4SFabien Sanglard static constexpr char kMessageValueBadParameter[] = "BAD_PARAMETER";
99*3f982cf4SFabien Sanglard static constexpr char kMessageValueInvalidSessionId[] = "INVALID_SESSION_ID";
100*3f982cf4SFabien Sanglard static constexpr char kMessageValueInvalidCommand[] = "INVALID_COMMAND";
101*3f982cf4SFabien Sanglard static constexpr char kMessageValueNotFound[] = "NOT_FOUND";
102*3f982cf4SFabien Sanglard static constexpr char kMessageValueSystemError[] = "SYSTEM_ERROR";
103*3f982cf4SFabien Sanglard 
104*3f982cf4SFabien Sanglard // TODO(crbug.com/openscreen/111): Add validation that each message type is
105*3f982cf4SFabien Sanglard // received on the correct namespace.  This will probably involve creating a
106*3f982cf4SFabien Sanglard // data structure for mapping between type and namespace.
107*3f982cf4SFabien Sanglard enum class CastMessageType {
108*3f982cf4SFabien Sanglard   // Heartbeat messages.
109*3f982cf4SFabien Sanglard   kPing,
110*3f982cf4SFabien Sanglard   kPong,
111*3f982cf4SFabien Sanglard 
112*3f982cf4SFabien Sanglard   // RPC control/status messages used by Media Remoting. These occur at high
113*3f982cf4SFabien Sanglard   // frequency, up to dozens per second at times, and should not be logged.
114*3f982cf4SFabien Sanglard   kRpc,
115*3f982cf4SFabien Sanglard 
116*3f982cf4SFabien Sanglard   kGetAppAvailability,
117*3f982cf4SFabien Sanglard   kGetStatus,
118*3f982cf4SFabien Sanglard 
119*3f982cf4SFabien Sanglard   // Virtual connection request.
120*3f982cf4SFabien Sanglard   kConnect,
121*3f982cf4SFabien Sanglard 
122*3f982cf4SFabien Sanglard   // Close virtual connection.
123*3f982cf4SFabien Sanglard   kCloseConnection,
124*3f982cf4SFabien Sanglard 
125*3f982cf4SFabien Sanglard   // Application broadcast / precache.
126*3f982cf4SFabien Sanglard   kBroadcast,
127*3f982cf4SFabien Sanglard 
128*3f982cf4SFabien Sanglard   // Session launch request.
129*3f982cf4SFabien Sanglard   kLaunch,
130*3f982cf4SFabien Sanglard 
131*3f982cf4SFabien Sanglard   // Session stop request.
132*3f982cf4SFabien Sanglard   kStop,
133*3f982cf4SFabien Sanglard 
134*3f982cf4SFabien Sanglard   kReceiverStatus,
135*3f982cf4SFabien Sanglard   kMediaStatus,
136*3f982cf4SFabien Sanglard 
137*3f982cf4SFabien Sanglard   // Error from receiver.
138*3f982cf4SFabien Sanglard   kLaunchError,
139*3f982cf4SFabien Sanglard 
140*3f982cf4SFabien Sanglard   kOffer,
141*3f982cf4SFabien Sanglard   kAnswer,
142*3f982cf4SFabien Sanglard   kCapabilitiesResponse,
143*3f982cf4SFabien Sanglard   kStatusResponse,
144*3f982cf4SFabien Sanglard 
145*3f982cf4SFabien Sanglard   // The following values are part of the protocol but are not currently used.
146*3f982cf4SFabien Sanglard   kMultizoneStatus,
147*3f982cf4SFabien Sanglard   kInvalidPlayerState,
148*3f982cf4SFabien Sanglard   kLoadFailed,
149*3f982cf4SFabien Sanglard   kLoadCancelled,
150*3f982cf4SFabien Sanglard   kInvalidRequest,
151*3f982cf4SFabien Sanglard   kPresentation,
152*3f982cf4SFabien Sanglard   kGetCapabilities,
153*3f982cf4SFabien Sanglard 
154*3f982cf4SFabien Sanglard   kOther,  // Add new types above |kOther|.
155*3f982cf4SFabien Sanglard   kMaxValue = kOther,
156*3f982cf4SFabien Sanglard };
157*3f982cf4SFabien Sanglard 
158*3f982cf4SFabien Sanglard enum class AppAvailabilityResult {
159*3f982cf4SFabien Sanglard   kAvailable,
160*3f982cf4SFabien Sanglard   kUnavailable,
161*3f982cf4SFabien Sanglard   kUnknown,
162*3f982cf4SFabien Sanglard };
163*3f982cf4SFabien Sanglard 
164*3f982cf4SFabien Sanglard std::string ToString(AppAvailabilityResult availability);
165*3f982cf4SFabien Sanglard 
166*3f982cf4SFabien Sanglard static const EnumNameTable<CastMessageType, 25> kCastMessageTypeNames{
167*3f982cf4SFabien Sanglard     {{"PING", CastMessageType::kPing},
168*3f982cf4SFabien Sanglard      {"PONG", CastMessageType::kPong},
169*3f982cf4SFabien Sanglard      {"RPC", CastMessageType::kRpc},
170*3f982cf4SFabien Sanglard      {"GET_APP_AVAILABILITY", CastMessageType::kGetAppAvailability},
171*3f982cf4SFabien Sanglard      {"GET_STATUS", CastMessageType::kGetStatus},
172*3f982cf4SFabien Sanglard      {"CONNECT", CastMessageType::kConnect},
173*3f982cf4SFabien Sanglard      {"CLOSE", CastMessageType::kCloseConnection},
174*3f982cf4SFabien Sanglard      {"APPLICATION_BROADCAST", CastMessageType::kBroadcast},
175*3f982cf4SFabien Sanglard      {"LAUNCH", CastMessageType::kLaunch},
176*3f982cf4SFabien Sanglard      {"STOP", CastMessageType::kStop},
177*3f982cf4SFabien Sanglard      {"RECEIVER_STATUS", CastMessageType::kReceiverStatus},
178*3f982cf4SFabien Sanglard      {"MEDIA_STATUS", CastMessageType::kMediaStatus},
179*3f982cf4SFabien Sanglard      {"LAUNCH_ERROR", CastMessageType::kLaunchError},
180*3f982cf4SFabien Sanglard      {"OFFER", CastMessageType::kOffer},
181*3f982cf4SFabien Sanglard      {"ANSWER", CastMessageType::kAnswer},
182*3f982cf4SFabien Sanglard      {"CAPABILITIES_RESPONSE", CastMessageType::kCapabilitiesResponse},
183*3f982cf4SFabien Sanglard      {"STATUS_RESPONSE", CastMessageType::kStatusResponse},
184*3f982cf4SFabien Sanglard      {"MULTIZONE_STATUS", CastMessageType::kMultizoneStatus},
185*3f982cf4SFabien Sanglard      {"INVALID_PLAYER_STATE", CastMessageType::kInvalidPlayerState},
186*3f982cf4SFabien Sanglard      {"LOAD_FAILED", CastMessageType::kLoadFailed},
187*3f982cf4SFabien Sanglard      {"LOAD_CANCELLED", CastMessageType::kLoadCancelled},
188*3f982cf4SFabien Sanglard      {"INVALID_REQUEST", CastMessageType::kInvalidRequest},
189*3f982cf4SFabien Sanglard      {"PRESENTATION", CastMessageType::kPresentation},
190*3f982cf4SFabien Sanglard      {"GET_CAPABILITIES", CastMessageType::kGetCapabilities},
191*3f982cf4SFabien Sanglard      {"OTHER", CastMessageType::kOther}}};
192*3f982cf4SFabien Sanglard 
CastMessageTypeToString(CastMessageType type)193*3f982cf4SFabien Sanglard inline const char* CastMessageTypeToString(CastMessageType type) {
194*3f982cf4SFabien Sanglard   return GetEnumName(kCastMessageTypeNames, type).value("OTHER");
195*3f982cf4SFabien Sanglard }
196*3f982cf4SFabien Sanglard 
IsAuthMessage(const::cast::channel::CastMessage & message)197*3f982cf4SFabien Sanglard inline bool IsAuthMessage(const ::cast::channel::CastMessage& message) {
198*3f982cf4SFabien Sanglard   return message.namespace_() == kAuthNamespace;
199*3f982cf4SFabien Sanglard }
200*3f982cf4SFabien Sanglard 
IsTransportNamespace(absl::string_view namespace_)201*3f982cf4SFabien Sanglard inline bool IsTransportNamespace(absl::string_view namespace_) {
202*3f982cf4SFabien Sanglard   return (namespace_.size() > (sizeof(kTransportNamespacePrefix) - 1)) &&
203*3f982cf4SFabien Sanglard          (namespace_.find_first_of(kTransportNamespacePrefix) == 0);
204*3f982cf4SFabien Sanglard }
205*3f982cf4SFabien Sanglard 
206*3f982cf4SFabien Sanglard ::cast::channel::CastMessage MakeSimpleUTF8Message(
207*3f982cf4SFabien Sanglard     const std::string& namespace_,
208*3f982cf4SFabien Sanglard     std::string payload);
209*3f982cf4SFabien Sanglard 
210*3f982cf4SFabien Sanglard ::cast::channel::CastMessage MakeConnectMessage(
211*3f982cf4SFabien Sanglard     const std::string& source_id,
212*3f982cf4SFabien Sanglard     const std::string& destination_id);
213*3f982cf4SFabien Sanglard ::cast::channel::CastMessage MakeCloseMessage(
214*3f982cf4SFabien Sanglard     const std::string& source_id,
215*3f982cf4SFabien Sanglard     const std::string& destination_id);
216*3f982cf4SFabien Sanglard 
217*3f982cf4SFabien Sanglard // Returns a session/transport ID string that is unique within this application
218*3f982cf4SFabien Sanglard // instance, having the format "prefix-12345". For example, calling this with a
219*3f982cf4SFabien Sanglard // |prefix| of "sender" will result in a string like "sender-12345".
220*3f982cf4SFabien Sanglard std::string MakeUniqueSessionId(const char* prefix);
221*3f982cf4SFabien Sanglard 
222*3f982cf4SFabien Sanglard // Returns true if the type field in |object| is set to the given |type|.
223*3f982cf4SFabien Sanglard bool HasType(const Json::Value& object, CastMessageType type);
224*3f982cf4SFabien Sanglard }  // namespace cast
225*3f982cf4SFabien Sanglard }  // namespace openscreen
226*3f982cf4SFabien Sanglard 
227*3f982cf4SFabien Sanglard #endif  // CAST_COMMON_CHANNEL_MESSAGE_UTIL_H_
228