int zmq::stream_engine_t::decode_and_push (msg_t *msg_) { zmq_assert (mechanism != NULL); if (mechanism->decode (msg_) == -1) return -1; if(has_timeout_timer) { has_timeout_timer = false; cancel_timer(heartbeat_timeout_timer_id); } if(has_ttl_timer) { has_ttl_timer = false; cancel_timer(heartbeat_ttl_timer_id); } if(msg_->flags() & msg_t::command) { uint8_t cmd_id = *((uint8_t*)msg_->data()); if(cmd_id == 4) process_heartbeat_message(msg_); } if (metadata) msg_->set_metadata (metadata); if (session->push_msg (msg_) == -1) { if (errno == EAGAIN) process_msg = &stream_engine_t::push_one_then_decode_and_push; return -1; } return 0; }
int zmq::stream_engine_t::process_command_message (msg_t *msg_) { const uint8_t cmd_name_size = *(static_cast<const uint8_t *> (msg_->data ())); const size_t ping_name_size = msg_t::ping_cmd_name_size - 1; const size_t sub_name_size = msg_t::sub_cmd_name_size - 1; const size_t cancel_name_size = msg_t::cancel_cmd_name_size - 1; // Malformed command if (unlikely (msg_->size () < cmd_name_size + sizeof (cmd_name_size))) return -1; uint8_t *cmd_name = (static_cast<uint8_t *> (msg_->data ())) + 1; if (cmd_name_size == ping_name_size && memcmp (cmd_name, "PING", cmd_name_size) == 0) msg_->set_flags (zmq::msg_t::ping); if (cmd_name_size == ping_name_size && memcmp (cmd_name, "PONG", cmd_name_size) == 0) msg_->set_flags (zmq::msg_t::pong); if (cmd_name_size == sub_name_size && memcmp (cmd_name, "SUBSCRIBE", cmd_name_size) == 0) msg_->set_flags (zmq::msg_t::subscribe); if (cmd_name_size == cancel_name_size && memcmp (cmd_name, "CANCEL", cmd_name_size) == 0) msg_->set_flags (zmq::msg_t::cancel); if (msg_->is_ping () || msg_->is_pong ()) return process_heartbeat_message (msg_); return 0; }