int mrutils::ColChooser::get() { if (!init_ && !(init_ = init())) { return -1; } if (building >= 0) build(); if (active == -1) { active = 0; if (!data[0].choices.empty()) data[0].highlight(0); } attrset(ATR_INPUT); int c; for (;;) { c = getch(); if (enteringSearch) { switch (c) { case '/': case '\n': enteringSearch = false; printPrompt(name.c_str()); break; case '?': enteringSearch = false; data[active].applySearch = false; data[active].resetSearch(); data[active].highlight( 0 ); break; case KEY_ESC: enteringSearch = data[active].applySearch = false; data[active].resetSearch(); data[active].highlight(0); break; case KEY_BACKSPACE: case KEY_DELETE: if (inputP == data[active].search) { enteringSearch = data[active].applySearch = false; data[active].resetSearch(); data[active].highlight(0); } else { *(--inputP) = '\0'; data[active].resetSearch(); data[active].highlight(0); printPrompt(data[active].search,"/"); } break; default: *inputP++ = c; *inputP = '\0'; data[active].resetSearch(); data[active].highlight(0); printPrompt(data[active].search,"/"); } } else { if (c == 'q' || c == ';') break; switch(c) { case KEY_ESC: case '?': if (data[active].applySearch) { data[active].applySearch = false; data[active].resetSearch(); data[active].highlight( 0 ); } break; case 'o': if (active == data.size()-1 && openFn != NULL) { (openFn)(*this,openData); redraw(); break; } case '\n': { if (!acceptReturn) break; selectNumber = 0; if (active == data.size()-1) { return depth[active]; } else { nextColumn(); } break; } case KEY_MOUSE: selectNumber = 0; if ((c = mouse()) >= 0) { if (!acceptReturn) break; return c; } break; case 'L': redraw(); break; case 'l': selectNumber = 0; nextColumn(); break; case 'h': selectNumber = 0; prevColumn(); break; case 'j': selectNumber = 0; data[active].highlightNext(); break; case 'k': selectNumber = 0; data[active].highlightPrev(); break; case '.': // repeat last command if (lastCommand[0] == '\0') break; strcpy(data[active].search, lastCommand); printPrompt(data[active].search, "sent command "); return -1; case 'x': case 'm': if (active == data.size()-1) { toggleTargetInternal(depth[active]); } break; case '>': selectNumber = 0; printPrompt(">"); enteringText = true; wattrset((WINDOW*)chooserWin,ATR_INPUT); getnstr(data[active].search,sizeof(data[active].search)); mrutils::compress(data[active].search); strcpy(lastCommand, data[active].search); if (data[active].search[0] == '\0') { resetPrompt(); enteringText = false; break; } enteringText = false; return -1; case 'p': case 'u': selectNumber = 0; data[active].pageUp(); break; case 'd': case 'n': case ' ': selectNumber = 0; data[active].pageDn(); break; case '/': inputP = data[active].search; data[active].applySearch = true; enteringSearch = true; printPrompt("search for..."); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': { if (data[active].choices.empty()) break; if (selectNumber == 0) inputP = data[active].search; int tmp = 10 * selectNumber + (c - '0'); if (tmp >= data[active].choices.size() + startIndex) { printPrompt(data[active].search); break; } else { *inputP++ = c; *inputP = '\0'; selectNumber = tmp; if (selectNumber >= data[active].head+startIndex && selectNumber <= data[active].tail+startIndex) data[active].highlight(selectNumber - startIndex, false, false); printPrompt(data[active].search); } break; } case KEY_BACKSPACE: case KEY_DELETE: if (data[active].choices.empty()) break; if (selectNumber == 0) { resetPrompt(); break; } selectNumber -= *(--inputP) - '0'; selectNumber /= 10; *inputP = '\0'; if (data[active].search[0] == '\0') { resetPrompt(); } else { if (selectNumber >= data[active].head && selectNumber <= data[active].tail) data[active].highlight(selectNumber, false, false); printPrompt(data[active].search); } break; default: resetPrompt(); } } } data[active].search[0] = '\0'; done(); return -1; }
int metaconnectcommand (struct connection_t* co, char* inputbuffer, fd_set* read_set) { int inputcount = 0; char** buffer = parse(inputbuffer, &inputcount); /* Resets the terminal to it's original launch settings */ if (!strcmp(buffer[0], RESET)) { /* Reset Terminal */ endwin(); /* Close active sockets */ close(co->LEFT_FACING_SOCKET); close(co->RIGHT_FACING_SOCKET); close(co->LEFT_FACING_SOCKET_LISTENING); cleanWindowUpper(co->OUTGOING_LEFT_WINDOW); cleanWindowUpper(co->INCOMING_LEFT_WINDOW); cleanWindowUpper(co->OUTGOING_RIGHT_WINDOW); cleanWindowUpper(co->INCOMING_RIGHT_WINDOW); cleanWindow(co->OUTGOING_LEFT_WINDOW); cleanWindow(co->INCOMING_LEFT_WINDOW); cleanWindow(co->OUTGOING_RIGHT_WINDOW); cleanWindow(co->INCOMING_RIGHT_WINDOW); cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, "Instance Reset"); /* Handle initial NO_RIGHT */ if (ORIGINAL_SETTINGS.NO_RIGHT) { putInWindowUpper(co->OUTGOING_RIGHT_WINDOW, "[NO RIGHT]"); putInWindowUpper(co->INCOMING_RIGHT_WINDOW, "[NO RIGHT]"); } /* Handle initial NO_LEFT */ if (ORIGINAL_SETTINGS.NO_LEFT) { putInWindowUpper(co->OUTGOING_LEFT_WINDOW, "[NO LEFT]"); putInWindowUpper(co->INCOMING_LEFT_WINDOW, "[NO LEFT]"); } activate(ORIGINAL_SETTINGS); } /* Puts the left side in passive listening mode */ else if (!strcmp(buffer[0], LISTENL)) { co->LEFT_REMOTE_PORT = 0; if (co->LEFT_FACING_SOCKET != SOCKET_RESET) { guiError ("Left side is already connected. Please drop left side.", *co); free (buffer); return 1; } if (inputcount > 1) { int port = atoi(buffer[1]); if (port < 1 || port > 65535) { cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, "Specified port out of range [1 - 65535]"); free(buffer); return 1; } co->LEFT_LOCAL_PORT = port; establish_passive_left(co, read_set); } else establish_passive_left(co, read_set); co->NO_LEFT = 0; } /* Puts the right side in passive listening mode */ else if (!strcmp(buffer[0], LISTENR)) { co->RIGHT_REMOTE_PORT = 0; if (co->RIGHT_FACING_SOCKET != SOCKET_RESET) { guiError ("Right side is already connected. Please drop right side.", *co); free (buffer); return 1; } if (inputcount > 1) { int port = atoi(buffer[1]); if (port < 1 || port > 65535) { cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, "Specified port out of range [1 - 65535]"); free(buffer); return 1; } co->RIGHT_LOCAL_PORT = port; establish_passive_right(co, read_set); } else establish_passive_right(co, read_set); co->NO_RIGHT = 0; } /* Attempts an active connection on the right side */ else if (!strcmp(buffer[0], CONNECTR)) { if (co->RIGHT_FACING_SOCKET != SOCKET_RESET) { guiError ("Right side is already connected. Please drop right side.", *co); free (buffer); return 1; } if (inputcount > 2) { int port = atoi(buffer[2]); if (port < 1 || port > 65535) { guiError ("Specified port out of range [1 - 65535]", *co); free(buffer); return 1; } co->RIGHT_REMOTE_PORT = port; co->RIGHT_REMOTE_ADDR = ipbydns(buffer[1]); co->RIGHT_REMOTE_DNS = buffer[1]; if (!strcmp(co->RIGHT_REMOTE_DNS, co->RIGHT_REMOTE_ADDR)) co->RIGHT_REMOTE_DNS = NULL; establish_active_right(co, read_set); } else if (inputcount > 1){ co->RIGHT_REMOTE_PORT = DEFAULT_PORT; co->RIGHT_REMOTE_ADDR = ipbydns(buffer[1]); co->RIGHT_REMOTE_DNS = buffer[1]; if (!strcmp(co->RIGHT_REMOTE_DNS, co->RIGHT_REMOTE_ADDR)) co->RIGHT_REMOTE_DNS = NULL; establish_active_right(co, read_set); } else { cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, "Must specify address for active connection attempt."); free(buffer); return 1; } cleanWindowUpper(co->INCOMING_RIGHT_WINDOW); cleanWindowUpper(co->OUTGOING_RIGHT_WINDOW); resetPrompt(co->PROMPT_WINDOW, co->PROMPT, 0); if (co->NO_RIGHT) { co->OUTPUT_DIRECTION = 1; co->NO_RIGHT = 0; } } /* Attempts an active connection on the left side */ else if (!strcmp(buffer[0], CONNECTL)) { if (co->LEFT_FACING_SOCKET != SOCKET_RESET) { guiError ("Left side is already connected. Please drop left side.", *co); free (buffer); return 1; } if (inputcount > 2) { int port = atoi(buffer[2]); if (port < 1 || port > 65535) { cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, "Specified port out of range [1 - 65535]"); free(buffer); return 1; } co->LEFT_REMOTE_PORT = port; co->LEFT_REMOTE_ADDR = ipbydns(buffer[1]); co->LEFT_REMOTE_DNS = buffer[1]; if (!strcmp(co->LEFT_REMOTE_DNS, co->LEFT_REMOTE_ADDR)) co->LEFT_REMOTE_DNS = NULL; establish_active_left(co, read_set); } else if (inputcount > 1){ co->LEFT_REMOTE_PORT = DEFAULT_PORT; co->LEFT_REMOTE_ADDR = ipbydns(buffer[1]); co->LEFT_REMOTE_DNS = buffer[1]; if (!strcmp(co->LEFT_REMOTE_DNS, co->LEFT_REMOTE_ADDR)) co->LEFT_REMOTE_DNS = NULL; establish_active_left(co, read_set); } else { cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, "Must specify address for active connection attempt."); free(buffer); return 1; } cleanWindowUpper(co->INCOMING_LEFT_WINDOW); cleanWindowUpper(co->OUTGOING_LEFT_WINDOW); resetPrompt(co->PROMPT_WINDOW, co->PROMPT, 0); if (co->NO_LEFT) { co->OUTPUT_DIRECTION = 0; co->NO_LEFT = 0; } } /* Reads input from a file and injects it into the current data stream */ else if (!strcmp(buffer[0], READ)) { char temp[100]; if (inputcount > 1) { char readsend[BUFFER_SIZE]; FILE *fp = fopen(buffer[1], "r"); if (fp == 0) { cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, "Failed to open specified file."); free(buffer); return 1; } fgets(readsend, BUFFER_SIZE-1, fp); readsend[BUFFER_SIZE] = '\0'; fclose(fp); if (!co->NO_RIGHT && (co->OUTPUT_DIRECTION || co->NO_LEFT) && co->RIGHT_FACING_SOCKET != SOCKET_RESET) { if (!co->LOOP_RIGHT) datatoright(readsend, co); else datatoleft(readsend, co); } if (!co->NO_LEFT && (!co->OUTPUT_DIRECTION || co->NO_RIGHT) && co->LEFT_FACING_SOCKET != SOCKET_RESET) { if (!co->LOOP_LEFT) datatoleft(readsend, co); else datatoright(readsend, co); } if (co->OUTPUT_DIRECTION) snprintf(temp, 100, "'%s' read and sent to right side", buffer[1]); else snprintf(temp, 100, "'%s' read and sent to left side", buffer[1]); cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, temp); } else { cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); putInPromptLower(co->PROMPT_WINDOW, "Must specify read file."); } } /* Default escape action */ else { cleanPrompt(co->PROMPT_WINDOW, &co->PROMPT); free (buffer); return 0; } free(buffer); return 1; }