int wslay_event_queue_msg_ex(wslay_event_context_ptr ctx, const struct wslay_event_msg *arg, uint8_t rsv) { int r; struct wslay_event_omsg *omsg; if (!wslay_event_is_msg_queueable(ctx)) { return WSLAY_ERR_NO_MORE_MSG; } /* RSV1 is not allowed for control frames */ if ((wslay_is_ctrl_frame(arg->opcode) && (arg->msg_length > 125 || wslay_get_rsv1(rsv))) || !wslay_event_verify_rsv_bits(ctx, rsv)) { return WSLAY_ERR_INVALID_ARGUMENT; } if ((r = wslay_event_omsg_non_fragmented_init(&omsg, arg->opcode, rsv, arg->msg, arg->msg_length)) != 0) { return r; } if (wslay_is_ctrl_frame(arg->opcode)) { if ((r = wslay_queue_push(ctx->send_ctrl_queue, omsg)) != 0) { return r; } } else { if ((r = wslay_queue_push(ctx->send_queue, omsg)) != 0) { return r; } } ++ctx->queued_msg_count; ctx->queued_msg_length += arg->msg_length; return 0; }
int wslay_event_queue_msg(wslay_event_context_ptr ctx, const struct wslay_event_msg *arg) { int r; struct wslay_event_omsg *omsg; if(!wslay_event_is_msg_queueable(ctx)) { return WSLAY_ERR_NO_MORE_MSG; } if(wslay_is_ctrl_frame(arg->opcode) && arg->msg_length > 125) { return WSLAY_ERR_INVALID_ARGUMENT; } if((r = wslay_event_omsg_non_fragmented_init (&omsg, arg->opcode, arg->msg, arg->msg_length)) != 0) { return r; } if(wslay_is_ctrl_frame(arg->opcode)) { if((r = wslay_queue_push(ctx->send_ctrl_queue, omsg)) != 0) { return r; } } else { if((r = wslay_queue_push(ctx->send_queue, omsg)) != 0) { return r; } } ++ctx->queued_msg_count; ctx->queued_msg_length += arg->msg_length; return 0; }
static int wslay_event_imsg_append_chunk(struct wslay_event_imsg *m, size_t len) { if (len == 0) { return 0; } else { int r; struct wslay_event_byte_chunk *chunk; if ((r = wslay_event_byte_chunk_init(&chunk, len)) != 0) { return r; } if ((r = wslay_queue_push(m->chunks, chunk)) != 0) { return r; } m->msg_length += len; return 0; } }
int wslay_event_queue_fragmented_msg_ex(wslay_event_context_ptr ctx, const struct wslay_event_fragmented_msg *arg, uint8_t rsv) { int r; struct wslay_event_omsg *omsg; if (!wslay_event_is_msg_queueable(ctx)) { return WSLAY_ERR_NO_MORE_MSG; } if (wslay_is_ctrl_frame(arg->opcode) || !wslay_event_verify_rsv_bits(ctx, rsv)) { return WSLAY_ERR_INVALID_ARGUMENT; } if ((r = wslay_event_omsg_fragmented_init(&omsg, arg->opcode, rsv, arg->source, arg->read_callback)) != 0) { return r; } if ((r = wslay_queue_push(ctx->send_queue, omsg)) != 0) { return r; } ++ctx->queued_msg_count; return 0; }