struct pakfire_buffer recv_buffer;
// WebSocket Send Buffer
- struct pakfire_send_buffer {
- char* data;
- size_t length;
- } send_buffer;
+ struct pakfire_buffer send_buffer;
// State
enum pakfire_xfer_state {
if (xfer->event)
sd_event_source_unref(xfer->event);
- // Receive Buffer
+ // Send/Receive Buffers
+ pakfire_buffer_free(&xfer->send_buffer);
pakfire_buffer_free(&xfer->recv_buffer);
- if (xfer->send_buffer.data)
- free(xfer->send_buffer.data);
// Query Arguments
if (xfer->queries)
self->state |= PAKFIRE_XFER_READY_TO_SEND;
// Finish sending any partially sent messages
- if (self->send_buffer.data) {
+ if (!pakfire_buffer_is_empty(&self->send_buffer)) {
r = pakfire_xfer_send_message(self, self->send_buffer.data, self->send_buffer.length);
if (r < 0)
return r;
+
+ // Free the message as it has been sent
+ pakfire_buffer_free(&self->send_buffer);
}
// Just call the callback (if there is one)
return 0;
}
-static int pakfire_xfer_store_message(struct pakfire_xfer* self,
- const char* message, const size_t length) {
- // Resize the buffer
- self->send_buffer.data = pakfire_realloc(self->send_buffer.data, length);
- if (!self->send_buffer.data) {
- ERROR(self->ctx, "Failed to allocate memory: %m\n");
- return -errno;
- }
-
- // Store the message
- memcpy(self->send_buffer.data, message, length);
- self->send_buffer.length = length;
-
- return 0;
-}
-
/*
This function sends a WebSocket message
*/
xfer->state &= ~PAKFIRE_XFER_READY_TO_SEND;
// Store the message
- r = pakfire_xfer_store_message(xfer, message + offset, length - offset);
+ r = pakfire_buffer_push(&xfer->send_buffer, message + offset, length - offset);
if (r < 0)
return r;
int r;
// Send any left over fragments from a previous message before sending a new one
- if (self->send_buffer.length) {
+ if (!pakfire_buffer_is_empty(&self->send_buffer)) {
r = __pakfire_xfer_send_message(self, self->send_buffer.data, self->send_buffer.length);
if (r < 0) {
ERROR(self->ctx, "Failed to send previous fragment: %s\n", strerror(-r));
return r;
}
- self->send_buffer.length = 0;
+ // Free the message as it has been sent
+ pakfire_buffer_clear(&self->send_buffer);
}
// Send the actual message