Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(767)

Side by Side Diff: chrome/browser/extensions/api/cast_channel/cast_message_util.cc

Issue 395333003: Extensions: Move cast_channel and hid APIs to extensions/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 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 "chrome/browser/extensions/api/cast_channel/cast_message_util.h"
6
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/values.h"
11 #include "chrome/browser/extensions/api/cast_channel/cast_channel.pb.h"
12 #include "chrome/common/extensions/api/cast_channel.h"
13
14 namespace {
15 static const char kAuthNamespace[] =
16 "urn:x-cast:com.google.cast.tp.deviceauth";
17 // Sender and receiver IDs to use for platform messages.
18 static const char kPlatformSenderId[] = "sender-0";
19 static const char kPlatformReceiverId[] = "receiver-0";
20 } // namespace
21
22 namespace extensions {
23 namespace api {
24 namespace cast_channel {
25
26 bool MessageInfoToCastMessage(const MessageInfo& message,
27 CastMessage* message_proto) {
28 DCHECK(message_proto);
29 if (!message.data)
30 return false;
31
32 message_proto->set_protocol_version(CastMessage_ProtocolVersion_CASTV2_1_0);
33 message_proto->set_source_id(message.source_id);
34 message_proto->set_destination_id(message.destination_id);
35 message_proto->set_namespace_(message.namespace_);
36 // Determine the type of the base::Value and set the message payload
37 // appropriately.
38 std::string data;
39 base::BinaryValue* real_value;
40 switch (message.data->GetType()) {
41 // JS string
42 case base::Value::TYPE_STRING:
43 if (message.data->GetAsString(&data)) {
44 message_proto->set_payload_type(CastMessage_PayloadType_STRING);
45 message_proto->set_payload_utf8(data);
46 }
47 break;
48 // JS ArrayBuffer
49 case base::Value::TYPE_BINARY:
50 real_value = static_cast<base::BinaryValue*>(message.data.get());
51 if (real_value->GetBuffer()) {
52 message_proto->set_payload_type(CastMessage_PayloadType_BINARY);
53 message_proto->set_payload_binary(real_value->GetBuffer(),
54 real_value->GetSize());
55 }
56 break;
57 default:
58 // Unknown value type. message_proto will remain uninitialized because
59 // payload_type is unset.
60 break;
61 }
62 return message_proto->IsInitialized();
63 }
64
65 bool CastMessageToMessageInfo(const CastMessage& message_proto,
66 MessageInfo* message) {
67 DCHECK(message);
68 message->source_id = message_proto.source_id();
69 message->destination_id = message_proto.destination_id();
70 message->namespace_ = message_proto.namespace_();
71 // Determine the type of the payload and fill base::Value appropriately.
72 scoped_ptr<base::Value> value;
73 switch (message_proto.payload_type()) {
74 case CastMessage_PayloadType_STRING:
75 if (message_proto.has_payload_utf8())
76 value.reset(new base::StringValue(message_proto.payload_utf8()));
77 break;
78 case CastMessage_PayloadType_BINARY:
79 if (message_proto.has_payload_binary())
80 value.reset(base::BinaryValue::CreateWithCopiedBuffer(
81 message_proto.payload_binary().data(),
82 message_proto.payload_binary().size()));
83 break;
84 default:
85 // Unknown payload type. value will remain unset.
86 break;
87 }
88 if (value.get()) {
89 DCHECK(!message->data.get());
90 message->data.reset(value.release());
91 return true;
92 } else {
93 return false;
94 }
95 }
96
97 std::string CastMessageToString(const CastMessage& message_proto) {
98 std::string out("{");
99 out += "namespace = " + message_proto.namespace_();
100 out += ", sourceId = " + message_proto.source_id();
101 out += ", destId = " + message_proto.destination_id();
102 out += ", type = " + base::IntToString(message_proto.payload_type());
103 out += ", str = \"" + message_proto.payload_utf8() + "\"}";
104 return out;
105 }
106
107 std::string AuthMessageToString(const DeviceAuthMessage& message) {
108 std::string out("{");
109 if (message.has_challenge()) {
110 out += "challenge: {}, ";
111 }
112 if (message.has_response()) {
113 out += "response: {signature: (";
114 out += base::UintToString(message.response().signature().length());
115 out += " bytes), certificate: (";
116 out += base::UintToString(
117 message.response().client_auth_certificate().length());
118 out += " bytes)}";
119 }
120 if (message.has_error()) {
121 out += ", error: {";
122 out += base::IntToString(message.error().error_type());
123 out += "}";
124 }
125 out += "}";
126 return out;
127 }
128
129 void CreateAuthChallengeMessage(CastMessage* message_proto) {
130 CHECK(message_proto);
131 DeviceAuthMessage auth_message;
132 auth_message.mutable_challenge();
133 std::string auth_message_string;
134 auth_message.SerializeToString(&auth_message_string);
135
136 message_proto->set_protocol_version(CastMessage_ProtocolVersion_CASTV2_1_0);
137 message_proto->set_source_id(kPlatformSenderId);
138 message_proto->set_destination_id(kPlatformReceiverId);
139 message_proto->set_namespace_(kAuthNamespace);
140 message_proto->set_payload_type(CastMessage_PayloadType_BINARY);
141 message_proto->set_payload_binary(auth_message_string);
142 }
143
144 bool IsAuthMessage(const CastMessage& message) {
145 return message.namespace_() == kAuthNamespace;
146 }
147
148 } // namespace cast_channel
149 } // namespace api
150 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698