void send_timestamp_chunk(bool ignore_time_interval = false) { StaticOutStream<12 + GTF_SIZE_KEYBUF_REC * sizeof(uint32_t) + 1> payload; payload.out_timeval_to_uint64le_usec(this->timer); if (this->send_input) { payload.out_uint16_le(this->mouse_x); payload.out_uint16_le(this->mouse_y); payload.out_uint8(ignore_time_interval ? 1 : 0); /* for (uint32_t i = 0, c = keyboard_buffer_32.size() / sizeof(uint32_t); i < c; i++) { LOG(LOG_INFO, "send_timestamp_chunk: '%c'(0x%X)", (keyboard_buffer_32.data[i]<128)?(char)keyboard_buffer_32.data[i]:'?', keyboard_buffer_32.data[i]); } */ payload.out_copy_bytes(keyboard_buffer_32.get_data(), keyboard_buffer_32.get_offset()); keyboard_buffer_32 = OutStream(keyboard_buffer_32_buf); } send_wrm_chunk(this->trans, TIMESTAMP, payload.get_offset(), 1); this->trans.send(payload.get_data(), payload.get_offset()); this->last_sent_timer = this->timer; }
void send_meta_chunk() { const uint8_t trm_format_version = 0; constexpr unsigned payload_size = 1; StaticOutStream<TRANSPARENT_CHUNK_HEADER_SIZE + payload_size> header; this->make_chunk_header(header, CHUNK_TYPE_META, payload_size); header.out_uint8(trm_format_version); assert(header.get_offset() == header.get_capacity()); this->t->send(header.get_data(), header.get_offset()); }
void server_resize(uint16_t width, uint16_t height, uint8_t bpp) { constexpr unsigned payload_size = 5; StaticOutStream<TRANSPARENT_CHUNK_HEADER_SIZE + payload_size> header; this->make_chunk_header(header, CHUNK_TYPE_RESIZE, payload_size); header.out_uint16_le(width); header.out_uint16_le(height); header.out_uint8(bpp); assert(header.get_offset() == header.get_capacity()); this->t->send(header.get_data(), header.get_offset()); }
void set_pointer(int cache_idx) override { size_t size = 2 // mouse x + 2 // mouse y + 1 // cache index ; send_wrm_chunk(this->trans, POINTER, size, 0); StaticOutStream<16> payload; payload.out_uint16_le(this->mouse_x); payload.out_uint16_le(this->mouse_y); payload.out_uint8(cache_idx); this->trans.send(payload.get_data(), payload.get_offset()); }
void send_pointer(int cache_idx, const Pointer & cursor) override { size_t size = 2 // mouse x + 2 // mouse y + 1 // cache index + 1 // hotspot x + 1 // hotspot y + 32 * 32 * 3 // data + 128 // mask ; send_wrm_chunk(this->trans, POINTER, size, 0); StaticOutStream<16> payload; payload.out_uint16_le(this->mouse_x); payload.out_uint16_le(this->mouse_y); payload.out_uint8(cache_idx); payload.out_uint8(cursor.x); payload.out_uint8(cursor.y); this->trans.send(payload.get_data(), payload.get_offset()); this->trans.send(cursor.data, cursor.data_size()); this->trans.send(cursor.mask, cursor.mask_size()); }
void send_to_front_channel( const char * const mod_channel_name , uint8_t const * data, size_t length , size_t chunk_size, int flags) { constexpr unsigned payload_size = 9; StaticOutStream<TRANSPARENT_CHUNK_HEADER_SIZE + payload_size> header; uint8_t mod_channel_name_length = strlen(mod_channel_name); this->make_chunk_header(header, CHUNK_TYPE_FRONTCHANNEL, payload_size + mod_channel_name_length + length); header.out_uint8(mod_channel_name_length); header.out_uint16_le(length); header.out_uint16_le(chunk_size); header.out_uint32_le(flags); assert(header.get_offset() == header.get_capacity()); this->t->send(header.get_data(), header.get_offset()); this->t->send(mod_channel_name, mod_channel_name_length); this->t->send(data, length); }