Changeset d3109ff in mainline for uspace/srv/hid/remcons/user.c


Ignore:
Timestamp:
2024-09-24T17:59:36Z (6 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
6a753a9c
Parents:
3fcea34
Message:

Cursor and color control in remote console + RGB

Move vt100 module from output server into separate vt library
Add cursor and color control to remcons using libvt
Add RGB color control to serial console and remote console

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/remcons/user.c

    r3fcea34 rd3109ff  
    11/*
     2 * Copyright (c) 2024 Jiri Svoboda
    23 * Copyright (c) 2012 Vojtech Horky
    34 * All rights reserved.
     
    3738#include <adt/prodcons.h>
    3839#include <errno.h>
     40#include <mem.h>
    3941#include <str_error.h>
    4042#include <loc.h>
     
    4850#include <inttypes.h>
    4951#include <assert.h>
     52#include "remcons.h"
    5053#include "user.h"
    5154#include "telnet.h"
     
    9093
    9194        user->cursor_x = 0;
     95        user->cursor_y = 0;
    9296
    9397        return user;
     
    182186}
    183187
     188static errno_t telnet_user_fill_recv_buf(telnet_user_t *user)
     189{
     190        errno_t rc;
     191        size_t recv_length;
     192
     193        rc = tcp_conn_recv_wait(user->conn, user->socket_buffer,
     194            BUFFER_SIZE, &recv_length);
     195        if (rc != EOK)
     196                return rc;
     197
     198        if (recv_length == 0) {
     199                user->socket_closed = true;
     200                user->srvs.aborted = true;
     201                return ENOENT;
     202        }
     203
     204        user->socket_buffer_len = recv_length;
     205        user->socket_buffer_pos = 0;
     206
     207        return EOK;
     208}
     209
    184210/** Receive next byte from a socket (use buffering.
    185211 * We need to return the value via extra argument because the read byte
     
    188214static errno_t telnet_user_recv_next_byte_no_lock(telnet_user_t *user, char *byte)
    189215{
     216        errno_t rc;
     217
    190218        /* No more buffered data? */
    191219        if (user->socket_buffer_len <= user->socket_buffer_pos) {
    192                 errno_t rc;
    193                 size_t recv_length;
    194 
    195                 rc = tcp_conn_recv_wait(user->conn, user->socket_buffer,
    196                     BUFFER_SIZE, &recv_length);
     220                rc = telnet_user_fill_recv_buf(user);
    197221                if (rc != EOK)
    198222                        return rc;
    199 
    200                 if (recv_length == 0) {
    201                         user->socket_closed = true;
    202                         user->srvs.aborted = true;
    203                         return ENOENT;
    204                 }
    205 
    206                 user->socket_buffer_len = recv_length;
    207                 user->socket_buffer_pos = 0;
    208223        }
    209224
    210225        *byte = user->socket_buffer[user->socket_buffer_pos++];
    211 
     226        return EOK;
     227}
     228
     229errno_t telnet_user_recv(telnet_user_t *user, void *data, size_t size,
     230    size_t *nread)
     231{
     232        errno_t rc;
     233        size_t nb;
     234
     235        /* No more buffered data? */
     236        if (user->socket_buffer_len <= user->socket_buffer_pos) {
     237                rc = telnet_user_fill_recv_buf(user);
     238                if (rc != EOK)
     239                        return rc;
     240        }
     241
     242        nb = user->socket_buffer_len - user->socket_buffer_pos;
     243        memcpy(data, user->socket_buffer + user->socket_buffer_pos, nb);
     244        user->socket_buffer_pos += nb;
     245        *nread = nb;
    212246        return EOK;
    213247}
     
    283317                /* Skip zeros, bail-out on error. */
    284318                while (next_byte == 0) {
     319                        fibril_mutex_unlock(&user->guard);
     320
    285321                        errno_t rc = telnet_user_recv_next_byte_no_lock(user, &next_byte);
    286                         if (rc != EOK) {
    287                                 fibril_mutex_unlock(&user->guard);
     322                        if (rc != EOK)
    288323                                return rc;
    289                         }
     324
    290325                        uint8_t byte = (uint8_t) next_byte;
     326                        fibril_mutex_lock(&user->guard);
    291327
    292328                        /* Skip telnet commands. */
     
    339375 * @param size Size of @p data buffer in bytes.
    340376 */
    341 static errno_t telnet_user_send_data_no_lock(telnet_user_t *user, uint8_t *data, size_t size)
     377static errno_t telnet_user_send_data_no_lock(telnet_user_t *user,
     378    const char *data, size_t size)
    342379{
    343380        uint8_t *converted = malloc(3 * size + 1);
     
    351388                        converted[converted_size++] = 10;
    352389                        user->cursor_x = 0;
     390                        if (user->cursor_y < user->rows - 1)
     391                                ++user->cursor_y;
    353392                } else {
    354393                        converted[converted_size++] = data[i];
     
    373412 * @param size Size of @p data buffer in bytes.
    374413 */
    375 errno_t telnet_user_send_data(telnet_user_t *user, uint8_t *data, size_t size)
     414errno_t telnet_user_send_data(telnet_user_t *user, const char *data,
     415    size_t size)
    376416{
    377417        fibril_mutex_lock(&user->guard);
     
    395435        fibril_mutex_lock(&user->guard);
    396436        if (user->cursor_x - 1 == new_x) {
    397                 uint8_t data = '\b';
     437                char data = '\b';
    398438                /* Ignore errors. */
    399439                telnet_user_send_data_no_lock(user, &data, 1);
Note: See TracChangeset for help on using the changeset viewer.