#include "rpc_streams.h" static bool stream_read(pb_istream_t *stream, uint8_t *buf, size_t count) { rpc_istream_t *state = (rpc_istream_t*)stream->state; if (buf == NULL) { uint8_t dummy; while (count--) { if (fread(&dummy, 1, 1, state->file) != 1) return false; state->checksum ^= dummy; } } else { if (fread(buf, 1, count, state->file) != count) return false; for (size_t i = 0; i < count; i++) state->checksum ^= buf[i]; } return true; } bool rpc_istream_start(rpc_istream_t *stream) { uint8_t hdr[3]; if (fread(hdr, 1, 3, stream->file) != 3) return false; stream->stream.callback = &stream_read; stream->stream.state = &stream; stream->stream.bytes_left = (hdr[0] << 8) | hdr[1]; stream->msgtype = hdr[2]; stream->checksum = 0xFF ^ hdr[2]; return true; } bool rpc_istream_end(rpc_istream_t *stream) { if (stream->stream.bytes_left != 0) { if (!pb_read(&stream->stream, NULL, stream->stream.bytes_left)) return false; } uint8_t checksum; if (!fread(&checksum, 1, 1, stream->file)) return false; if (checksum != stream->checksum) return false; return true; } static bool stream_write(pb_ostream_t *stream, const uint8_t *buf, size_t count) { rpc_istream_t *state = (rpc_istream_t*)stream->state; for (size_t i = 0; i < count; i++) state->checksum ^= buf[i]; return fwrite(buf, 1, count, state->file) == count; } bool rpc_ostream_start(rpc_ostream_t *stream, RPCCommand msgtype, size_t length) { if (length > 65535) return false; uint8_t hdr[3] = {length >> 8, length & 0xFF, msgtype}; if (fwrite(hdr, 1, 3, stream->file) != 3) return false; stream->stream.callback = &stream_write; stream->stream.state = &stream; stream->stream.bytes_written = 0; stream->stream.max_size = length - 2; stream->checksum = 0xFF ^ msgtype; return true; } bool rpc_ostream_end(rpc_ostream_t *stream) { if (stream->stream.bytes_written != stream->stream.max_size) return false; return fwrite(&stream->checksum, 1, 1, stream->file); }