mirror of
https://github.com/faye/websocket-driver-ruby.git
synced 2025-11-01 13:59:38 +00:00
63 lines
1.4 KiB
C
63 lines
1.4 KiB
C
#include "message.h"
|
|
|
|
wsd_Message *wsd_Message_create(wsd_Frame *frame)
|
|
{
|
|
wsd_Message *message = calloc(1, sizeof(wsd_Message));
|
|
if (message == NULL) return NULL;
|
|
|
|
message->frames = wsd_Queue_create();
|
|
if (message->frames == NULL) {
|
|
free(message);
|
|
return NULL;
|
|
}
|
|
|
|
message->length = 0;
|
|
if (!wsd_Message_push_frame(message, frame)) {
|
|
wsd_clear_pointer(wsd_Queue_destroy, message->frames);
|
|
free(message);
|
|
return NULL;
|
|
}
|
|
|
|
message->opcode = frame->opcode;
|
|
message->rsv1 = frame->rsv1;
|
|
message->rsv2 = frame->rsv2;
|
|
message->rsv3 = frame->rsv3;
|
|
|
|
return message;
|
|
}
|
|
|
|
void wsd_Message_destroy(wsd_Message *message)
|
|
{
|
|
if (message == NULL) return;
|
|
|
|
wsd_Queue_each(message->frames, (wsd_Queue_cb)wsd_Frame_destroy);
|
|
|
|
wsd_clear_pointer(wsd_Queue_destroy, message->frames);
|
|
|
|
free(message);
|
|
}
|
|
|
|
int wsd_Message_push_frame(wsd_Message *message, wsd_Frame *frame)
|
|
{
|
|
if (!wsd_Queue_push(message->frames, frame)) return 0;
|
|
|
|
message->length += frame->length;
|
|
return 1;
|
|
}
|
|
|
|
uint64_t wsd_Message_copy(wsd_Message *message, uint8_t *target)
|
|
{
|
|
uint64_t offset = 0;
|
|
wsd_QueueIter *iter = wsd_QueueIter_create(message->frames);
|
|
|
|
if (iter == NULL) return 0;
|
|
|
|
for (; iter->value; wsd_QueueIter_next(iter)) {
|
|
offset = wsd_Frame_copy(iter->value, target, offset);
|
|
}
|
|
|
|
wsd_QueueIter_destroy(iter);
|
|
|
|
return offset;
|
|
}
|