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