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 29 matching lines...) Expand all Loading... |
40 REQUEST_PORT_MERGE, | 40 REQUEST_PORT_MERGE, |
41 REQUEST_INTRODUCTION, | 41 REQUEST_INTRODUCTION, |
42 INTRODUCE, | 42 INTRODUCE, |
43 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) | 43 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) |
44 RELAY_PORTS_MESSAGE, | 44 RELAY_PORTS_MESSAGE, |
45 #endif | 45 #endif |
46 BROADCAST, | 46 BROADCAST, |
47 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) | 47 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) |
48 PORTS_MESSAGE_FROM_RELAY, | 48 PORTS_MESSAGE_FROM_RELAY, |
49 #endif | 49 #endif |
| 50 ACCEPT_PEER, |
50 }; | 51 }; |
51 | 52 |
52 struct Header { | 53 struct Header { |
53 MessageType type; | 54 MessageType type; |
54 uint32_t padding; | 55 uint32_t padding; |
55 }; | 56 }; |
56 | 57 |
57 static_assert(sizeof(Header) % kChannelMessageAlignment == 0, | 58 static_assert(sizeof(Header) % kChannelMessageAlignment == 0, |
58 "Invalid header size."); | 59 "Invalid header size."); |
59 | 60 |
60 struct AcceptChildData { | 61 struct AcceptChildData { |
61 ports::NodeName parent_name; | 62 ports::NodeName parent_name; |
62 ports::NodeName token; | 63 ports::NodeName token; |
63 }; | 64 }; |
64 | 65 |
65 struct AcceptParentData { | 66 struct AcceptParentData { |
66 ports::NodeName token; | 67 ports::NodeName token; |
67 ports::NodeName child_name; | 68 ports::NodeName child_name; |
68 }; | 69 }; |
69 | 70 |
| 71 struct AcceptPeerData { |
| 72 ports::NodeName token; |
| 73 ports::NodeName peer_name; |
| 74 ports::PortName port_name; |
| 75 }; |
| 76 |
70 // This message may include a process handle on plaforms that require it. | 77 // This message may include a process handle on plaforms that require it. |
71 struct AddBrokerClientData { | 78 struct AddBrokerClientData { |
72 ports::NodeName client_name; | 79 ports::NodeName client_name; |
73 #if !defined(OS_WIN) | 80 #if !defined(OS_WIN) |
74 uint32_t process_handle; | 81 uint32_t process_handle; |
75 uint32_t padding; | 82 uint32_t padding; |
76 #endif | 83 #endif |
77 }; | 84 }; |
78 | 85 |
79 #if !defined(OS_WIN) | 86 #if !defined(OS_WIN) |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 void NodeChannel::AcceptParent(const ports::NodeName& token, | 282 void NodeChannel::AcceptParent(const ports::NodeName& token, |
276 const ports::NodeName& child_name) { | 283 const ports::NodeName& child_name) { |
277 AcceptParentData* data; | 284 AcceptParentData* data; |
278 Channel::MessagePtr message = CreateMessage( | 285 Channel::MessagePtr message = CreateMessage( |
279 MessageType::ACCEPT_PARENT, sizeof(AcceptParentData), 0, &data); | 286 MessageType::ACCEPT_PARENT, sizeof(AcceptParentData), 0, &data); |
280 data->token = token; | 287 data->token = token; |
281 data->child_name = child_name; | 288 data->child_name = child_name; |
282 WriteChannelMessage(std::move(message)); | 289 WriteChannelMessage(std::move(message)); |
283 } | 290 } |
284 | 291 |
| 292 void NodeChannel::AcceptPeer(const ports::NodeName& sender_name, |
| 293 const ports::NodeName& token, |
| 294 const ports::PortName& port_name) { |
| 295 AcceptPeerData* data; |
| 296 Channel::MessagePtr message = |
| 297 CreateMessage(MessageType::ACCEPT_PEER, sizeof(AcceptPeerData), 0, &data); |
| 298 data->token = token; |
| 299 data->peer_name = sender_name; |
| 300 data->port_name = port_name; |
| 301 WriteChannelMessage(std::move(message)); |
| 302 } |
| 303 |
285 void NodeChannel::AddBrokerClient(const ports::NodeName& client_name, | 304 void NodeChannel::AddBrokerClient(const ports::NodeName& client_name, |
286 base::ProcessHandle process_handle) { | 305 base::ProcessHandle process_handle) { |
287 AddBrokerClientData* data; | 306 AddBrokerClientData* data; |
288 ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector()); | 307 ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector()); |
289 #if defined(OS_WIN) | 308 #if defined(OS_WIN) |
290 handles->push_back(PlatformHandle(process_handle)); | 309 handles->push_back(PlatformHandle(process_handle)); |
291 #endif | 310 #endif |
292 Channel::MessagePtr message = CreateMessage( | 311 Channel::MessagePtr message = CreateMessage( |
293 MessageType::ADD_BROKER_CLIENT, sizeof(AddBrokerClientData), | 312 MessageType::ADD_BROKER_CLIENT, sizeof(AddBrokerClientData), |
294 handles->size(), &data); | 313 handles->size(), &data); |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 if (num_bytes) | 740 if (num_bytes) |
722 memcpy(message->mutable_payload(), data + 1, num_bytes); | 741 memcpy(message->mutable_payload(), data + 1, num_bytes); |
723 delegate_->OnPortsMessageFromRelay( | 742 delegate_->OnPortsMessageFromRelay( |
724 remote_node_name_, data->source, std::move(message)); | 743 remote_node_name_, data->source, std::move(message)); |
725 return; | 744 return; |
726 } | 745 } |
727 break; | 746 break; |
728 | 747 |
729 #endif // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) | 748 #endif // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) |
730 | 749 |
| 750 case MessageType::ACCEPT_PEER: { |
| 751 const AcceptPeerData* data; |
| 752 if (GetMessagePayload(payload, payload_size, &data)) { |
| 753 delegate_->OnAcceptPeer(remote_node_name_, data->token, data->peer_name, |
| 754 data->port_name); |
| 755 return; |
| 756 } |
| 757 break; |
| 758 } |
| 759 |
731 default: | 760 default: |
732 break; | 761 break; |
733 } | 762 } |
734 | 763 |
735 DLOG(ERROR) << "Received invalid message. Closing channel."; | 764 DLOG(ERROR) << "Received invalid message. Closing channel."; |
736 delegate_->OnChannelError(remote_node_name_, this); | 765 delegate_->OnChannelError(remote_node_name_, this); |
737 } | 766 } |
738 | 767 |
739 void NodeChannel::OnChannelError() { | 768 void NodeChannel::OnChannelError() { |
740 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 769 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 | 895 |
867 base::AutoLock lock(channel_lock_); | 896 base::AutoLock lock(channel_lock_); |
868 if (!channel_) | 897 if (!channel_) |
869 DLOG(ERROR) << "Dropping message on closed channel."; | 898 DLOG(ERROR) << "Dropping message on closed channel."; |
870 else | 899 else |
871 channel_->Write(std::move(message)); | 900 channel_->Write(std::move(message)); |
872 } | 901 } |
873 | 902 |
874 } // namespace edk | 903 } // namespace edk |
875 } // namespace mojo | 904 } // namespace mojo |
OLD | NEW |