blob: 744fc35bfb6410543351dd6bdaed8a59670120d9 [file] [log] [blame]
// 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 "fake_endpoint.h"
namespace netemul {
FakeEndpoint::FakeEndpoint(
data::BusConsumer::Ptr sink,
fidl::InterfaceRequest<FakeEndpoint::FFakeEndpoint> request,
async_dispatcher_t* dispatcher)
: sink_(std::move(sink)),
binding_(this, std::move(request), dispatcher),
weak_ptr_factory_(this) {
binding_.set_error_handler([this](zx_status_t err) {
if (on_disconnected_) {
on_disconnected_(this);
}
});
}
void FakeEndpoint::SetOnDisconnected(OnDisconnectedCallback cl) {
on_disconnected_ = std::move(cl);
}
fxl::WeakPtr<data::Consumer> FakeEndpoint::GetPointer() {
return weak_ptr_factory_.GetWeakPtr();
}
void FakeEndpoint::Consume(const void* data, size_t len) {
// copy data to fidl vec:
fidl::VectorPtr<uint8_t> vec(len);
memcpy(vec->data(), data, len);
binding_.events().OnData(std::move(vec));
}
void FakeEndpoint::Write(::std::vector<uint8_t> data) {
if (!sink_) {
// sink has disappeared from under us!
// close the binding
binding_.Close(ZX_ERR_PEER_CLOSED);
return;
}
sink_->Consume(data.data(), data.size(), GetPointer());
}
} // namespace netemul