diff options
Diffstat (limited to 'libraries/goldman')
-rw-r--r-- | libraries/goldman/include/goldman/protocol.hpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/libraries/goldman/include/goldman/protocol.hpp b/libraries/goldman/include/goldman/protocol.hpp new file mode 100644 index 0000000..b7f4d51 --- /dev/null +++ b/libraries/goldman/include/goldman/protocol.hpp @@ -0,0 +1,85 @@ +#pragma once + +#include <euler/syscall.hpp> +#include <memory> + +//TODO: handle stream errors, make thread safe + +namespace goldman::protocol { + + typedef euler::syscall::encoded_color color; + typedef uint16_t window; + + static inline void send_open_window( + euler::syscall::stream_handle socket, uint32_t width, uint32_t height) { + + struct [[gnu::packed]] { + uint8_t type; + uint32_t width; + uint32_t height; + } packet { + .type = 0x00, + .width = width, + .height = height + }; + + euler::syscall::write_to_stream(socket, sizeof(packet), &packet); + + } + + void send_update_window_region( + euler::syscall::stream_handle socket, window the_window, + uint32_t start_x, uint32_t start_y, uint32_t width, + uint32_t height, const color *the_data, size_t data_pitch) { + + struct [[gnu::packed]] { + uint8_t type; + window the_window; + uint32_t start_x; + uint32_t start_y; + uint32_t width; + uint32_t height; + } packet_head { + .type = 0x01, + .the_window = the_window, + .start_x = start_x, + .start_y = start_y, + .width = width, + .height = height + }; + + euler::syscall::write_to_stream(socket, sizeof(packet_head), &packet_head); + for (uint32_t y = 0; y < height; ++y) + euler::syscall::write_to_stream( + socket, width * sizeof(color), the_data + data_pitch * y); + + } + + void send_close_window( + euler::syscall::stream_handle socket, window the_window) { + + struct [[gnu::packed]] { + uint8_t type; + window the_window; + } packet { + .type = 0x02, + .the_window = the_window + }; + + euler::syscall::write_to_stream(socket, sizeof(packet), &packet); + + } + + enum class response_id : uint8_t { + window_opened + }; + + window get_window_opened_body(euler::syscall::stream_handle socket) { + + window w; + euler::syscall::read_from_stream(socket, sizeof(w), &w); + return w; + + } + +} |