ftp.nice.ch/pub/next/unix/communication/pcomm.NIHS.bs.tar.gz#/pcomm/Source/di_win.c

This is di_win.c in view mode; [Download] [Up]

/*
 * The dialing window routines.
 */

#define MAX_PASS	25

#include <stdio.h>
#include <curses.h>
#include "config.h"
#include "dial_dir.h"
#include "misc.h"
#include "modem.h"
#include "param.h"

/*
 * The dialing window.  Its job is to kill the input routine, get a port,
 * cycle thru the entries in the queue, while interpreting both the
 * user's requests and the modem's responses.  A non-zero return code
 * means we're ready to fire up the input routine.
 */

int
dial_win()
{
	extern int rc_index, fd;
	WINDOW *di_win, *newwin();
	int i, j, key, want_out, pass, tic, baud;
	static int can_sync();
	long now, time();
	char *tbuf, *ctime(), *str, cr=13, *read_codes();
	void dial_it(), delay_times(), input_off();
	void error_win(), line_set(), hang_up(), zap_vs(), log_calls();
	static void disp_queue();
	unsigned int sleep();
					/* are we already talking? */
	input_off();
	hang_up(VERBOSE);

	touchwin(stdscr);
	refresh();

	/*
	 * If the phone number points to NULL, then either you're on a
	 * direct line, or you want to do the dialing yourself.
	 */
	if (*dir->number[dir->q_num[0]] == '\0') {
					/* check LD permission */
		if (limit_ld(0))
			return(0);

		if (get_port())
			return(0);
					/* can't talk directly to OBM */
		if (!strcmp(modem->mname[modem->m_cur], "OBM")) {
			error_win(0, "Can't access the On Board Modem directly",
			 "You must use the automatic dialing feature");
			return(0);
		}

		zap_vs();
		touchwin(stdscr);
		clear();
		printw("Connected to /dev/%s at %d baud...\n", modem->tty[modem->t_cur], dir->baud[dir->d_cur]);
		refresh();
		return(1);
	}

	di_win = newwin(17, 70, 3, 5);
					/* the basic window */
	mvwattrstr(di_win, 1, 20, A_BOLD, "D I A L I N G       W I N D O W");
	horizontal(di_win, 2, 0, 70);
	mvwaddstr(di_win, 4, 23, "System name:");
	mvwaddstr(di_win, 5, 23, "Pass number:");
	mvwaddstr(di_win, 6, 14, "Elapse time this try:");
	mvwaddstr(di_win, 7, 13, "Time at start of dial:");
	mvwaddstr(di_win, 8, 9, "Time at start of this try:");
	mvwaddstr(di_win, 9, 16, "Connect delay time:");
	mvwaddstr(di_win, 10, 17, "Redial delay time:");
	mvwaddstr(di_win, 11, 24, "Script/TTY:");
	mvwaddstr(di_win, 12, 16, "Result of last try:");

	mvwaddstr(di_win, 14, 3, "<SPACE>: Recycle");
	mvwaddstr(di_win, 14, 22, "<DEL>: Remove from queue");
	mvwaddstr(di_win, 14, 49, "E: Change delays");

					/* the start time */
	time(&now);
	tbuf = ctime(&now);
	tbuf[19] = '\0';
	mvwaddstr(di_win, 7, 36, &tbuf[11]);

	mvwprintw(di_win, 9, 36, "%-4d", param->c_delay);
	mvwprintw(di_win, 10, 36, "%-4d", param->r_delay);

	box(di_win, VERT, HORZ);
	mvwaddstr(di_win, 16, 24, " Press <ESC> to abort ");

	pass = 0;
	i = 0;
	want_out = 0;
	while (!want_out && pass <= MAX_PASS) {
		key = -1;
		pass++;
					/* update the d_cur variable */
		dir->d_cur = dir->q_num[i];
					/* check LD permission */
		if (limit_ld(i)) {
			want_out++;
			break;
		}
					/* get a port */
		if (get_port()) {
			want_out++;
			break;
		}
					/* fill in the window */
		disp_queue(di_win, dir->d_cur, pass);

		/*
		 * The actual dial routine.  The "i" is the index into the
		 * queue, not the entry number.  Returns immediately without
		 * waiting for a carrier.
		 */
		dial_it(i);
		tty_flush(fd, 0);

		/*
		 * Here we do a time-slice between reading the result codes
		 * from the modem and reading the keyboard.  The one second
		 * granularity won't be too accurate, but who cares?
		 */
		tic = 0;
		rc_index = 0;
		while (tic < param->c_delay) {
			if ((str = read_codes()) == NULL) {
				mvwprintw(di_win, 6, 36, "%-4d", ++tic);
				wrefresh(di_win);
			}
			else {
				/*
				 * A return code that converts to an number
				 * that is less than 300 is probably an error
				 * message.
				 */
				baud = atoi(str);
				if (baud < 300) {
					mvwprintw(di_win, 12, 36, "%-20.20s", str);
					wmove(di_win, 12, 36);
					wrefresh(di_win);
					break;
				}
					/* we're connected */
				beep();
				clear_line(di_win, 12, 36, TRUE);
				wattrstr(di_win, A_BLINK, "CONNECTED");
				wmove(di_win, 12, 36);
				wrefresh(di_win);
				wait_key(di_win, 2);
				delwin(di_win);

				/*
				 * Did the modem sync at a different baud
				 * rate than what we expected?
				 */
				if (dir->baud[dir->d_cur] != baud) {
					if (can_sync(baud)) {
						dir->baud[dir->d_cur] = baud;
						line_set();
					}
				}

				zap_vs();
				touchwin(stdscr);
				clear();
				printw("Connected to %s at %d baud...\n",
				 dir->name[dir->d_cur], dir->baud[dir->d_cur]);
				refresh();

					/* log the call */
				log_calls(i);
				return(1);
			}
			if (tic == param->c_delay)
				break;
					/* ok... try the keyboard */
			if ((key = wait_key(di_win, 1)) != -1)
				break;

			mvwprintw(di_win, 6, 36, "%-4d", ++tic);
			wrefresh(di_win);
		}
		/*
		 * If the modem did not return a code, then we need to
		 * stop it.  Sending a CR will stop most modems cold,
		 * except of course for the OBM...
		 */
		if (str == NULL) {
			if (!strcmp(modem->mname[modem->m_cur], "OBM"))
				hang_up(QUIET);
			else
				write(fd, &cr, 1);
			sleep(2);
		}
					/* if we get here, no key was pressed */
		if (key == -1) {
			clear_line(di_win, 6, 14, TRUE);
			mvwaddstr(di_win, 6, 27, "Pausing:");
					/* no return code? */
			if (str == NULL) {
				clear_line(di_win, 12, 36, TRUE);
				waddstr(di_win, "TIMED OUT");
				wmove(di_win, 12, 36);
			}
					/* do the pause */
			tic = 0;
			while (tic < param->r_delay) {
				if ((key = wait_key(di_win, 1)) != -1)
					break;
				mvwprintw(di_win, 6, 36, "%-4d", ++tic);
				wrefresh(di_win);
			}
			clear_line(di_win, 6, 14, TRUE);
			waddstr(di_win, "Elapse time this try:");
		}
		mvwaddstr(di_win, 6, 36, "0   ");
					/* Process the keystroke */
		switch (key) {
			case ' ':	/* next in the queue */
				clear_line(di_win, 12, 36, TRUE);
				waddstr(di_win, "RECYCLED");
				wmove(di_win, 12, 36);
				wrefresh(di_win);
				/* fall thru... */
			case -1:	/* no key was pressed */
				i++;
				if (i > NUM_QUEUE)
					i = 0;
				if (dir->q_num[i] == -1)
					i = 0;
				break;
			case DEL:	/* <DEL> key, remove from queue */
				if (dir->q_num[1] == -1) {
					beep();
					clear_line(di_win, 12, 36, TRUE);
					waddstr(di_win, "NO MORE ENTRIES");
					wmove(di_win, 12, 36);
					wrefresh(di_win);
					wait_key(di_win, 3);
					break;
				}
				clear_line(di_win, 12, 36, TRUE);
				waddstr(di_win, "ENTRY DELETED");
				wmove(di_win, 12, 36);
				wrefresh(di_win);
				wait_key(di_win, 3);

					/* compact the queue */
				for (j=i; j<NUM_QUEUE-1; j++)
					dir->q_num[j] = dir->q_num[j+1];
				dir->q_num[NUM_QUEUE-1] = -1;

				if (dir->q_num[i] == -1)
					i = 0;
				break;
			case 'e':
			case 'E':	/* change delay time */
				delay_times();
				touchwin(di_win);
				mvwprintw(di_win, 9, 36, "%-4d", param->c_delay);
				mvwprintw(di_win, 10, 36, "%-4d", param->r_delay);
				break;
			case ESC:	/* <ESC> key */
				beep();
				clear_line(di_win, 12, 36, TRUE);
				wattrstr(di_win, A_BLINK, "DIAL ABORTED");
				wmove(di_win, 12, 36);
				wrefresh(di_win);
				wait_key(di_win, 3);
				want_out++;
				break;
			default:
				beep();
				break;
		}
	}
					/* clean up and go home */
	werase(di_win);
	wrefresh(di_win);
	delwin(di_win);
	if (!want_out)
		error_win(0, "Exceeded the maximum number number of dialing attempts", "");
	return(0);
}

