X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/075bbc718253e94387bd857b22c7bedea259651b..dadcd4fcc62ab37d4e30da805de9713521c28238:/net/rfb.c diff --git a/net/rfb.c b/net/rfb.c index ff0f089..5735db1 100644 --- a/net/rfb.c +++ b/net/rfb.c @@ -3,6 +3,8 @@ #include #include +#include "../aseg-paging/keyboard.h" + #include "lwip/tcp.h" #include "rfb.h" @@ -164,8 +166,7 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { break; } - /* potential FALL THROUGH */ - + /* FALL THROUGH to SST_NEEDS_UPDATE*/ case SST_NEEDS_UPDATE: outputf("RFB send: sending header"); /* Send a header */ @@ -182,13 +183,9 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { state->update_pos = 0; state->send_state = SST_SENDING; - /* FALL THROUGH */ - + /* FALL THROUGH to SST_SENDING*/ case SST_SENDING: - while (1) { - unsigned char mbuf[8192 /* XXX magic */]; - left = state->frame_bytes - state->update_pos; if (left == 0) { @@ -196,29 +193,21 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { break; } - if (left > 8192) + if (left > 8192) /* Sounds good enough to me. */ left = 8192; - if (left > tcp_mss(pcb)) { - sndlength = tcp_mss(pcb); - } else { - sndlength = left; - } - - memcpy(mbuf, fb->fbaddr + state->update_pos, sndlength); /* It's OK if it becomes smaller later. */ - + sndlength = left; do { - err = tcp_write(pcb, mbuf, sndlength, TCP_WRITE_FLAG_COPY /* This is my memory on the stack, thank you very much. */); - if (err == ERR_MEM) { - outputf("RFB: ERR_MEM sending %d", sndlength); + err = tcp_write(pcb, fb->fbaddr + state->update_pos, sndlength, TCP_WRITE_FLAG_COPY /* The card can't DMA from there. */); + if (err == ERR_MEM) /* Back down until lwip says we've got space. */ sndlength /= 2; - } } while (err == ERR_MEM && sndlength > 1); - if (err == ERR_OK) { - outputf("RFB: attempting send %d", sndlength); - } else { - outputf("RFB: send error %d", err); + if (err != ERR_OK) { + if (err != ERR_MEM) + outputf("RFB: send error %d", err); + + /* We'll just give up for now and come back when we have space later. */ break; } @@ -233,9 +222,7 @@ static void send_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { } if (tcp_output(pcb) != ERR_OK) - { outputf("RFB: tcp_output bailed in send_fsm?"); - } } static err_t rfb_sent(void *arg, struct tcp_pcb *pcb, uint16_t len) { @@ -353,7 +340,6 @@ static enum fsm_result recv_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { for (i = 0; i < ntohs(req->num); i++) { outputf("RFB: Encoding: %d", ntohl(req->encodings[i])); /* XXX ... */ - } state->readpos += pktsize; @@ -374,9 +360,11 @@ static enum fsm_result recv_fsm(struct tcp_pcb *pcb, struct rfb_state *state) { case KEY_EVENT: if (state->writepos < sizeof(struct key_event_pkt)) return NEEDMORE; - outputf("RFB: Key"); - /* XXX stub */ + struct key_event_pkt * p = (struct key_event_pkt *)state->data; + + outputf("RFB: Key: %d (%c)", htonl(p->keysym), (htonl(p->keysym) & 0xFF)); + kbd_inject_keysym(htonl(p->keysym), p->downflag); state->readpos += sizeof(struct key_event_pkt); return OK; @@ -460,7 +448,7 @@ static err_t rfb_recv(void *arg, struct tcp_pcb *pcb, case OK: outputf("RFB FSM: ok"); - /* Might as well send now... */ + /* Kick off a send. */ if (state->send_state == SST_IDLE && state->update_requested) { send_fsm(pcb, state);