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 21 matching lines...) Expand all Loading... |
32 enum class MessageType : uint32_t { | 32 enum class MessageType : uint32_t { |
33 ACCEPT_CHILD, | 33 ACCEPT_CHILD, |
34 ACCEPT_PARENT, | 34 ACCEPT_PARENT, |
35 ADD_BROKER_CLIENT, | 35 ADD_BROKER_CLIENT, |
36 BROKER_CLIENT_ADDED, | 36 BROKER_CLIENT_ADDED, |
37 ACCEPT_BROKER_CLIENT, | 37 ACCEPT_BROKER_CLIENT, |
38 PORTS_MESSAGE, | 38 PORTS_MESSAGE, |
39 REQUEST_PORT_MERGE, | 39 REQUEST_PORT_MERGE, |
40 REQUEST_INTRODUCTION, | 40 REQUEST_INTRODUCTION, |
41 INTRODUCE, | 41 INTRODUCE, |
| 42 BROADCAST, |
42 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) | 43 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) |
43 RELAY_PORTS_MESSAGE, | 44 RELAY_PORTS_MESSAGE, |
44 #endif | 45 #endif |
45 }; | 46 }; |
46 | 47 |
47 struct Header { | 48 struct Header { |
48 MessageType type; | 49 MessageType type; |
49 uint32_t padding; | 50 uint32_t padding; |
50 }; | 51 }; |
51 | 52 |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector()); | 323 ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector()); |
323 if (channel_handle.is_valid()) | 324 if (channel_handle.is_valid()) |
324 handles->push_back(channel_handle.release()); | 325 handles->push_back(channel_handle.release()); |
325 Channel::MessagePtr message = CreateMessage( | 326 Channel::MessagePtr message = CreateMessage( |
326 MessageType::INTRODUCE, sizeof(IntroductionData), handles->size(), &data); | 327 MessageType::INTRODUCE, sizeof(IntroductionData), handles->size(), &data); |
327 message->SetHandles(std::move(handles)); | 328 message->SetHandles(std::move(handles)); |
328 data->name = name; | 329 data->name = name; |
329 WriteChannelMessage(std::move(message)); | 330 WriteChannelMessage(std::move(message)); |
330 } | 331 } |
331 | 332 |
| 333 void NodeChannel::Broadcast(Channel::MessagePtr message) { |
| 334 DCHECK(!message->has_handles()); |
| 335 void* data; |
| 336 Channel::MessagePtr broadcast_message = CreateMessage( |
| 337 MessageType::BROADCAST, message->data_num_bytes(), 0, &data); |
| 338 memcpy(data, message->data(), message->data_num_bytes()); |
| 339 WriteChannelMessage(std::move(broadcast_message)); |
| 340 } |
| 341 |
332 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) | 342 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) |
333 void NodeChannel::RelayPortsMessage(const ports::NodeName& destination, | 343 void NodeChannel::RelayPortsMessage(const ports::NodeName& destination, |
334 Channel::MessagePtr message) { | 344 Channel::MessagePtr message) { |
335 #if defined(OS_WIN) | 345 #if defined(OS_WIN) |
336 DCHECK(message->has_handles()); | 346 DCHECK(message->has_handles()); |
337 | 347 |
338 // Note that this is only used on Windows, and on Windows all platform | 348 // Note that this is only used on Windows, and on Windows all platform |
339 // handles are included in the message data. We blindly copy all the data | 349 // handles are included in the message data. We blindly copy all the data |
340 // here and the relay node (the parent) will duplicate handles as needed. | 350 // here and the relay node (the parent) will duplicate handles as needed. |
341 size_t num_bytes = sizeof(RelayPortsMessageData) + message->data_num_bytes(); | 351 size_t num_bytes = sizeof(RelayPortsMessageData) + message->data_num_bytes(); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 channel_handle = ScopedPlatformHandle(handles->at(0)); | 577 channel_handle = ScopedPlatformHandle(handles->at(0)); |
568 handles->clear(); | 578 handles->clear(); |
569 } | 579 } |
570 delegate_->OnIntroduce(remote_node_name_, data->name, | 580 delegate_->OnIntroduce(remote_node_name_, data->name, |
571 std::move(channel_handle)); | 581 std::move(channel_handle)); |
572 return; | 582 return; |
573 } | 583 } |
574 break; | 584 break; |
575 } | 585 } |
576 | 586 |
| 587 case MessageType::BROADCAST: { |
| 588 if (payload_size <= sizeof(Header)) |
| 589 break; |
| 590 const void* data = static_cast<const void*>( |
| 591 reinterpret_cast<const Header*>(payload) + 1); |
| 592 Channel::MessagePtr message = |
| 593 Channel::Message::Deserialize(data, payload_size - sizeof(Header)); |
| 594 if (!message) { |
| 595 DLOG(ERROR) << "Dropping invalid broadcast message."; |
| 596 break; |
| 597 } |
| 598 delegate_->OnBroadcast(std::move(message)); |
| 599 return; |
| 600 } |
| 601 |
577 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) | 602 #if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS)) |
578 case MessageType::RELAY_PORTS_MESSAGE: { | 603 case MessageType::RELAY_PORTS_MESSAGE: { |
579 base::ProcessHandle from_process; | 604 base::ProcessHandle from_process; |
580 { | 605 { |
581 base::AutoLock lock(remote_process_handle_lock_); | 606 base::AutoLock lock(remote_process_handle_lock_); |
582 from_process = remote_process_handle_; | 607 from_process = remote_process_handle_; |
583 } | 608 } |
584 const RelayPortsMessageData* data; | 609 const RelayPortsMessageData* data; |
585 if (GetMessagePayload(payload, payload_size, &data)) { | 610 if (GetMessagePayload(payload, payload_size, &data)) { |
586 // Don't try to relay an empty message. | 611 // Don't try to relay an empty message. |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 | 779 |
755 base::AutoLock lock(channel_lock_); | 780 base::AutoLock lock(channel_lock_); |
756 if (!channel_) | 781 if (!channel_) |
757 DLOG(ERROR) << "Dropping message on closed channel."; | 782 DLOG(ERROR) << "Dropping message on closed channel."; |
758 else | 783 else |
759 channel_->Write(std::move(message)); | 784 channel_->Write(std::move(message)); |
760 } | 785 } |
761 | 786 |
762 } // namespace edk | 787 } // namespace edk |
763 } // namespace mojo | 788 } // namespace mojo |
OLD | NEW |