13 zmq::ws_encoder_t::ws_encoder_t (
size_t bufsize_,
bool must_mask_) :
14 encoder_base_t<ws_encoder_t> (bufsize_), _must_mask (must_mask_)
17 next_step (
NULL, 0, &ws_encoder_t::message_ready,
true);
21 zmq::ws_encoder_t::~ws_encoder_t ()
26 void zmq::ws_encoder_t::message_ready ()
32 if (in_progress ()->is_ping ())
34 else if (in_progress ()->is_pong ())
36 else if (in_progress ()->is_close_cmd ())
43 _tmp_buf[
offset] = _must_mask ? 0x80 : 0x00;
45 size_t size = in_progress ()->size ();
49 if (in_progress ()->is_subscribe () || in_progress ()->is_cancel ())
53 _tmp_buf[
offset++] |=
static_cast<unsigned char> (
size & 127);
54 else if (
size <= 0xFFFF) {
56 _tmp_buf[
offset++] =
static_cast<unsigned char> ((
size >> 8) & 0xFF);
57 _tmp_buf[
offset++] =
static_cast<unsigned char> (
size & 0xFF);
74 unsigned char protocol_flags = 0;
81 _must_mask ? protocol_flags ^ _mask[mask_index++] : protocol_flags;
86 if (in_progress ()->is_subscribe ())
87 _tmp_buf[
offset++] = _must_mask ? 1 ^ _mask[mask_index++] : 1;
88 else if (in_progress ()->is_cancel ())
89 _tmp_buf[
offset++] = _must_mask ? 0 ^ _mask[mask_index++] : 0;
91 next_step (_tmp_buf,
offset, &ws_encoder_t::size_ready,
false);
94 void zmq::ws_encoder_t::size_ready ()
97 assert (in_progress () != &_masked_msg);
98 const size_t size = in_progress ()->size ();
101 static_cast<unsigned char *
> (in_progress ()->data ());
106 || in_progress ()->is_cmsg ()) {
107 _masked_msg.close ();
108 _masked_msg.init_size (
size);
109 dest =
static_cast<unsigned char *
> (_masked_msg.data ());
116 if (in_progress ()->is_subscribe () || in_progress ()->is_cancel ())
118 for (
size_t i = 0;
i <
size; ++
i, mask_index++)
119 dest[
i] =
src[
i] ^ _mask[mask_index % 4];
121 next_step (
dest,
size, &ws_encoder_t::message_ready,
true);
123 next_step (in_progress ()->
data (), in_progress ()->
size (),
124 &ws_encoder_t::message_ready,
true);