Changeset 99c2e9f3 in mainline for uspace/srv/hid/remcons/user.c
- Timestamp:
- 2012-01-12T09:29:00Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2a180307
- Parents:
- 261bbdc
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/remcons/user.c
r261bbdc r99c2e9f3 172 172 } 173 173 174 /** Tell whether the launched task already exited and socket is already closed. 175 * 176 * @param user Telnet user in question. 177 */ 178 bool 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 */ 191 static 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 */ 217 static 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 230 int 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 } 174 269 175 270 /**
Note:
See TracChangeset
for help on using the changeset viewer.