pw_rpc: Split public and internal interfaces
- Make an internal version of Server, which will expose functions for
working with Reader/Writer objects
- Make an internal version of Channel, which provides an interface for
sending packets.
- Define the Channel::OutputBuffer class for handling buffers acquired
from a ChannelOutput.
Change-Id: Ieea29c1392726cd2eb15008e19004cde05c7f43b
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/12160
Commit-Queue: Wyatt Hepler <hepler@google.com>
Reviewed-by: Alexei Frolov <frolv@google.com>
diff --git a/pw_rpc/base_server_writer.cc b/pw_rpc/base_server_writer.cc
index 5156f4d..bfe3fe7 100644
--- a/pw_rpc/base_server_writer.cc
+++ b/pw_rpc/base_server_writer.cc
@@ -14,7 +14,6 @@
#include "pw_rpc/internal/base_server_writer.h"
-#include "pw_assert/assert.h"
#include "pw_rpc/internal/method.h"
#include "pw_rpc/internal/packet.h"
#include "pw_rpc/server.h"
@@ -22,59 +21,47 @@
namespace pw::rpc::internal {
BaseServerWriter& BaseServerWriter::operator=(BaseServerWriter&& other) {
- context_ = std::move(other.context_);
+ call_ = std::move(other.call_);
response_ = std::move(other.response_);
state_ = std::move(other.state_);
+
other.state_ = kClosed;
return *this;
}
-void BaseServerWriter::close() {
- if (open()) {
- // TODO(hepler): Send a control packet indicating that the stream has
- // terminated, and remove this ServerWriter from the Server's list.
-
- state_ = kClosed;
+void BaseServerWriter::Finish() {
+ if (!open()) {
+ return;
}
+
+ // TODO(hepler): Send a control packet indicating that the stream has
+ // terminated.
+
+ state_ = kClosed;
}
-span<std::byte> BaseServerWriter::AcquireBuffer() {
+span<std::byte> BaseServerWriter::AcquirePayloadBuffer() {
if (!open()) {
return {};
}
- PW_DCHECK(response_.empty());
- response_ = context_.channel().AcquireBuffer();
-
- // Reserve space for the RPC packet header.
- return packet().PayloadUsableSpace(response_);
+ response_ = call_.channel().AcquireBuffer();
+ return response_.payload(packet());
}
-Status BaseServerWriter::SendAndReleaseBuffer(span<const std::byte> payload) {
+Status BaseServerWriter::ReleasePayloadBuffer(span<const std::byte> payload) {
if (!open()) {
return Status::FAILED_PRECONDITION;
}
-
- Packet response_packet = packet();
- response_packet.set_payload(payload);
- StatusWithSize encoded = response_packet.Encode(response_);
- response_ = {};
-
- if (!encoded.ok()) {
- context_.channel().SendAndReleaseBuffer(0);
- return Status::INTERNAL;
- }
-
- // TODO(hepler): Should Channel::SendAndReleaseBuffer return Status?
- context_.channel().SendAndReleaseBuffer(encoded.size());
- return Status::OK;
+ return call_.channel().Send(response_, packet(payload));
}
-Packet BaseServerWriter::packet() const {
+Packet BaseServerWriter::packet(span<const std::byte> payload) const {
return Packet(PacketType::RPC,
- context_.channel_id(),
- context_.service().id(),
- method().id());
+ call_.channel().id(),
+ call_.service().id(),
+ method().id(),
+ payload);
}
} // namespace pw::rpc::internal