/*
 * Display what info we know at this time.
 */

static void
disp_queue(win, entry, pass)
WINDOW *win;
int entry, pass;
{
	long now, time();
	char *tbuf, *ctime();
	void st_line();
					/* redo the status line */
	st_line("");
					/* system name */
	clear_line(win, 4, 36, TRUE);
	waddstr(win, dir->name[entry]);
					/* pass number */
	mvwprintw(win, 5, 36, "%-4d", pass);
					/* time of this call */
	time(&now);
	tbuf = ctime(&now);
	tbuf[19] = '\0';
	mvwaddstr(win, 8, 36, &tbuf[11]);
					/* the script field */
	clear_line(win, 11, 36, TRUE);
	waddstr(win, dir->script[entry]);

	wmove(win, 12, 36);
	wrefresh(win);
	return;
}

/*
 * Determine if the modem can detect the synchronization of the connected
 * baud rate.  We check the modem database and see if the connect string
 * is unique.  A non-zero return code means the modem can sync.
 */

static int
can_sync(baud)
int baud;
{
	int i;
	char *str;
					/* feature disabled? */
	if (modem->auto_baud[modem->m_cur] != 'Y')
		return(0);
					/* re-construct the string */
	switch (baud) {
		case 300:
			str = modem->con_3[modem->m_cur];
			break;
		case 1200:
			str = modem->con_12[modem->m_cur];
			break;
		case 2400:
			str = modem->con_24[modem->m_cur];
			break;
		case 4800:
			str = modem->con_48[modem->m_cur];
			break;
		case 9600:
			str = modem->con_96[modem->m_cur];
			break;
		case 19200:
			str = modem->con_192[modem->m_cur];
			break;
		default:
			return(0);
	}

	if (*str == '\0')
		return(0);
					/* test "str" against all others */
	i = 0;
	if (!strcmp(str, modem->con_3[modem->m_cur]))
		i++;
	if (!strcmp(str, modem->con_12[modem->m_cur]))
		i++;
	if (!strcmp(str, modem->con_24[modem->m_cur]))
		i++;
	if (!strcmp(str, modem->con_48[modem->m_cur]))
		i++;
	if (!strcmp(str, modem->con_96[modem->m_cur]))
		i++;
	if (!strcmp(str, modem->con_192[modem->m_cur]))
		i++;
					/* should match only itself */
	if (i == 1)
		return(1);
	return(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.