blob: f178c69a0023e5e83d6b9ec2acc44b89b67b4e46 [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 "garnet/lib/overnet/endpoint/router_endpoint.h"
namespace overnet {
// Messages contain:
// - a prelude, indicating which message type is contained
// - text, usually FIDL bytes representing the content of a message
// - proxied handles: on fuchsia, these are zircon handles that overnet
// maintains a proxy for
//
// Utilities in this file assist in translating between these rich messages
// and overnet message bodies (which are simply slices).
// Target for building an outgoing message (to the network).
class MessageSender {
public:
virtual Status SetTransactionId(uint32_t txid) = 0;
virtual Status SetOrdinal(uint32_t ordinal) = 0;
virtual Status SetBody(Slice body) = 0;
virtual Status AppendUnknownHandle() = 0;
virtual StatusOr<RouterEndpoint::NewStream> AppendChannelHandle(
fuchsia::overnet::protocol::Introduction introduction) = 0;
};
// Target for building an incoming message (from the network).
class MessageReceiver {
public:
virtual Status SetTransactionId(uint32_t txid) = 0;
virtual Status SetOrdinal(uint32_t ordinal) = 0;
virtual Status SetBody(Slice body) = 0;
virtual Status AppendUnknownHandle() = 0;
virtual Status AppendChannelHandle(
RouterEndpoint::ReceivedIntroduction stream) = 0;
};
// Concrete implementation of a MessageSender that creates a Slice that can be
// interpreted by ParseMessageInto.
class MessageWireEncoder final : public MessageSender {
public:
MessageWireEncoder(RouterEndpoint::Stream* stream) : stream_(stream) {}
Status SetTransactionId(uint32_t txid) override {
txid_ = txid;
return Status::Ok();
}
Status SetOrdinal(uint32_t ordinal) override {
ordinal_ = ordinal;
return Status::Ok();
}
Status SetBody(Slice body) override {
body_ = std::move(body);
return Status::Ok();
}
Status AppendUnknownHandle() override {
return Status(StatusCode::FAILED_PRECONDITION,
"Unknown handle types not supported for encoding");
}
StatusOr<RouterEndpoint::NewStream> AppendChannelHandle(
fuchsia::overnet::protocol::Introduction introduction) override;
Slice Write(Border desired_border) const;
private:
RouterEndpoint::Stream* const stream_;
uint32_t txid_ = 0;
uint32_t ordinal_ = 0;
Slice body_;
std::vector<Slice> tail_;
};
Status ParseMessageInto(Slice slice, NodeId peer,
RouterEndpoint* router_endpoint,
MessageReceiver* builder);
} // namespace overnet