OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/edk/system/node_channel.h" | 5 #include "mojo/edk/system/node_channel.h" |
6 | 6 |
7 #include <cstring> | 7 #include <cstring> |
8 #include <limits> | 8 #include <limits> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 return t + (k - (t % k)) % k; | 22 return t + (k - (t % k)) % k; |
23 } | 23 } |
24 | 24 |
25 enum class MessageType : uint32_t { | 25 enum class MessageType : uint32_t { |
26 ACCEPT_CHILD, | 26 ACCEPT_CHILD, |
27 ACCEPT_PARENT, | 27 ACCEPT_PARENT, |
28 ADD_BROKER_CLIENT, | 28 ADD_BROKER_CLIENT, |
29 BROKER_CLIENT_ADDED, | 29 BROKER_CLIENT_ADDED, |
30 ACCEPT_BROKER_CLIENT, | 30 ACCEPT_BROKER_CLIENT, |
31 PORTS_MESSAGE, | 31 PORTS_MESSAGE, |
32 REQUEST_PORT_CONNECTION, | 32 REQUEST_PORT_MERGE, |
33 CONNECT_TO_PORT, | |
34 REQUEST_INTRODUCTION, | 33 REQUEST_INTRODUCTION, |
35 INTRODUCE, | 34 INTRODUCE, |
36 #if defined(OS_WIN) | 35 #if defined(OS_WIN) |
37 RELAY_PORTS_MESSAGE, | 36 RELAY_PORTS_MESSAGE, |
38 #endif | 37 #endif |
39 }; | 38 }; |
40 | 39 |
41 struct Header { | 40 struct Header { |
42 MessageType type; | 41 MessageType type; |
43 uint32_t padding; | 42 uint32_t padding; |
(...skipping 23 matching lines...) Expand all Loading... |
67 }; | 66 }; |
68 | 67 |
69 // This data may be followed by a platform channel handle to the broker. If not, | 68 // This data may be followed by a platform channel handle to the broker. If not, |
70 // then the parent is the broker and its channel should be used as such. | 69 // then the parent is the broker and its channel should be used as such. |
71 struct AcceptBrokerClientData { | 70 struct AcceptBrokerClientData { |
72 ports::NodeName broker_name; | 71 ports::NodeName broker_name; |
73 }; | 72 }; |
74 | 73 |
75 // This is followed by arbitrary payload data which is interpreted as a token | 74 // This is followed by arbitrary payload data which is interpreted as a token |
76 // string for port location. | 75 // string for port location. |
77 struct RequestPortConnectionData { | 76 struct RequestPortMergeData { |
78 ports::PortName connector_port_name; | 77 ports::PortName connector_port_name; |
79 }; | 78 }; |
80 | 79 |
81 struct ConnectToPortData { | |
82 ports::PortName connector_port_name; | |
83 ports::PortName connectee_port_name; | |
84 }; | |
85 | |
86 // Used for both REQUEST_INTRODUCTION and INTRODUCE. | 80 // Used for both REQUEST_INTRODUCTION and INTRODUCE. |
87 // | 81 // |
88 // For INTRODUCE the message also includes a valid platform handle for a channel | 82 // For INTRODUCE the message also includes a valid platform handle for a channel |
89 // the receiver may use to communicate with the named node directly, or an | 83 // the receiver may use to communicate with the named node directly, or an |
90 // invalid platform handle if the node is unknown to the sender or otherwise | 84 // invalid platform handle if the node is unknown to the sender or otherwise |
91 // cannot be introduced. | 85 // cannot be introduced. |
92 struct IntroductionData { | 86 struct IntroductionData { |
93 ports::NodeName name; | 87 ports::NodeName name; |
94 }; | 88 }; |
95 | 89 |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 handles->size(), &data); | 254 handles->size(), &data); |
261 message->SetHandles(std::move(handles)); | 255 message->SetHandles(std::move(handles)); |
262 data->broker_name = broker_name; | 256 data->broker_name = broker_name; |
263 WriteChannelMessage(std::move(message)); | 257 WriteChannelMessage(std::move(message)); |
264 } | 258 } |
265 | 259 |
266 void NodeChannel::PortsMessage(Channel::MessagePtr message) { | 260 void NodeChannel::PortsMessage(Channel::MessagePtr message) { |
267 WriteChannelMessage(std::move(message)); | 261 WriteChannelMessage(std::move(message)); |
268 } | 262 } |
269 | 263 |
270 void NodeChannel::RequestPortConnection( | 264 void NodeChannel::RequestPortMerge(const ports::PortName& connector_port_name, |
271 const ports::PortName& connector_port_name, | 265 const std::string& token) { |
272 const std::string& token) { | 266 RequestPortMergeData* data; |
273 RequestPortConnectionData* data; | |
274 Channel::MessagePtr message = CreateMessage( | 267 Channel::MessagePtr message = CreateMessage( |
275 MessageType::REQUEST_PORT_CONNECTION, | 268 MessageType::REQUEST_PORT_MERGE, |
276 sizeof(RequestPortConnectionData) + token.size(), 0, &data); | 269 sizeof(RequestPortMergeData) + token.size(), 0, &data); |
277 data->connector_port_name = connector_port_name; | 270 data->connector_port_name = connector_port_name; |
278 memcpy(data + 1, token.data(), token.size()); | 271 memcpy(data + 1, token.data(), token.size()); |
279 WriteChannelMessage(std::move(message)); | 272 WriteChannelMessage(std::move(message)); |
280 } | 273 } |
281 | 274 |
282 void NodeChannel::ConnectToPort(const ports::PortName& connector_port_name, | |
283 const ports::PortName& connectee_port_name) { | |
284 ConnectToPortData* data; | |
285 Channel::MessagePtr message = CreateMessage( | |
286 MessageType::CONNECT_TO_PORT, sizeof(ConnectToPortData), 0, &data); | |
287 data->connector_port_name = connector_port_name; | |
288 data->connectee_port_name = connectee_port_name; | |
289 WriteChannelMessage(std::move(message)); | |
290 } | |
291 | |
292 void NodeChannel::RequestIntroduction(const ports::NodeName& name) { | 275 void NodeChannel::RequestIntroduction(const ports::NodeName& name) { |
293 IntroductionData* data; | 276 IntroductionData* data; |
294 Channel::MessagePtr message = CreateMessage( | 277 Channel::MessagePtr message = CreateMessage( |
295 MessageType::REQUEST_INTRODUCTION, sizeof(IntroductionData), 0, &data); | 278 MessageType::REQUEST_INTRODUCTION, sizeof(IntroductionData), 0, &data); |
296 data->name = name; | 279 data->name = name; |
297 WriteChannelMessage(std::move(message)); | 280 WriteChannelMessage(std::move(message)); |
298 } | 281 } |
299 | 282 |
300 void NodeChannel::Introduce(const ports::NodeName& name, | 283 void NodeChannel::Introduce(const ports::NodeName& name, |
301 ScopedPlatformHandle channel_handle) { | 284 ScopedPlatformHandle channel_handle) { |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 case MessageType::PORTS_MESSAGE: { | 428 case MessageType::PORTS_MESSAGE: { |
446 size_t num_handles = handles ? handles->size() : 0; | 429 size_t num_handles = handles ? handles->size() : 0; |
447 Channel::MessagePtr message( | 430 Channel::MessagePtr message( |
448 new Channel::Message(payload_size, num_handles)); | 431 new Channel::Message(payload_size, num_handles)); |
449 message->SetHandles(std::move(handles)); | 432 message->SetHandles(std::move(handles)); |
450 memcpy(message->mutable_payload(), payload, payload_size); | 433 memcpy(message->mutable_payload(), payload, payload_size); |
451 delegate_->OnPortsMessage(std::move(message)); | 434 delegate_->OnPortsMessage(std::move(message)); |
452 break; | 435 break; |
453 } | 436 } |
454 | 437 |
455 case MessageType::REQUEST_PORT_CONNECTION: { | 438 case MessageType::REQUEST_PORT_MERGE: { |
456 const RequestPortConnectionData* data; | 439 const RequestPortMergeData* data; |
457 GetMessagePayload(payload, &data); | 440 GetMessagePayload(payload, &data); |
458 | 441 |
459 const char* token_data = reinterpret_cast<const char*>(data + 1); | 442 const char* token_data = reinterpret_cast<const char*>(data + 1); |
460 const size_t token_size = payload_size - sizeof(*data) - sizeof(Header); | 443 const size_t token_size = payload_size - sizeof(*data) - sizeof(Header); |
461 std::string token(token_data, token_size); | 444 std::string token(token_data, token_size); |
462 | 445 |
463 delegate_->OnRequestPortConnection(remote_node_name_, | 446 delegate_->OnRequestPortMerge(remote_node_name_, |
464 data->connector_port_name, token); | 447 data->connector_port_name, token); |
465 break; | 448 break; |
466 } | 449 } |
467 | 450 |
468 case MessageType::CONNECT_TO_PORT: { | |
469 const ConnectToPortData* data; | |
470 GetMessagePayload(payload, &data); | |
471 delegate_->OnConnectToPort(remote_node_name_, data->connector_port_name, | |
472 data->connectee_port_name); | |
473 break; | |
474 } | |
475 | |
476 case MessageType::REQUEST_INTRODUCTION: { | 451 case MessageType::REQUEST_INTRODUCTION: { |
477 const IntroductionData* data; | 452 const IntroductionData* data; |
478 GetMessagePayload(payload, &data); | 453 GetMessagePayload(payload, &data); |
479 delegate_->OnRequestIntroduction(remote_node_name_, data->name); | 454 delegate_->OnRequestIntroduction(remote_node_name_, data->name); |
480 break; | 455 break; |
481 } | 456 } |
482 | 457 |
483 case MessageType::INTRODUCE: { | 458 case MessageType::INTRODUCE: { |
484 const IntroductionData* data; | 459 const IntroductionData* data; |
485 GetMessagePayload(payload, &data); | 460 GetMessagePayload(payload, &data); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 | 542 |
568 base::AutoLock lock(channel_lock_); | 543 base::AutoLock lock(channel_lock_); |
569 if (!channel_) | 544 if (!channel_) |
570 DLOG(ERROR) << "Dropping message on closed channel."; | 545 DLOG(ERROR) << "Dropping message on closed channel."; |
571 else | 546 else |
572 channel_->Write(std::move(message)); | 547 channel_->Write(std::move(message)); |
573 } | 548 } |
574 | 549 |
575 } // namespace edk | 550 } // namespace edk |
576 } // namespace mojo | 551 } // namespace mojo |
OLD | NEW |