home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / internet / tcpip / src205 / TCPIP_Src / Main / c / window < prev   
Encoding:
Text File  |  1995-03-21  |  13.7 KB  |  675 lines

  1. #define EXPRO 0
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <stdarg.h>
  7. #include <signal.h>
  8.  
  9. #include "akbd.h"
  10. #if EXPRO
  11. #include "exprofle.h"
  12. #endif
  13. /*
  14. #include "usProfiler.h"
  15. */
  16. #include "wimpt.h"
  17. #include "res.h"
  18. #include "resspr.h"
  19. #include "template.h"
  20. void template_update_fonts(void);
  21. #include "dbox.h"
  22. #include "flex.h"
  23. #include "heap.h"
  24. #include "kernel.h"
  25. #include "event.h"
  26. #include "visdelay.h"
  27. #include "baricon.h"
  28. #include "menu.h"
  29. #include "saveas.h"
  30. #include "werr.h"
  31. #include "wimp.h"
  32. #include "win.h"
  33. #include "alarm.h"
  34. #include "global.h"
  35. #include "config.h"
  36. #include "cmdparse.h"
  37. #include "misc.h"
  38. #include "driver.h"
  39. #include "Terminal.h"
  40. #include "vterm.h"
  41. #include "import.h"
  42. #include "session.h"
  43. #include "files.h"
  44. #include "bbc.h"
  45.  
  46. extern void upgrade_check(void);
  47. extern void cmdparse_init(void);
  48. extern int tcp_hasactive(void);
  49. extern void vterm_setmenudir(char *dir);
  50.  
  51. #define Icon_Menu_Info     1
  52. #define Icon_Menu_Keypad   2
  53. #define Icon_Menu_Colours  3
  54. #define Icon_Menu_Quit     4
  55.  
  56. Terminal *MWin = NULL;
  57. Terminal *TWin = NULL;
  58.  
  59. static BOOL Trace_Window_Open = FALSE;
  60.  
  61. static menu Icon_Menu;
  62. static wimp_i iconbar_icon;
  63.  
  64. static int  doscale(int, char **);
  65. static int  dostatus(int, char **);
  66. static int  doterminal(int, char **);
  67. static void Icon_MenuProc(void *, char *);
  68. static void Icon_Click(wimp_i);
  69. static void Alarm_Handler(int, void *);
  70. static void Signal_Proc(int);
  71. static void event_handler(wimp_eventstr *e, void *handle);
  72. int ask_user(char *msg, char *but0, char *but1);
  73.  
  74. int term_type = -1;
  75.  
  76. int32 wimp_ver;
  77. static char term_name[12];
  78.  
  79. static int (*terminal_driver)(int,...);
  80. extern int (*pipe_load(char *))(int,...);
  81.  
  82. extern char compile_time[];
  83. extern char compile_date[];
  84. extern char release_vrsn[];
  85. extern char release_date[];
  86.  
  87. extern char startup[];
  88. extern char menus[];
  89.  
  90. /* extern BOOL scale; */
  91.  
  92. static struct cmds wincmds[] = {
  93.   "scale",        doscale,        0, NULLCHAR, NULLCHAR,
  94.   "status",       dostatus,       0, NULLCHAR, NULLCHAR,
  95.   "terminal",     doterminal,     0, NULLCHAR, NULLCHAR,
  96.   NULLCHAR,
  97. };
  98.  
  99. int dowin(int argc, char **argv)
  100. {
  101.   return subcmd(wincmds, argc, argv);
  102. }
  103.  
  104. int docredits(int argc, char **argv)
  105. {
  106.   vterm_printf(MWin->vt, ATTRIB_BOLD | ATTRIB_REVERSE, "     KA9Q Internet Protocol Package\r\n");
  107.   vterm_printf(MWin->vt, 0, " Original program copyright 1988 by Phil Karn, KA9Q\r\n");
  108.   vterm_printf(MWin->vt, 0, " NET/ROM support copyright 1989 by Dan Frank, W9NK\r\n") ;
  109.   vterm_printf(MWin->vt, 0, " Original Acorn Archimedes port by Jonathan Naylor, G4KLX\r\n");
  110.   vterm_printf(MWin->vt, 0, " VTLib VTxxx Terminals (c) 1994 Adam Goodfellow\r\n\r\n");
  111.   vterm_printf(MWin->vt, 0, " Currently maintained by Anthony Frost G8UDV, vulch@kernow.demon.co.uk\r\n");
  112.   vterm_printf(MWin->vt, 0, " and Adam Goodfellow, adam@comptech.demon.co.uk\r\n");
  113.   vterm_printf(MWin->vt, 0, " Further work by Thomas Aeby, Andrew Draper, Peter Burwood, Gav Maxell\r\n");
  114.   vterm_printf(MWin->vt, 0, " Tom Hughes, Geoff Riley, Paul Allen, and others!\r\n");
  115.   vterm_printf(MWin->vt, ATTRIB_BOLD, "\r\n This is RISC OS version %s, compiled %s at %s\r\n\r\n", 
  116.                release_vrsn, compile_date, compile_time);
  117.   vterm_printf(MWin->vt, ATTRIB_ULINE, "    Bug reports and comments to tcpip2@comptech.demon.co.uk please. \r\n\r\n");
  118.  
  119.   return(FALSE);
  120. }
  121.  
  122. int doterminal(int argc, char **argv)
  123. {
  124.   int ports, loop;
  125.  
  126.   if (argc == 1)
  127.   {
  128.     cwprintf(NULL, "Using %s terminal", term_type < 0 ? "internal" : "external");
  129.     if (term_type != -1)
  130.       cwprintf(NULL, " with %s driver\r\n", term_name);
  131.     else
  132.       cwprintf(NULL, "\r\n");
  133.   }
  134.   else
  135.   {
  136.     if (argc > 1 && strnlcmp(argv[1], "external", MIN(strlen(argv[1]), 8)) == 0)
  137.     {
  138.       terminal_driver = pipe_load(argv[2]);
  139.       ports = ((int *) terminal_driver)[49];
  140.       for (loop = 0; loop < ports / 0x1000000; loop++)
  141.         (terminal_driver)(DRIVER_INITIALISE, loop);
  142.       term_type = 0;
  143.       strcpy(term_name, argv[2]);
  144.       vterm_close(TWin->vt);
  145.       vterm_close(MWin->vt);
  146.     }
  147.     if (strnlcmp(argv[1], "internal", MIN(strlen(argv[1]), 8)) == 0)
  148.     {
  149.       vterm_open(MWin->vt);
  150.       term_type = -1;
  151.     }
  152.   }
  153.   docredits(0, NULL);
  154.   return(FALSE);
  155. }
  156.  
  157. static int doscale(int argc, char **argv)
  158. {
  159. /* Removed by adam - new terminals don't allow this
  160.   if (argc == 1)
  161.   {
  162.     cwprintf(NULL, "scaling is %s\r\n", (scale) ? "on" : "off");
  163.   }
  164.   else
  165.   {
  166.     if (stricmp(argv[1], "on") == 0)
  167.     {
  168.       scale = TRUE;
  169.     }
  170.     else
  171.     {
  172.       scale = FALSE;
  173.     }
  174.   }
  175. */
  176.   cwprintf(NULL, "Sorry - terminal scaling no longer supported\r\n.");
  177.   return 0;
  178. }
  179.  
  180. static int dostatus(int argc, char **argv)
  181. {
  182.   argc = argc;
  183.   argv = argv;
  184.  
  185.   cwprintf(NULL, "trace window: status:%s\r\n", (Trace_Window_Open) ? "open" : "closed");
  186.  
  187.   return(0);
  188. }
  189.  
  190. static BOOL remote_message(wimp_eventstr *event, void *handle)
  191. {
  192.   extern struct cmds cmds[];
  193.  
  194.   if (event->e == wimp_ESEND)
  195.   {
  196.     if (event->data.msg.hdr.action == 0x823F0)
  197.     {
  198. /*      cwprintf(MWin, "%s\r\n", event->data.msg.data.chars); */
  199.       cmdparse(cmds, event->data.msg.data.chars, MWin);
  200.       return(TRUE);
  201.     }
  202.   }
  203.   return(FALSE);
  204. }
  205.  
  206. static char *select_iconbar_sprite(void)
  207. {
  208.   char *p;
  209.   static char *curspr = NULL;
  210.   char *sprs[] = 
  211.   { "notconn24", "connect24",
  212.     "notconn22", "connect22"
  213.   };
  214.  
  215.   p = sprs[(tcp_hasactive())|((bbc_vduvar(5)<2)<<1)];
  216.   if (p==curspr)
  217.     return NULL;
  218.   curspr = p;
  219.   return p;
  220. }
  221.  
  222. void update_iconbar(void)
  223. {
  224.   char *p;
  225.  
  226.   if (p = select_iconbar_sprite(), p!=NULL)
  227.   {
  228.     wimp_icon i;
  229.     wimp_redrawstr r;
  230.  
  231.     wimp_get_icon_info((wimp_w)-2, iconbar_icon, &i);
  232.     r.w = (wimp_w)-2;
  233.     r.box.x0 = i.box.x0;
  234.     r.box.x1 = i.box.x1;
  235.     r.box.y0 = i.box.y0;
  236.     r.box.y1 = i.box.y1;
  237.     wimp_force_redraw(&r);
  238.     baricon_newsprite(p);
  239.   }
  240. }
  241.  
  242. /*
  243.  * Ask the user a question and get an answer
  244.  */
  245. int ask_user(char *msg, char *but0, char *but1)
  246. {
  247.   dbox d;
  248.   int a;
  249.  
  250.   if (d = dbox_new("query"), d!=NULL)
  251.   {
  252.     dbox_setfield(d, 0, but0);
  253.     dbox_setfield(d, 1, but1);
  254.     dbox_setfield(d, 2, msg);
  255.  
  256.     bbc_vdu(7);
  257.     dbox_showstatic(d);
  258.     a = dbox_fillin(d);
  259.     dbox_dispose(&d);
  260.   }
  261.   return (a==0);
  262. }
  263.  
  264. static BOOL change_fonts(wimp_eventstr *event, void *handle)
  265. {
  266.   switch (event->e)
  267.   {
  268.     case wimp_ESEND:
  269.     case wimp_ESENDWANTACK:
  270.       switch (event->data.msg.hdr.action) {
  271.         case wimp_MMODECHANGE:
  272.           template_update_fonts();
  273.           update_iconbar();
  274.           break;
  275.       }
  276.   }
  277.   return(FALSE);
  278. }
  279.  
  280.  
  281. int main(int argc, char *argv[])
  282. {
  283. #if EXPRO
  284.   exprofle_init("<TCPIP$Dir>.profile");
  285. #endif
  286. /*
  287. #if FALSE
  288.   profiler__initialise("<TCPIP$Dir>.profile");
  289. #endif
  290. */
  291.   wimp_ver = wimpt_init("TCP/IP");
  292.   res_init(APPNAME);
  293.   flex_init();
  294.   _kernel_register_slotextend(flex_budge);
  295.   resspr_init();
  296.   template_use_fancyfonts();
  297.   template_init();
  298.   dbox_init();
  299.   visdelay_init();
  300.   alarm_init();
  301.   cmdparse_init();
  302.   vterm_setmenudir(menus);
  303.   if (!vterm_initialise())
  304.     werr(1, "Terminal initialisation failed");
  305.  
  306.  
  307.   argc = argc;
  308.   argv = argv;
  309.  
  310. /*
  311.   signal(SIGABRT, Signal_Proc);
  312.   signal(SIGFPE,  Signal_Proc);
  313.   signal(SIGILL,  Signal_Proc);
  314.   signal(SIGINT,  Signal_Proc);
  315.   signal(SIGSEGV, Signal_Proc);
  316.   signal(SIGTERM, Signal_Proc);
  317.   signal(SIGSTAK, Signal_Proc);
  318.   signal(8, Signal_Proc);
  319.   signal(9, Signal_Proc);
  320. */
  321.  
  322.   if ((Icon_Menu = menu_new("TCP/IP", ">Info,Keypad\x8c,>Colours,Quit")) == NULL)
  323.   {
  324.     visdelay_end();
  325.     return(1);
  326.   }
  327.  
  328.   iconbar_icon = baricon(select_iconbar_sprite(), (int)resspr_area(), Icon_Click);
  329.  
  330.   if (!event_attachmenu(win_ICONBAR, Icon_Menu, Icon_MenuProc, 0))
  331.   {
  332.     visdelay_end();
  333.     return(1);
  334.   }
  335.   win_register_event_handler(win_ICONBARLOAD, event_handler, 0);
  336.  
  337.   wimp_save_fp_state_on_poll();
  338.  
  339. /*
  340.   if (TWin = Window_Open(NULL, "Trace Window", term_DONT_OPEN | term_DONT_DESTROY | term_NO_INPUT), TWin == NULL)
  341.   {
  342.     visdelay_end();
  343.     return(1);
  344.   }
  345. */
  346.   if (MWin = Window_Open(NULL, "TCPIP Command Window", term_CARET | term_DONT_DESTROY), MWin == NULL)
  347.   {
  348.     visdelay_end();
  349.     return(1);
  350.   }
  351.   win_add_unknown_event_processor(remote_message, NULL);
  352.   win_add_unknown_event_processor(change_fonts, NULL);
  353. /*
  354.   win_add_unknown_event_processor(wimptcp_message_handler, NULL);
  355. */
  356.   /*
  357.    * This has its own wimp poll loop, so net init
  358.    * wont get called until !TCPIPUser's version number
  359.    * has been validated and auto-upgrades carried out.
  360.    */
  361.   upgrade_check();
  362.  
  363.   visdelay_begin();
  364.   net_init(argc-1, argv+1);
  365.   visdelay_end();
  366.  
  367.   alarm_set(alarm_timenow() + 1, Alarm_Handler, 0);
  368.  
  369.   while (TRUE)
  370.     event_process();
  371.  
  372.   return(0);
  373. }
  374.  
  375. static void Icon_MenuProc(void *Handle, char *Hit)
  376. {
  377.   char buffer[50];
  378.   dbox d;
  379.  
  380.   Handle = Handle;
  381.  
  382.   switch (Hit[0])
  383.   {
  384.   case Icon_Menu_Info:
  385.     if ((d = dbox_new("progInfo")) == NULL)
  386.       return;
  387.     sprintf(buffer, "%s (%s)", release_vrsn, release_date);
  388.     dbox_setfield(d, 4, buffer);
  389.     dbox_show(d);
  390.     dbox_fillin(d);
  391.     dbox_dispose(&d);
  392.     break;
  393.  
  394.   case Icon_Menu_Keypad:
  395.     vterm_keypad();
  396.     break;
  397.  
  398.   case Icon_Menu_Colours:
  399.     vterm_coloursdbox();
  400.     break;
  401.  
  402.   case Icon_Menu_Quit:
  403.     if (akbd_pollctl() && akbd_pollsh())
  404.       exit(0); /* Put this in so I can quit and restart on-line (Adam) */
  405.     else
  406.     {
  407.       if (!tcp_hasactive() ||
  408.           ask_user("The are active connections. Are you sure you want to quit?", "Quit", "Cancel"))
  409.         net_exit();
  410.     }
  411.     break;
  412.   default:
  413.     break;
  414.   }
  415. }
  416.  
  417. static void Icon_Click(wimp_i Icon)
  418. {
  419.   wimp_wstate state;
  420.  
  421.   Icon = Icon;
  422.  
  423.   if (term_type == -1)
  424.   {
  425.     vterm_open(MWin->vt);
  426. /*    wimp_get_wind_state(MWin->Window_Handle, &state);
  427.     wimp_open_wind(&state.o); */
  428.   }
  429. }
  430.  
  431. static void Alarm_Handler(int Time, void *Handle)
  432. {
  433.   int c;
  434.  
  435.   Handle = Handle;
  436.   Time   = Time;
  437.  
  438.   if (term_type != -1)
  439.   {
  440.     while (c = (terminal_driver)(DRIVER_GETBYTE, 0x00), c >= 0)
  441.       net_keyboard(c);
  442.   }
  443. /* swapped these two round to solve a problem with
  444.    recvr lockup during DNS */
  445.   alarm_set(alarm_timenow() + 1, Alarm_Handler, 0);
  446.   net_poll();
  447. }
  448.  
  449. void cwputs(Terminal *port, char *s)
  450. {
  451.   if (term_type == -1)
  452.   {
  453.     Window_Write(port, s, strlen(s));
  454.   }
  455.   else
  456.   {
  457.     while(*s)
  458.       (terminal_driver)(DRIVER_PUTBYTE, 0x00, *s++);
  459.   }
  460. }
  461.  
  462. void cwnputs(Terminal *port, char *s, int n)
  463. {
  464.   if (term_type == -1)
  465.   {
  466.     Window_Write(port, s, n);
  467.   }
  468.   else
  469.   {
  470.     int i;
  471.     for (i=0; i<n; i++)
  472.       (terminal_driver)(DRIVER_PUTBYTE, 0x00, s[i]);
  473.   }
  474. }
  475.  
  476. int cwprintf(Terminal *port, char *fmt, ...)
  477. {
  478.   va_list args;
  479.   static char Buffer[1000];
  480.   int cnt;
  481.  
  482.   va_start(args, fmt);
  483.   cnt = vsprintf(Buffer, fmt, args);
  484.   va_end(args);
  485.  
  486.   cwputs(port, Buffer);
  487.  
  488.   return(cnt);
  489. }
  490.  
  491. int cwputchar(Terminal *port, int c)
  492. {
  493.   if (term_type == -1)
  494.   {
  495.     if (port)
  496.       Window_Write(port, (char *) &c, 1);
  497.     else
  498.       Window_Write(MWin, (char *) &c, 1);
  499.   }
  500.   else
  501.   {
  502.     (terminal_driver)(DRIVER_PUTBYTE, 0x00, c);
  503.   }
  504.   return(c);
  505. }
  506.  
  507. int cwtitle(Terminal *port, char *fmt, ...)
  508. {
  509.   va_list args;
  510.   static char Buffer[100];
  511.   int cnt;
  512.  
  513.   va_start(args, fmt);
  514.   cnt = vsprintf(Buffer, fmt, args);
  515.   va_end(args);
  516. /*
  517.   if (port)
  518.     win_settitle(port->Window_Handle, Buffer);
  519.   else
  520.     win_settitle(MWin->Window_Handle, Buffer);
  521. */
  522.   if (port)
  523.     vterm_title(port->vt, Buffer);
  524.   else
  525.     vterm_title(MWin->vt, Buffer);
  526.  
  527.   return(cnt);
  528. }
  529.  
  530. void twopen(void)
  531. {
  532.   if (TWin==NULL)
  533.     TWin = Window_Open(NULL, "Trace Window", term_DONT_DESTROY | term_NO_INPUT);
  534.  
  535.   if (TWin!=NULL && !Trace_Window_Open)
  536.   {
  537.     vterm_open(TWin->vt);
  538.     Trace_Window_Open = TRUE;
  539.   }
  540. }
  541.  
  542. void twclose(void)
  543. {
  544.   vterm_close(TWin->vt);
  545.     Trace_Window_Open = FALSE;
  546. }
  547.  
  548. void twputs(char *s)
  549. {
  550.   Window_Write(TWin, s, strlen(s));
  551. }
  552.  
  553. int twprintf(char *fmt, ...)
  554. {
  555.   va_list args;
  556.   static char Buffer[1000];
  557.   int cnt;
  558.  
  559.   va_start(args, fmt);
  560.   cnt = vsprintf(Buffer, fmt, args);
  561.   va_end(args);
  562.  
  563.   twputs(Buffer);
  564.  
  565.   return(cnt);
  566. }
  567.  
  568. int twputchar(int c)
  569. {
  570.   Window_Write(TWin, (char *) &c, 1);
  571.   return(c);
  572. }
  573.  
  574. void panic(char *fmt, ...)
  575. {
  576.   static char Buffer[500];
  577.   va_list args;
  578.  
  579.   va_start(args, fmt);
  580.   vsprintf(Buffer, fmt, args);
  581.   va_end(args);
  582.  
  583.   werr(TRUE, Buffer);
  584. }
  585.  
  586. static void Signal_Proc(int Signal)
  587. {
  588.   switch (Signal)
  589.   {
  590.   case SIGABRT:
  591.     werr(TRUE, "Abort signal received");
  592.     break;
  593.   case SIGFPE:
  594.     werr(TRUE, "Arithmetic exception");
  595.     break;
  596.   case SIGILL:
  597.     werr(TRUE, "Illegal instruction");
  598.     break;
  599.   case SIGINT:
  600.     werr(TRUE, "Attention requested from user");
  601.     break;
  602.   case SIGSEGV:
  603.     werr(TRUE, "Bad memory access");
  604.     break;
  605.   case SIGTERM:
  606.     werr(TRUE, "Termination request");
  607.     break;
  608.   case SIGSTAK:
  609.     werr(TRUE, "Stack overflow");
  610.     break;
  611.   default:
  612.     werr(TRUE, "Signal number %d", Signal);
  613.     break;
  614.   }
  615. }
  616.  
  617. static void event_handler(wimp_eventstr *e, void *handle)
  618. {
  619.   switch (e->e)
  620.   {
  621.     case wimp_ESEND:
  622.     case wimp_ESENDWANTACK:
  623.       switch (e->data.msg.hdr.action) {
  624.         case wimp_MDATALOAD:
  625.           {
  626.             int type;
  627.             char name[256];
  628.  
  629.             switch (e->data.msg.data.dataload.type)
  630.             {
  631.               case 0xfff:
  632.               case 0xff1:
  633.               case 0xffd:
  634.                 if (import_ack(name, &type))
  635.                   vterm_replay(name);
  636.                 break;
  637.               case 0xddc:
  638.                 import_ack(name, &type);
  639.                 werr(0, "Facility for automatic upgrade installation is not yet available");
  640.                 break;
  641.             }
  642.           }
  643.           break;
  644.       }
  645.   }
  646. }
  647.  
  648. int doterm(int argc, char **argv)
  649. {
  650.   if (argc<2)
  651.     return 1;
  652.  
  653.   if (!strcmp(argv[1], "*"))
  654.   {
  655.     strcpy(argv[1], "\\"); /* Overwrite the * in the command */
  656.     vterm_parse(MWin->vt, argc-1, argv+1);
  657.     return 0;
  658.   }
  659.   else
  660.   {
  661.     if (current!=NULLSESSION)
  662.     {
  663.       strcpy(argv[0], "\\"); /* Overwrite the original terminal command */
  664.       vterm_parse(current->window->vt, argc, argv);
  665.       return 0;
  666.     }
  667.     else
  668.     {
  669.       cwprintf(NULL, "No current session\r\n");
  670.       return 1;
  671.     }
  672.   }
  673.   return 1;
  674. }
  675.