static void lnp_console_execute_command(char *out_buffer, int buffer_len, int function_id, char *args) { switch (function_id) { case COMMAND_ID: console_id(out_buffer, buffer_len, args); break; case COMMAND_WRITE: console_write(out_buffer, buffer_len, args); break; case COMMAND_READ: console_read(out_buffer, buffer_len, args); break; case COMMAND_FLUSH: console_flush(out_buffer, buffer_len, args); break; case COMMAND_CONNECTIONS: console_connections(out_buffer, buffer_len, args); break; case COMMAND_HISTORY: console_history(out_buffer, buffer_len, args); break; case COMMAND_CONNECT: console_connect(out_buffer, buffer_len, args); break; case COMMAND_KEYS: console_print_keys(out_buffer, buffer_len, args); break; } }
static BOOL console_readConsole(HANDLE conIn, char* buf, int len, int* pRed, int *key) { DWORD recordIndex, bufferIndex, toRead, red; PINPUT_RECORD pInput; GetNumberOfConsoleInputEvents(conIn, &toRead); if (len < (int)toRead) { toRead = len; } if (toRead == 0) { return(FALSE); } if ((pInput = (PINPUT_RECORD) malloc(toRead * sizeof(INPUT_RECORD))) == NULL) { return (FALSE); } *key = 0; ReadConsoleInput(conIn, pInput, toRead, &red); for (recordIndex = bufferIndex = 0; recordIndex < red; recordIndex++) { KEY_EVENT_RECORD keyEvent = pInput[recordIndex].Event.KeyEvent; if (pInput[recordIndex].EventType == KEY_EVENT && keyEvent.bKeyDown) { if (keyEvent.wVirtualKeyCode == 38 && keyEvent.wVirtualScanCode == 72) { buf[0] = 0; console_history(buf, -1); *key = KEY_UP; bufferIndex += (DWORD)strlen(buf); } if (keyEvent.wVirtualKeyCode == 40 && keyEvent.wVirtualScanCode == 80) { buf[0] = 0; console_history(buf, 1); *key = KEY_DOWN; bufferIndex += (DWORD)strlen(buf); } if (keyEvent.wVirtualKeyCode == 112 && keyEvent.wVirtualScanCode == 59) { console_fnkey_pressed(1); } if (keyEvent.wVirtualKeyCode == 113 && keyEvent.wVirtualScanCode == 60) { console_fnkey_pressed(2); } if (keyEvent.wVirtualKeyCode == 114 && keyEvent.wVirtualScanCode == 61) { console_fnkey_pressed(3); } if (keyEvent.wVirtualKeyCode == 115 && keyEvent.wVirtualScanCode == 62) { console_fnkey_pressed(4); } if (keyEvent.wVirtualKeyCode == 116 && keyEvent.wVirtualScanCode == 63) { console_fnkey_pressed(5); } if (keyEvent.wVirtualKeyCode == 117 && keyEvent.wVirtualScanCode == 64) { console_fnkey_pressed(6); } if (keyEvent.wVirtualKeyCode == 118 && keyEvent.wVirtualScanCode == 65) { console_fnkey_pressed(7); } if (keyEvent.wVirtualKeyCode == 119 && keyEvent.wVirtualScanCode == 66) { console_fnkey_pressed(8); } if (keyEvent.wVirtualKeyCode == 120 && keyEvent.wVirtualScanCode == 67) { console_fnkey_pressed(9); } if (keyEvent.wVirtualKeyCode == 121 && keyEvent.wVirtualScanCode == 68) { console_fnkey_pressed(10); } if (keyEvent.wVirtualKeyCode == 122 && keyEvent.wVirtualScanCode == 87) { console_fnkey_pressed(11); } if (keyEvent.wVirtualKeyCode == 123 && keyEvent.wVirtualScanCode == 88) { console_fnkey_pressed(12); } if (keyEvent.uChar.AsciiChar == 9) { *key = KEY_TAB; break; } if (keyEvent.uChar.AsciiChar == 27) { *key = CLEAR_OP; break; } if (keyEvent.wVirtualKeyCode == 37 && keyEvent.wVirtualScanCode == 75) { *key = KEY_LEFT; } if (keyEvent.wVirtualKeyCode == 39 && keyEvent.wVirtualScanCode == 77) { *key = KEY_RIGHT; } if (keyEvent.wVirtualKeyCode == 45 && keyEvent.wVirtualScanCode == 82) { *key = KEY_INSERT; } while (keyEvent.wRepeatCount && keyEvent.uChar.AsciiChar) { buf[bufferIndex] = keyEvent.uChar.AsciiChar; if (buf[bufferIndex] == '\r') { buf[bufferIndex] = '\n'; } bufferIndex++; keyEvent.wRepeatCount--; } } } free(pInput); *pRed = bufferIndex; return (TRUE); }
static int console_bufferInput (char* addchars, int len, char *cmd, int key) { static int iCmdBuffer = 0; static int iCmdCursor = 0; static int ignoreNext = 0; static int insertMode = 1; static COORD orgPosition; static char prompt [80]; int iBuf; int i; HANDLE hOut; CONSOLE_SCREEN_BUFFER_INFO info; COORD position; hOut = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(hOut, &info); position = info.dwCursorPosition; if (iCmdCursor == 0) { orgPosition = position; } if (key == PROMPT_OP) { if (strlen(cmd) < sizeof(prompt)) { strcpy(prompt, cmd); } return 0; } if (key == KEY_TAB) { esl_console_complete(cmd, cmd+iCmdBuffer); return 0; } if (key == KEY_UP || key == KEY_DOWN || key == CLEAR_OP) { SetConsoleCursorPosition(hOut, orgPosition); for (i = 0; i < (int)strlen(cmd); i++) { printf(" "); } SetConsoleCursorPosition(hOut, orgPosition); iCmdBuffer = 0; iCmdCursor = 0; memset(cmd, 0, CMD_BUFLEN); } if (key == DELETE_REFRESH_OP) { int l = len < (int)strlen(cmd) ? len : (int)strlen(cmd); for (i = 0; i < l; i++) { cmd[--iCmdBuffer] = 0; } iCmdCursor = (int)strlen(cmd); printf("%s", prompt); GetConsoleScreenBufferInfo(hOut, &info); orgPosition = info.dwCursorPosition; printf("%s", cmd); return 0; } if (key == KEY_LEFT) { if (iCmdCursor) { if (position.X == 0) { position.Y -= 1; position.X = info.dwSize.X-1; } else { position.X -= 1; } SetConsoleCursorPosition(hOut, position); iCmdCursor--; } } if (key == KEY_RIGHT) { if (iCmdCursor < (int)strlen(cmd)) { if (position.X == info.dwSize.X-1) { position.Y += 1; position.X = 0; } else { position.X += 1; } SetConsoleCursorPosition(hOut, position); iCmdCursor++; } } if (key == KEY_INSERT) { insertMode = !insertMode; } for (iBuf = 0; iBuf < len; iBuf++) { switch (addchars[iBuf]) { case '\r': case '\n': if (ignoreNext) { ignoreNext = 0; } else { int ret = iCmdBuffer; if (iCmdBuffer == 0) { strcpy(cmd, "Empty"); ret = (int)strlen(cmd); } else { console_history(cmd, 0); cmd[iCmdBuffer] = 0; } iCmdBuffer = 0; iCmdCursor = 0; printf("\n"); return (ret); } break; case '\b': if (iCmdCursor) { if (position.X == 0) { position.Y -= 1; position.X = info.dwSize.X-1; SetConsoleCursorPosition(hOut, position); } else { position.X -= 1; SetConsoleCursorPosition(hOut, position); } printf(" "); if (iCmdCursor < iCmdBuffer) { int pos; iCmdCursor--; for (pos = iCmdCursor; pos < iCmdBuffer; pos++) { cmd[pos] = cmd[pos+1]; } cmd[pos] = 0; iCmdBuffer--; SetConsoleCursorPosition(hOut, position); for (pos = iCmdCursor; pos < iCmdBuffer; pos++) { printf("%c", cmd[pos]); } printf(" "); SetConsoleCursorPosition(hOut, position); } else { SetConsoleCursorPosition(hOut, position); iCmdBuffer--; iCmdCursor--; cmd[iCmdBuffer] = 0; } } break; default: if (!ignoreNext) { if (iCmdCursor < iCmdBuffer) { int pos; if (position.X == info.dwSize.X-1) { position.Y += 1; position.X = 0; } else { position.X += 1; } if (insertMode) { for (pos = iCmdBuffer-1; pos >= iCmdCursor; pos--) { cmd[pos+1] = cmd[pos]; } } iCmdBuffer++; cmd[iCmdCursor++] = addchars[iBuf]; printf("%c", addchars[iBuf]); for (pos = iCmdCursor; pos < iCmdBuffer; pos++) { GetConsoleScreenBufferInfo(hOut, &info); if (info.dwCursorPosition.X == info.dwSize.X-1 && info.dwCursorPosition.Y == info.dwSize.Y-1) { orgPosition.Y -= 1; position.Y -= 1; } printf("%c", cmd[pos]); } SetConsoleCursorPosition(hOut, position); } else { if (position.X == info.dwSize.X-1 && position.Y == info.dwSize.Y-1) { orgPosition.Y -= 1; } cmd[iCmdBuffer++] = addchars[iBuf]; iCmdCursor++; printf("%c", addchars[iBuf]); } } } if (iCmdBuffer == CMD_BUFLEN) { printf("Read Console... BUFFER OVERRUN\n"); iCmdBuffer = 0; ignoreNext = 1; } } return (0); }