1 // Copyright 2020 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/receiver/channel/message_util.h"
6
7 #include "util/json/json_serialization.h"
8 #include "util/json/json_value.h"
9 #include "util/osp_logging.h"
10
11 namespace openscreen {
12 namespace cast {
13
14 using ::cast::channel::CastMessage;
15
16 namespace {
17
CreateAppAvailabilityResponse(int request_id,const std::string & sender_id,const std::string & app_id,AppAvailabilityResult availability_result)18 ErrorOr<CastMessage> CreateAppAvailabilityResponse(
19 int request_id,
20 const std::string& sender_id,
21 const std::string& app_id,
22 AppAvailabilityResult availability_result) {
23 CastMessage availability_response;
24 Json::Value dict(Json::ValueType::objectValue);
25 dict[kMessageKeyRequestId] = request_id;
26 Json::Value availability(Json::ValueType::objectValue);
27 availability[app_id.c_str()] =
28 availability_result == AppAvailabilityResult::kAvailable
29 ? kMessageValueAppAvailable
30 : kMessageValueAppUnavailable;
31 dict[kMessageKeyAvailability] = std::move(availability);
32 ErrorOr<std::string> serialized = json::Stringify(dict);
33 if (!serialized) {
34 return Error::Code::kJsonWriteError;
35 }
36
37 availability_response.set_source_id(kPlatformReceiverId);
38 availability_response.set_destination_id(sender_id);
39 availability_response.set_namespace_(kReceiverNamespace);
40 availability_response.set_protocol_version(
41 ::cast::channel::CastMessage_ProtocolVersion_CASTV2_1_0);
42 availability_response.set_payload_utf8(std::move(serialized.value()));
43 availability_response.set_payload_type(
44 ::cast::channel::CastMessage_PayloadType_STRING);
45 return availability_response;
46 }
47
48 } // namespace
49
CreateAppAvailableResponse(int request_id,const std::string & sender_id,const std::string & app_id)50 ErrorOr<CastMessage> CreateAppAvailableResponse(int request_id,
51 const std::string& sender_id,
52 const std::string& app_id) {
53 return CreateAppAvailabilityResponse(request_id, sender_id, app_id,
54 AppAvailabilityResult::kAvailable);
55 }
56
CreateAppUnavailableResponse(int request_id,const std::string & sender_id,const std::string & app_id)57 ErrorOr<CastMessage> CreateAppUnavailableResponse(int request_id,
58 const std::string& sender_id,
59 const std::string& app_id) {
60 return CreateAppAvailabilityResponse(request_id, sender_id, app_id,
61 AppAvailabilityResult::kUnavailable);
62 }
63
64 } // namespace cast
65 } // namespace openscreen
66