コード例 #1
0
ファイル: mr_colchooser.cpp プロジェクト: mikerobe/mrutils
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;

}
コード例 #2
0
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;
}