| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "peridot/bin/ledger/p2p_provider/impl/remote_connection.h" |
| |
| #include <flatbuffers/flatbuffers.h> |
| #include <lib/fit/function.h> |
| #include <lib/fxl/logging.h> |
| |
| #include "peridot/bin/ledger/p2p_provider/impl/envelope_generated.h" |
| #include "peridot/lib/convert/convert.h" |
| |
| namespace p2p_provider { |
| RemoteConnection::RemoteConnection(std::string local_name) |
| : local_name_(std::move(local_name)) { |
| message_relay_.SetChannelClosedCallback([this] { OnChannelClosed(); }); |
| message_relay_.SetMessageReceivedCallback( |
| [this](std::vector<uint8_t> data) { OnNewMessage(std::move(data)); }); |
| } |
| |
| void RemoteConnection::Start(zx::channel channel) { |
| FXL_DCHECK(!started_); |
| started_ = true; |
| message_relay_.SetChannel(std::move(channel)); |
| } |
| |
| void RemoteConnection::SendMessage(fxl::StringView data) { |
| message_relay_.SendMessage(std::vector<uint8_t>(data.begin(), data.end())); |
| } |
| |
| void RemoteConnection::Disconnect() { |
| FXL_DCHECK(started_); |
| message_relay_.SetChannelClosedCallback(nullptr); |
| message_relay_.CloseChannel(); |
| |
| if (on_empty_) { |
| on_empty_(); |
| } |
| } |
| |
| void RemoteConnection::set_on_empty(fit::closure on_empty) { |
| on_empty_ = std::move(on_empty); |
| } |
| |
| void RemoteConnection::set_on_close(fit::closure on_close) { |
| on_close_ = std::move(on_close); |
| } |
| |
| void RemoteConnection::set_on_message( |
| fit::function<void(std::vector<uint8_t>)> on_message) { |
| on_message_ = std::move(on_message); |
| } |
| |
| void RemoteConnection::OnChannelClosed() { |
| if (on_close_) { |
| on_close_(); |
| } |
| if (on_empty_) { |
| auto on_empty = std::move(on_empty_); |
| on_empty(); |
| } |
| } |
| |
| void RemoteConnection::OnNewMessage(std::vector<uint8_t> data) { |
| FXL_DCHECK(on_message_) |
| << "No message handler has been set. We would be dropping messages."; |
| |
| if (on_message_) { |
| on_message_(std::move(data)); |
| } |
| } |
| |
| } // namespace p2p_provider |