xref: /aosp_15_r20/external/openscreen/cast/sender/channel/message_util.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1 // Copyright 2019 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 "cast/sender/channel/message_util.h"
6 
7 #include "cast/sender/channel/cast_auth_util.h"
8 #include "util/json/json_serialization.h"
9 
10 namespace openscreen {
11 namespace cast {
12 
13 using ::cast::channel::AuthChallenge;
14 using ::cast::channel::CastMessage;
15 using ::cast::channel::DeviceAuthMessage;
16 
CreateAuthChallengeMessage(const AuthContext & auth_context)17 CastMessage CreateAuthChallengeMessage(const AuthContext& auth_context) {
18   CastMessage message;
19   DeviceAuthMessage auth_message;
20 
21   AuthChallenge* challenge = auth_message.mutable_challenge();
22   challenge->set_sender_nonce(auth_context.nonce());
23   challenge->set_hash_algorithm(::cast::channel::SHA256);
24 
25   std::string auth_message_string;
26   auth_message.SerializeToString(&auth_message_string);
27 
28   message.set_protocol_version(CastMessage::CASTV2_1_0);
29   message.set_source_id(kPlatformSenderId);
30   message.set_destination_id(kPlatformReceiverId);
31   message.set_namespace_(kAuthNamespace);
32   message.set_payload_type(::cast::channel::CastMessage_PayloadType_BINARY);
33   message.set_payload_binary(auth_message_string);
34 
35   return message;
36 }
37 
CreateAppAvailabilityRequest(const std::string & sender_id,int request_id,const std::string & app_id)38 ErrorOr<CastMessage> CreateAppAvailabilityRequest(const std::string& sender_id,
39                                                   int request_id,
40                                                   const std::string& app_id) {
41   Json::Value dict(Json::ValueType::objectValue);
42   dict[kMessageKeyType] = Json::Value(
43       CastMessageTypeToString(CastMessageType::kGetAppAvailability));
44   Json::Value app_id_value(Json::ValueType::arrayValue);
45   app_id_value.append(Json::Value(app_id));
46   dict[kMessageKeyAppId] = std::move(app_id_value);
47   dict[kMessageKeyRequestId] = Json::Value(request_id);
48 
49   CastMessage message;
50   message.set_payload_type(::cast::channel::CastMessage_PayloadType_STRING);
51   ErrorOr<std::string> serialized = json::Stringify(dict);
52   if (serialized.is_error()) {
53     return serialized.error();
54   }
55   message.set_payload_utf8(serialized.value());
56 
57   message.set_protocol_version(
58       ::cast::channel::CastMessage_ProtocolVersion_CASTV2_1_0);
59   message.set_source_id(sender_id);
60   message.set_destination_id(kPlatformReceiverId);
61   message.set_namespace_(kReceiverNamespace);
62 
63   return message;
64 }
65 
66 }  // namespace cast
67 }  // namespace openscreen
68