home *** CD-ROM | disk | FTP | other *** search
- #define EXPRO 0
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdarg.h>
- #include <signal.h>
-
- #include "akbd.h"
- #if EXPRO
- #include "exprofle.h"
- #endif
- /*
- #include "usProfiler.h"
- */
- #include "wimpt.h"
- #include "res.h"
- #include "resspr.h"
- #include "template.h"
- void template_update_fonts(void);
- #include "dbox.h"
- #include "flex.h"
- #include "heap.h"
- #include "kernel.h"
- #include "event.h"
- #include "visdelay.h"
- #include "baricon.h"
- #include "menu.h"
- #include "saveas.h"
- #include "werr.h"
- #include "wimp.h"
- #include "win.h"
- #include "alarm.h"
- #include "global.h"
- #include "config.h"
- #include "cmdparse.h"
- #include "misc.h"
- #include "driver.h"
- #include "Terminal.h"
- #include "vterm.h"
- #include "import.h"
- #include "session.h"
- #include "files.h"
-
- extern void cmdparse_init(void);
-
- extern void vterm_setmenudir(char *dir);
-
- #define Icon_Menu_Info 1
- #define Icon_Menu_Keypad 2
- #define Icon_Menu_Colours 3
- #define Icon_Menu_Quit 4
-
- Terminal *MWin = NULL;
- Terminal *TWin = NULL;
-
- static BOOL Trace_Window_Open = FALSE;
-
- static menu Icon_Menu;
-
- static int doscale(int, char **);
- static int dostatus(int, char **);
- static int doterminal(int, char **);
- static void Icon_MenuProc(void *, char *);
- static void Icon_Click(wimp_i);
- static void Alarm_Handler(int, void *);
- static void Signal_Proc(int);
- static void event_handler(wimp_eventstr *e, void *handle);
-
- int term_type = -1;
-
- int32 wimp_ver;
- static char term_name[12];
-
- static int (*terminal_driver)(int,...);
- extern int (*pipe_load(char *))(int,...);
-
- extern char version[];
- extern char arc_vs[];
- extern char compile_date[];
-
- extern char startup[];
- extern char menus[];
-
- /* extern BOOL scale; */
-
- static struct cmds wincmds[] = {
- "scale", doscale, 0, NULLCHAR, NULLCHAR,
- "status", dostatus, 0, NULLCHAR, NULLCHAR,
- "terminal", doterminal, 0, NULLCHAR, NULLCHAR,
- NULLCHAR,
- };
-
- int dowin(int argc, char **argv)
- {
- return subcmd(wincmds, argc, argv);
- }
-
- int docredits(int argc, char **argv)
- {
- vterm_printf(MWin->vt, ATTRIB_BOLD | ATTRIB_REVERSE, " KA9Q Internet Protocol Package, v%s \r\n", version);
- vterm_printf(MWin->vt, 0, " Original program copyright 1988 by Phil Karn, KA9Q\r\n");
- vterm_printf(MWin->vt, 0, " NET/ROM support copyright 1989 by Dan Frank, W9NK\r\n") ;
- vterm_printf(MWin->vt, 0, " Original Acorn Archimedes port by Jonathan Naylor, G4KLX\r\n");
- vterm_printf(MWin->vt, 0, " VTLib VTxxx Terminals (c) 1994 Adam Goodfellow\r\n\r\n");
- vterm_printf(MWin->vt, 0, " Currently maintained by Anthony Frost G8UDV, vulch@kernow.demon.co.uk\r\n");
- vterm_printf(MWin->vt, 0, " and Adam Goodfellow, adam@comptech.demon.co.uk\r\n");
- vterm_printf(MWin->vt, 0, " Further work by Thomas Aeby, Andrew Draper, Peter Burwood, Gav Maxell\r\n");
- vterm_printf(MWin->vt, 0, " Tom Hughes, Geoff Riley, Paul Allen, and others!\r\n");
- vterm_printf(MWin->vt, ATTRIB_BOLD, "\r\n This is Arc version %s, compiled %s\r\n\r\n", arc_vs, compile_date);
- vterm_printf(MWin->vt, ATTRIB_ULINE, " Bug reports and comments to tcpip2@comptech.demon.co.uk please. \r\n\r\n");
-
- return(FALSE);
- }
-
- int doterminal(int argc, char **argv)
- {
- int ports, loop;
-
- if (argc == 1)
- {
- cwprintf(NULL, "Using %s terminal", term_type < 0 ? "internal" : "external");
- if (term_type != -1)
- cwprintf(NULL, " with %s driver\r\n", term_name);
- else
- cwprintf(NULL, "\r\n");
- }
- else
- {
- if (argc > 1 && strnlcmp(argv[1], "external", MIN(strlen(argv[1]), 8)) == 0)
- {
- terminal_driver = pipe_load(argv[2]);
- ports = ((int *) terminal_driver)[49];
- for (loop = 0; loop < ports / 0x1000000; loop++)
- (terminal_driver)(DRIVER_INITIALISE, loop);
- term_type = 0;
- strcpy(term_name, argv[2]);
- vterm_close(TWin->vt);
- vterm_close(MWin->vt);
- /* Window_Close(MWin);
- Window_Close(TWin); */
- }
- if (strnlcmp(argv[1], "internal", MIN(strlen(argv[1]), 8)) == 0)
- {
- /* wimp_wstate state;
- wimp_get_wind_state(MWin->Window_Handle, &state);
- wimp_open_wind(&state.o); */
- vterm_open(MWin->vt);
- term_type = -1;
- }
- }
- docredits(0, NULL);
- return(FALSE);
- }
-
- static int doscale(int argc, char **argv)
- {
- /* Removed by adam - new terminals don't allow this
- if (argc == 1)
- {
- cwprintf(NULL, "scaling is %s\r\n", (scale) ? "on" : "off");
- }
- else
- {
- if (stricmp(argv[1], "on") == 0)
- {
- scale = TRUE;
- }
- else
- {
- scale = FALSE;
- }
- }
- */
- cwprintf(NULL, "Sorry - terminal scaling no longer supported\r\n.");
- return 0;
- }
-
- static int dostatus(int argc, char **argv)
- {
- argc = argc;
- argv = argv;
-
- cwprintf(NULL, "trace window: status:%s\r\n", (Trace_Window_Open) ? "open" : "closed");
-
- return(0);
- }
-
- static BOOL remote_message(wimp_eventstr *event, void *handle)
- {
- extern struct cmds cmds[];
-
- if (event->e == wimp_ESEND)
- {
- if (event->data.msg.hdr.action == 0x823F0)
- {
- /* cwprintf(MWin, "%s\r\n", event->data.msg.data.chars); */
- cmdparse(cmds, event->data.msg.data.chars, MWin);
- return(TRUE);
- }
- }
- return(FALSE);
- }
-
- static BOOL change_fonts(wimp_eventstr *event, void *handle)
- {
- switch (event->e)
- {
- case wimp_ESEND:
- case wimp_ESENDWANTACK:
- switch (event->data.msg.hdr.action) {
- case wimp_MMODECHANGE:
- template_update_fonts();
- break;
- }
- }
- return(FALSE);
- }
-
- int main(int argc, char *argv[])
- {
- #if EXPRO
- exprofle_init("<TCPIP$Dir>.profile");
- #endif
- /*
- #if FALSE
- profiler__initialise("<TCPIP$Dir>.profile");
- #endif
- */
- wimp_ver = wimpt_init("TCP/IP");
- res_init(APPNAME);
- flex_init();
- _kernel_register_slotextend(flex_budge);
- resspr_init();
- template_use_fancyfonts();
- template_init();
- dbox_init();
- visdelay_init();
- alarm_init();
- cmdparse_init();
- vterm_setmenudir(menus);
- if (!vterm_initialise())
- werr(1, "Terminal initialisation failed");
-
-
- argc = argc;
- argv = argv;
- /*
- signal(SIGABRT, Signal_Proc);
- signal(SIGFPE, Signal_Proc);
- signal(SIGILL, Signal_Proc);
- signal(SIGINT, Signal_Proc);
- signal(SIGSEGV, Signal_Proc);
- signal(SIGTERM, Signal_Proc);
- signal(SIGSTAK, Signal_Proc);
- signal(8, Signal_Proc);
- signal(9, Signal_Proc);
- */
- visdelay_begin();
-
- if ((Icon_Menu = menu_new("TCP/IP", ">Info,Keypad\x8c,>Colours,Quit")) == NULL)
- {
- visdelay_end();
- return(1);
- }
-
- baricon("!tcpip", (int)wimp_baseofsprites(), Icon_Click);
-
- if (!event_attachmenu(win_ICONBAR, Icon_Menu, Icon_MenuProc, 0))
- {
- visdelay_end();
- return(1);
- }
- win_register_event_handler(win_ICONBARLOAD, event_handler, 0);
-
- wimp_save_fp_state_on_poll();
-
- if (TWin = Window_Open(NULL, "Trace Window", term_DONT_OPEN | term_DONT_DESTROY | term_NO_INPUT), TWin == NULL)
- {
- visdelay_end();
- return(1);
- }
-
- if (MWin = Window_Open(NULL, "TCPIP Command Window", term_CARET | term_DONT_DESTROY), MWin == NULL)
- {
- visdelay_end();
- return(1);
- }
- win_add_unknown_event_processor(remote_message, NULL);
- win_add_unknown_event_processor(change_fonts, NULL);
- /*
- win_add_unknown_event_processor(wimptcp_message_handler, NULL);
- */
- net_init(argc-1, argv+1);
-
- visdelay_end();
-
- alarm_set(alarm_timenow() + 1, Alarm_Handler, 0);
-
- while (TRUE)
- event_process();
-
- return(0);
- }
-
- static void Icon_MenuProc(void *Handle, char *Hit)
- {
- char buffer[50];
- dbox d;
-
- Handle = Handle;
-
- switch (Hit[0])
- {
- case Icon_Menu_Info:
- if ((d = dbox_new("progInfo")) == NULL)
- return;
- sprintf(buffer, "%s (%s)", arc_vs, compile_date);
- dbox_setfield(d, 4, buffer);
- dbox_show(d);
- dbox_fillin(d);
- dbox_dispose(&d);
- break;
-
- case Icon_Menu_Keypad:
- vterm_keypad();
- break;
-
- case Icon_Menu_Colours:
- vterm_coloursdbox();
- break;
-
- case Icon_Menu_Quit:
- if (akbd_pollctl() && akbd_pollsh())
- exit(0); /* Put this in so I can quit and restart on-line (Adam) */
- else
- net_exit();
- break;
- default:
- break;
- }
- }
-
- static void Icon_Click(wimp_i Icon)
- {
- wimp_wstate state;
-
- Icon = Icon;
-
- if (term_type == -1)
- {
- vterm_open(MWin->vt);
- /* wimp_get_wind_state(MWin->Window_Handle, &state);
- wimp_open_wind(&state.o); */
- }
- }
-
- static void Alarm_Handler(int Time, void *Handle)
- {
- int c;
-
- Handle = Handle;
- Time = Time;
-
- if (term_type != -1)
- {
- while (c = (terminal_driver)(DRIVER_GETBYTE, 0x00), c >= 0)
- net_keyboard(c);
- }
- /* swapped these two round to solve a problem with
- recvr lockup during DNS */
- alarm_set(alarm_timenow() + 1, Alarm_Handler, 0);
- net_poll();
- }
-
- void cwputs(Terminal *port, char *s)
- {
- if (term_type == -1)
- {
- Window_Write(port, s, strlen(s));
- }
- else
- {
- while(*s)
- (terminal_driver)(DRIVER_PUTBYTE, 0x00, *s++);
- }
- }
-
- void cwnputs(Terminal *port, char *s, int n)
- {
- if (term_type == -1)
- {
- Window_Write(port, s, n);
- }
- else
- {
- int i;
- for (i=0; i<n; i++)
- (terminal_driver)(DRIVER_PUTBYTE, 0x00, s[i]);
- }
- }
-
- int cwprintf(Terminal *port, char *fmt, ...)
- {
- va_list args;
- static char Buffer[1000];
- int cnt;
-
- va_start(args, fmt);
- cnt = vsprintf(Buffer, fmt, args);
- va_end(args);
-
- cwputs(port, Buffer);
-
- return(cnt);
- }
-
- int cwputchar(Terminal *port, int c)
- {
- if (term_type == -1)
- {
- if (port)
- Window_Write(port, (char *) &c, 1);
- else
- Window_Write(MWin, (char *) &c, 1);
- }
- else
- {
- (terminal_driver)(DRIVER_PUTBYTE, 0x00, c);
- }
- return(c);
- }
-
- int cwtitle(Terminal *port, char *fmt, ...)
- {
- va_list args;
- static char Buffer[100];
- int cnt;
-
- va_start(args, fmt);
- cnt = vsprintf(Buffer, fmt, args);
- va_end(args);
- /*
- if (port)
- win_settitle(port->Window_Handle, Buffer);
- else
- win_settitle(MWin->Window_Handle, Buffer);
- */
- if (port)
- vterm_title(port->vt, Buffer);
- else
- vterm_title(MWin->vt, Buffer);
-
- return(cnt);
- }
-
- void twopen(void)
- {
- if (!Trace_Window_Open)
- {
- /*
- wimp_wstate state;
- wimp_get_wind_state(TWin->Window_Handle, &state);
- wimp_open_wind(&state.o); */
- vterm_open(TWin->vt);
- Trace_Window_Open = TRUE;
- }
- }
-
- void twclose(void)
- {
- vterm_close(TWin->vt);
- /* Window_Close(TWin); */
- Trace_Window_Open = FALSE;
- }
-
- void twputs(char *s)
- {
- Window_Write(TWin, s, strlen(s));
- }
-
- int twprintf(char *fmt, ...)
- {
- va_list args;
- static char Buffer[1000];
- int cnt;
-
- va_start(args, fmt);
- cnt = vsprintf(Buffer, fmt, args);
- va_end(args);
-
- twputs(Buffer);
-
- return(cnt);
- }
-
- int twputchar(int c)
- {
- Window_Write(TWin, (char *) &c, 1);
- return(c);
- }
-
- void panic(char *fmt, ...)
- {
- static char Buffer[500];
- va_list args;
-
- va_start(args, fmt);
- vsprintf(Buffer, fmt, args);
- va_end(args);
-
- werr(TRUE, Buffer);
- }
-
- static void Signal_Proc(int Signal)
- {
- switch (Signal)
- {
- case SIGABRT:
- werr(TRUE, "Abort signal received");
- break;
- case SIGFPE:
- werr(TRUE, "Arithmetic exception");
- break;
- case SIGILL:
- werr(TRUE, "Illegal instruction");
- break;
- case SIGINT:
- werr(TRUE, "Attention requested from user");
- break;
- case SIGSEGV:
- werr(TRUE, "Bad memory access");
- break;
- case SIGTERM:
- werr(TRUE, "Termination request");
- break;
- case SIGSTAK:
- werr(TRUE, "Stack overflow");
- break;
- default:
- werr(TRUE, "Signal number %d", Signal);
- break;
- }
- }
-
- static void event_handler(wimp_eventstr *e, void *handle)
- {
- switch (e->e)
- {
- case wimp_ESEND:
- case wimp_ESENDWANTACK:
- switch (e->data.msg.hdr.action) {
- case wimp_MDATALOAD:
- {
- int type;
- char name[256];
- if (import_ack(name, &type))
- vterm_replay(name);
- }
- break;
- }
- }
- }
-
- int doterm(int argc, char **argv)
- {
- if (argc<2)
- return 1;
-
- if (!strcmp(argv[1], "*"))
- {
- strcpy(argv[1], "\\"); /* Overwrite the * in the command */
- vterm_parse(MWin->vt, argc-1, argv+1);
- return 0;
- }
- else
- {
- if (current!=NULLSESSION)
- {
- strcpy(argv[0], "\\"); /* Overwrite the original terminal command */
- vterm_parse(current->window->vt, argc, argv);
- return 0;
- }
- else
- {
- cwprintf(NULL, "No current session\r\n");
- return 1;
- }
- }
- return 1;
- }
-