| // 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 <lib/async/cpp/task.h> |
| |
| #include "channel.h" |
| #include "session.h" |
| |
| namespace btlib { |
| namespace rfcomm { |
| |
| Channel::Channel(DLCI dlci, Session* session) |
| : dlci_(dlci), session_(session){}; |
| |
| namespace internal { |
| |
| ChannelImpl::ChannelImpl(DLCI dlci, Session* session) |
| : Channel(dlci, session) {} |
| |
| void ChannelImpl::Activate(RxCallback rx_callback, |
| ClosedCallback closed_callback, |
| async_dispatcher_t* dispatcher) { |
| rx_callback_ = std::move(rx_callback); |
| closed_callback_ = std::move(closed_callback_); |
| dispatcher_ = dispatcher; |
| |
| while (!pending_rxed_frames_.empty()) { |
| auto& data = pending_rxed_frames_.front(); |
| async::PostTask(dispatcher_, [this, data_ = std::move(data)]() mutable { |
| rx_callback_(std::move(data_)); |
| }); |
| pending_rxed_frames_.pop(); |
| } |
| } |
| |
| void ChannelImpl::Send(common::ByteBufferPtr data) { |
| FXL_DCHECK(session_); |
| FXL_DCHECK(rx_callback_) << "Must call Activate() first"; |
| session_->SendUserData(dlci_, std::move(data)); |
| } |
| |
| void ChannelImpl::Receive(std::unique_ptr<common::ByteBuffer> data) { |
| if (rx_callback_) { |
| async::PostTask(dispatcher_, [this, data_ = std::move(data)]() mutable { |
| rx_callback_(std::move(data_)); |
| }); |
| } else { |
| pending_rxed_frames_.push(std::move(data)); |
| } |
| } |
| |
| } // namespace internal |
| } // namespace rfcomm |
| } // namespace btlib |