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


Ignore:
Timestamp:
2012-01-12T09:29:00Z (14 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2a180307
Parents:
261bbdc
Message:

remcons: more refactoring

File:
1 edited

Legend:

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

    r261bbdc r99c2e9f3  
    172172}
    173173
     174/** Tell whether the launched task already exited and socket is already closed.
     175 *
     176 * @param user Telnet user in question.
     177 */
     178bool telnet_user_is_zombie(telnet_user_t *user)
     179{
     180        fibril_mutex_lock(&user->guard);
     181        bool zombie = user->socket_closed || user->task_finished;
     182        fibril_mutex_unlock(&user->guard);
     183
     184        return zombie;
     185}
     186
     187/** Receive next byte from a socket (use buffering.
     188 * We need to return the value via extra argument because the read byte
     189 * might be negative.
     190 */
     191static int telnet_user_recv_next_byte_no_lock(telnet_user_t *user, char *byte)
     192{
     193        /* No more buffered data? */
     194        if (user->socket_buffer_len <= user->socket_buffer_pos) {
     195                int recv_length = recv(user->socket, user->socket_buffer, BUFFER_SIZE, 0);
     196                if ((recv_length == 0) || (recv_length == ENOTCONN)) {
     197                        user->socket_closed = true;
     198                        return ENOENT;
     199                }
     200                if (recv_length < 0) {
     201                        return recv_length;
     202                }
     203                user->socket_buffer_len = recv_length;
     204                user->socket_buffer_pos = 0;
     205        }
     206
     207        *byte = user->socket_buffer[user->socket_buffer_pos++];
     208
     209        return EOK;
     210}
     211
     212/** Creates new keyboard event from given char.
     213 *
     214 * @param type Event type (press / release).
     215 * @param c Pressed character.
     216 */
     217static kbd_event_t* new_kbd_event(kbd_event_type_t type, wchar_t c) {
     218        kbd_event_t *event = malloc(sizeof(kbd_event_t));
     219        assert(event);
     220
     221        link_initialize(&event->link);
     222        event->type = type;
     223        event->c = c;
     224        event->mods = 0;
     225        event->key = (c == '\n' ? KC_ENTER : KC_A);
     226
     227        return event;
     228}
     229
     230int telnet_user_get_next_keyboard_event(telnet_user_t *user, kbd_event_t *event)
     231{
     232        fibril_mutex_lock(&user->guard);
     233        if (list_empty(&user->in_events.list)) {
     234                char next_byte = 0;
     235                /* Skip zeros, bail-out on error. */
     236                while (next_byte == 0) {
     237                        int rc = telnet_user_recv_next_byte_no_lock(user, &next_byte);
     238                        DEBUG("Got %d.\n", next_byte);
     239                        if (rc != EOK) {
     240                                fibril_mutex_unlock(&user->guard);
     241                                return rc;
     242                        }
     243                }
     244
     245                /* CR-LF conversions. */
     246                if (next_byte == 13) {
     247                        next_byte = 10;
     248                }
     249
     250                kbd_event_t *down = new_kbd_event(KEY_PRESS, next_byte);
     251                kbd_event_t *up = new_kbd_event(KEY_RELEASE, next_byte);
     252                assert(down);
     253                assert(up);
     254                prodcons_produce(&user->in_events, &down->link);
     255                prodcons_produce(&user->in_events, &up->link);
     256        }
     257
     258        link_t *link = prodcons_consume(&user->in_events);
     259        kbd_event_t *tmp = list_get_instance(link, kbd_event_t, link);
     260
     261        fibril_mutex_unlock(&user->guard);
     262
     263        *event = *tmp;
     264
     265        free(tmp);
     266
     267        return EOK;
     268}
    174269
    175270/**
Note: See TracChangeset for help on using the changeset viewer.