home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 382.lha / dial_vt100 / dial.vt100 < prev    next >
Text File  |  1990-05-03  |  17KB  |  606 lines

  1. /*
  2.  * dial.vt100 - An ARexx script for use with VT100 (V2.9 or higher)
  3.  *
  4.  *    This program allows the user to save up to 20 frequently used
  5.  *    phone numbers. The program will dial the phone number, at the
  6.  *    request of the user. Each number has 7 fields associated with it.
  7.  *    They are:
  8.  *
  9.  *    Name:    An ascii string describing the number.
  10.  *    Phone:   The actual phone number to be dialed
  11.  *    Baud:    The Baud Rate that VT100 should be set to when dialing this number
  12.  *    Parity:  The Parity that VT100 should be set to when dialing this number
  13.  *    Prefix:  A string that is sent to the modem BEFORE dialing the number
  14.  *    Postfix: A string that is sent to the modem AFTER dialing the number,
  15.  *           A carrige return is signified by "^M".
  16.  *    Script:  The name of an ARexx script to be called. This script is passed
  17.  *           the above mentioned parameters. When a user's script is called,
  18.  *           this script exit's. All dialing must be done by the user's script.
  19.  *           This script launches the user's script via VT100's RX command.
  20.  *           Therfore, the user's script must end in '.vt100'.
  21.  *
  22.  *    The phone file defaults to S:VT100.phones. If it doesn't exist, dial
  23.  *    will use default values for all fields.
  24.  *
  25.  *    To install: just copy this file to REXX:dial.vt100
  26.  *
  27.  *    To run: either directly execute from the VT100 "REXX MACRO" menu, or
  28.  *    issue the "RX DIAL" script command.
  29.  *
  30.  *
  31.  *    This program requires:
  32.  *     VT100 Version 2.9 (Released October-89)
  33.  *     ARexx
  34.  *     arp.library       (PD routines)
  35.  *     rexarplib.library (PD routines, necessary for windowing)
  36.  *
  37.  *    VT100, arp.library,  and rexarplib.library are avaliable in many
  38.  *    PD collections.
  39.  *
  40.  *    ARexx is a licensed program, written by William S. Hawes
  41.  *
  42.  ****************************************************************************
  43.  *    dial.vt100 - Copyright 1989 by Starbound Computing, a division of
  44.  *           Starbound Enterprizes.
  45.  *
  46.  *         - Written by David W. Lowrey (USENET: amdahl!dwl10)
  47.  *
  48.  *           THIS PROGRAM IS NOT IN THE PUBLIC DOMAIN!!!
  49.  *
  50.  *  All Rights Reserved. This program may be freely used and copied, as long
  51.  *  as no fee, other than a "reasonable" copying charge, is charged for
  52.  *  it's use.
  53.  *
  54.  *  Permission is granted to include this program in various user group PD
  55.  *  collections, the FISH PD collection, or private PD collections.
  56.  *
  57.  *  Inclusion in and commercial PD disk collections, including Magazine
  58.  *  disks, requires written permission from the author.
  59.  *
  60.  *  Any use for comercial purposes requires written permission
  61.  *  from the author.
  62.  *
  63.  */
  64.  
  65. /*
  66.  * Version 1.2:  Striped off extra blanks from dial strings before sending
  67.  *         them to VT100 (the modem).
  68.  *
  69.  * Version 1.1:  Cleaned up code.
  70.  *
  71.  * Version 1.0:  Initial public release
  72.  */
  73.  
  74. /*
  75.  * default values
  76.  *
  77.  * feel free to change any of these
  78.  * Note that the default name must be exactly 25 characters long
  79.  */
  80. default.name = "                         "
  81. default.phone = " "
  82. default.baud = "2400"
  83. default.parity = "NONE"
  84. default.prefix = "ATDT"
  85. default.postfix = "^M"     /* carrage return after dial string */
  86. default.script = " "
  87.  
  88. /*
  89.  * Make sure the required libraries have been loaded
  90.  */
  91. if ~show('l', "rexxarplib.library") then do
  92.    check = addlib('rexxarplib.library',0,-30,0)
  93.    if ~check then do
  94.       say "Can't load rexxarplib.library!"
  95.       exit -1
  96.    end
  97.    else nop
  98. end
  99. else nop
  100.  
  101. if ~show('l', "rexxsupport.library") then do
  102.    check = addlib('rexxsupport.library',0,-30,0)
  103.    if ~check then do
  104.       say "Can't load rexxsupport.library!"
  105.       exit -1
  106.    end
  107.    else nop
  108. end
  109. else nop
  110.  
  111. /*
  112.  * Create the window manager process
  113.  */
  114. address command run "rx 'call CreateHost(DIALWIN,DIALPORT)'"
  115. address command "waitforport DIALWIN" /* wait for port to come active */
  116.  
  117. /*
  118.  *   Window sizes
  119.  */
  120. window.leftedge = 50
  121. window.topedge    = 0
  122. window.width    = 470
  123. window.height    = 200
  124.  
  125. /*
  126.  * Initialize data values
  127.  */
  128. names.        = default.name
  129. phones.     = default.phone
  130. baud.        = default.baud
  131. parity.     = default.parity
  132. prefix.     = default.prefix
  133. postfix.    = default.postfix
  134. script.     = default.script
  135.  
  136. savefile    = "S:VT100.phones"
  137.  
  138. mod.=""
  139.  
  140. gadget.previous=0
  141. modified=0
  142.  
  143. call OpenWin1
  144.  
  145. /* Open our host port */
  146. call openport(DIALPORT)
  147.  
  148. /*
  149.  * read in the phone directory
  150.  */
  151. call ReadPhone
  152.  
  153. call DrawScreen1
  154.  
  155. /*
  156.  *   Wait for messages at DIALPORT
  157.  */
  158. quitflag = 0
  159. do forever until quitflag
  160.    call waitpkt(DIALPORT)
  161.    p = getpkt(DIALPORT)
  162.    if p ~== '0000 0000'x then
  163.       do
  164.  
  165.       thisarg = getarg(p)
  166.       gadgetnum = getarg(p,1)
  167.       t=reply(p, 0)
  168.  
  169. /*
  170.  * Decode the IDCMP message
  171.  */
  172.  
  173.       select
  174.       /*
  175.        *   Messages are either CLOSEWINDOW
  176.        */
  177.      when thisarg == 'CLOSEWINDOW' then do
  178.         if modified=1 then reply=Request(140, 40,"NOTICE: There are unsaved\changes. Click 'Cancel' to abort.\Click 'Okay' to continue, and\loose all changes.",,"Okay","Cancel")
  179.         else reply="OKAY"
  180.         if reply == "OKAY" then do
  181.            call CloseWindow(DIALWIN)
  182.            quitflag = 1
  183.         end
  184.         else nop
  185.      end
  186.       /*
  187.        *   ...or one of the Phone Number gadgets has been selected
  188.        */
  189.      when thisarg == 'Gadget' then do
  190.         gadget.current = gadgetnum
  191.  
  192.         if gadget.current == gadget.previous then do
  193.            call SetGadget(DIALWIN, gadget.current, "OFF")
  194.            gadget.previous=0
  195.            gadget.current=0
  196.         end
  197.         else do
  198.            call SetGadget(DIALWIN, gadget.current, "ON")
  199.            if gadget.previous ~== 0 then call SetGadget(DIALWIN, gadget.previous, OFF)
  200.            gadget.previous=gadget.current
  201.         end
  202.  
  203.      end
  204.       /*
  205.        *   ...or the LOAD Gadget has been selected
  206.        */
  207.  
  208.      when thisarg == 'Load' then do
  209.         if modified=1 then reply=Request(140, 40,"NOTICE: There are unsaved\changes. Click 'Cancel' to abort.\Click 'Okay' to continue, and\loose all changes.",,"Okay","Cancel")
  210.         else reply="OKAY"
  211.         if reply == "OKAY" then do
  212.            newsave=Request(140,40,"     LOAD PHONE FILE\\Enter name of phone file",savefile,"Okay","Cancel")
  213.            if newsave ~= "" then do
  214.           if exists(newsave) then do
  215.              savefile=newsave
  216.              call ReadPhone
  217.              call CloseWindow(DIALWIN,"CONTINUE")
  218.              call OpenWin1
  219.              call DrawScreen1
  220.              modified=0
  221.           end
  222.           else do
  223.              t=Request(140,40,"Phone file not found\Load request canceled",,"Okay",)
  224.           end
  225.            end
  226.            else nop
  227.         end
  228.         else nop
  229.      end
  230.  
  231.       /*
  232.        * ...or the SAVE gadget has been selected
  233.        */
  234.  
  235.      when thisarg == 'Save' then do
  236.         newsave=Request(140,40,"     SAVE PHONE FILE\\Enter name of phone file",savefile,"Okay","Cancel")
  237.         if newsave ~= "" then do
  238.            savefile=newsave
  239.            call SavePhone
  240.            modified=0
  241.         end
  242.         else nop
  243.      end
  244.       /*
  245.        *   ...or the DELETE gadget has been selected
  246.        */
  247.  
  248.      when thisarg == 'Delete' then do
  249.         if gadget.current ~= 0 then do
  250.            index=gadget.current
  251.            t=Request(140,40,"     DELETE ENTRY\\"names.index"\\is about to be deleted\Please confirm:",,"Okay","Cancel")
  252.            if t == "OKAY" then do
  253.           names.index="                         "
  254.           phones.index="                         "
  255.           baud.index="2400"
  256.           parity.index="NONE"
  257.           prefix.index="                         "
  258.           postfix.index="                         "
  259.           script.index="                         "
  260.           call CloseWindow(DIALWIN,"CONTINUE")
  261.           call OpenWin1
  262.           call DrawScreen1
  263.           gadget.current=0
  264.           gadget.previous=0
  265.           modified=1
  266.            end
  267.            else nop
  268.         end
  269.         else nop
  270.      end
  271.  
  272.       /*
  273.        *   ...or MODIFY has been selected
  274.        */
  275.  
  276.       when thisarg == 'Modify' then do
  277.      if gadget.current ~= 0 then do
  278.         result=modify(gadget.current)
  279.         if result == 'Okay' then do
  280.            i = gadget.current
  281.            names.i = mod.names
  282.            phones.i = mod.phones
  283.            baud.i = mod.baud
  284.            parity.i = mod.parity
  285.            prefix.i = mod.prefix
  286.            postfix.i = mod.postfix
  287.            script.i = mod.script
  288.            modified = 1
  289.         end
  290.         else nop
  291.  
  292.         call CloseWindow(DIALWIN,"CONTINUE")
  293.         call OpenWin1
  294.         call DrawScreen1
  295.         call SetGadget(DIALWIN,gadget.current, "ON")
  296.      end
  297.      else nop
  298.       end
  299.  
  300.       /*
  301.        *   ...or the Dial gadget
  302.        */
  303.      when thisarg == 'Dial' then do
  304.         if gadget.current ~= 0 then do
  305.            if modified=1 then reply=Request(140, 40,"NOTICE: There are unsaved\changes. Click 'Cancel' to abort.\Click 'Okay' to continue, and\loose all changes.",,"Okay","Cancel")
  306.            else reply="OKAY"
  307.            if reply == "OKAY" then do
  308.           i=gadget.current
  309.           if strip(script.i) = "" then do
  310.              dial.prefix=strip(prefix.i)
  311.              dial.phones=strip(phones.i)
  312.              dial.postfix=strip(postfix.i)
  313.              'BAUD 'baud.i
  314.              'PARITY 'parity.i
  315.              'SEND "'dial.prefix||dial.phones||dial.postfix'"'
  316.           end
  317.           else do
  318.           /*
  319.            * Launch user's script as a seperate task
  320.            * we will end this script now.
  321.            */
  322.              'rx 'script.i names.i" "phones.i" "baud.i" "parity.i" "prefix.i" "postfix.i
  323.           end
  324.           quitflag = 1
  325.           call CloseWindow(DIALWIN)
  326.            end
  327.            else nop
  328.         end
  329.         else nop
  330.      end
  331.  
  332.       /*
  333.        *   ...or an unknown IDCMP msg has been received
  334.        */
  335.  
  336.      otherwise do
  337.         say thisarg
  338.      end
  339.       end
  340.    end
  341.    else nop
  342. end
  343.  
  344. exit
  345.  
  346. /*
  347.  *   Open a window
  348.  */
  349. OpenWin1:
  350. idcmp = 'CLOSEWINDOW+GADGETUP'
  351. flags = 'WINDOWCLOSE+WINDOWDRAG+WINDOWDEPTH'
  352. call OpenWindow(DIALWIN, window.leftedge, window.topedge, window.width, ,
  353.         window.height, idcmp, flags)
  354. Call ModifyHost(DIALWIN, 'CLOSEWINDOW',"CLOSEWINDOW%1DUMMY")
  355. return
  356.  
  357. /*
  358.  *    Draw the phone book screen
  359.  */
  360. DrawScreen1: PROCEDURE expose names.
  361. call SetAPen(DIALWIN, 1)
  362. call AddGadget(DIALWIN, 15, 15, 1, names.1, "Gadget%1%d")
  363. call AddGadget(DIALWIN, 15, 30, 2, names.2, "Gadget%1%d")
  364. call AddGadget(DIALWIN, 15, 45, 3, names.3, "Gadget%1%d")
  365. call AddGadget(DIALWIN, 15, 60, 4, names.4, "Gadget%1%d")
  366. call AddGadget(DIALWIN, 15, 75, 5, names.5, "Gadget%1%d")
  367. call AddGadget(DIALWIN, 15, 90, 6, names.6, "Gadget%1%d")
  368. call AddGadget(DIALWIN, 15, 105, 7, names.7, "Gadget%1%d")
  369. call AddGadget(DIALWIN, 15, 120, 8, names.8, "Gadget%1%d")
  370. call AddGadget(DIALWIN, 15, 135, 9, names.9, "Gadget%1%d")
  371. call AddGadget(DIALWIN, 15, 150, 10, names.10, "Gadget%1%d")
  372. call AddGadget(DIALWIN, 245, 15, 11, names.11, "Gadget%1%d")
  373. call AddGadget(DIALWIN, 245, 30, 12, names.12, "Gadget%1%d")
  374. call AddGadget(DIALWIN, 245, 45, 13, names.13, "Gadget%1%d")
  375. call AddGadget(DIALWIN, 245, 60, 14, names.14, "Gadget%1%d")
  376. call AddGadget(DIALWIN, 245, 75, 15, names.15, "Gadget%1%d")
  377. call AddGadget(DIALWIN, 245, 90, 16, names.16, "Gadget%1%d")
  378. call AddGadget(DIALWIN, 245, 105, 17, names.17, "Gadget%1%d")
  379. call AddGadget(DIALWIN, 245, 120, 18, names.18, "Gadget%1%d")
  380. call AddGadget(DIALWIN, 245, 135, 19, names.19, "Gadget%1%d")
  381. call AddGadget(DIALWIN, 245, 150, 20, names.20, "Gadget%1%d")
  382. call Move(DIALWIN,0,165)
  383. call SetAPen(DIALWIN, 3)
  384. call Draw(DIALWIN, 470, 165)
  385. call Flood(DIALWIN, 1, 13, 13)
  386. call Move(DIALWIN,50,175)
  387. call SetAPen(DIALWIN, 1)
  388. call Text(DIALWIN, "Select a destination, then select a function.")
  389. call AddGadget(DIALWIN, 30,180, 21, "DIAL", "Dial%1dummy")
  390. call AddGadget(DIALWIN, 100, 180, 22, "MODIFY", "Modify%1dummy")
  391. call AddGadget(DIALWIN, 175, 180, 23, "DELETE", "Delete%1dummy")
  392. call AddGadget(DIALWIN, 250, 180, 24, "LOAD", "Load%1dummy")
  393. call AddGadget(DIALWIN, 325, 180, 25, "SAVE", "Save%1dummy")
  394. call AddGadget(DIALWIN, 400, 180, 26, "CANCEL", "CLOSEWINDOW%1dummy")
  395. return
  396.  
  397. /*
  398.  * Routine to read a Phonebook File
  399.  */
  400. ReadPhone: procedure expose names. phones. baud. parity. prefix. postfix.,
  401.                 script. savefile sys.
  402.  
  403. if exists(savefile) then do
  404.    t=open(phonebook,savefile,'Read')
  405.    do index=1 to 20
  406.       entry=readln(phonebook);
  407.       parse var entry names.index '\' phones.index '\' baud.index '\',
  408.               parity.index '\' prefix.index '\' postfix.index '\',
  409.               script.index
  410.       names.index=center(names.index,25)
  411.    end
  412.    t=close(phonebook)
  413. end
  414. return
  415.  
  416. /*
  417.  * Routine to write a Phonebook File
  418.  */
  419. SavePhone: procedure expose names. phones. baud. parity. prefix. postfix.,
  420.                 script. savefile sys.
  421.  
  422. t=open(phonebook,savefile,'Write')
  423. do index=1 to 20
  424.    names.index=strip(names.index)
  425.    t=writeln(phonebook,names.index'\'phones.index'\'baud.index'\'parity.index'\'prefix.index'\'postfix.index'\'script.index)
  426. end
  427. t=close(phonebook)
  428. return
  429.  
  430. /*
  431.  * modify: Add/Modify a phone entry
  432.  */
  433. modify: procedure expose names. phones. baud. parity. prefix. postfix.,
  434.                 script. mod. window.
  435.  
  436. parse arg index
  437.  
  438. mod.names   = names.index
  439. mod.phones  = phones.index
  440. mod.baud    = baud.index
  441. mod.parity  = parity.index
  442. mod.prefix  = prefix.index
  443. mod.postfix = postfix.index
  444. mod.script  = script.index
  445.  
  446. call formatmod
  447. /*
  448.  * Get rid of old window and draw our own
  449.  */
  450. call CloseWindow(DIALWIN, "CONTINUE")
  451. call OpenWin1
  452.  
  453. call AddGadget(DIALWIN, 100, 30,  1, mod.names,   "names%1%g",   208)
  454. call AddGadget(DIALWIN, 100, 50,  2, mod.phones,  "phones%1%g",  208)
  455. call AddGadget(DIALWIN, 100, 70,  3, mod.baud,    "baud%1%g",    40)
  456. call AddGadget(DIALWIN, 100, 90,  4, mod.parity,  "parity%1%g",  48)
  457. call AddGadget(DIALWIN, 100, 110, 5, mod.prefix,  "prefix%1%g",  208)
  458. call AddGadget(DIALWIN, 100, 130, 6, mod.postfix, "postfix%1%g", 208)
  459. call AddGadget(DIALWIN, 100, 150, 7, mod.script,  "script%1%g",  208)
  460. call AddGadget(DIALWIN, 20,  180, 8, "OKAY",      "Okay%1%dummy")
  461. call AddGadget(DIALWIN, 400, 180, 9, "CANCEL",    "CLOSEWINDOW%1dummy")
  462. call SetAPen(DIALWIN, 1)
  463. call Move(DIALWIN,8, 37)
  464. call Text(DIALWIN, "     Name:")
  465. call Move(DIALWIN,8, 57)
  466. call Text(DIALWIN, "    Phone:")
  467. call Move(DIALWIN,8, 77)
  468. call Text(DIALWIN, "     Baud:")
  469. call Move(DIALWIN,8, 97)
  470. call Text(DIALWIN, "   Parity:")
  471. call Move(DIALWIN,8, 117)
  472. call Text(DIALWIN, "   Prefix:")
  473. call Move(DIALWIN,8, 137)
  474. call Text(DIALWIN, "  Postfix:")
  475. call Move(DIALWIN,8, 157)
  476. call Text(DIALWIN, "   Script:")
  477. call Move(DIALWIN, 132, 16)
  478. call Text(DIALWIN, "Modify Desired fields")
  479. call Move(DIALWIN, 50, 24)
  480. call Text(DIALWIN, "You must press "RETURN" to save each field")
  481.  
  482. call ActivateGadget(DIALWIN, 1)
  483.  
  484. /*
  485.  *   Wait for messages at DIALPORT
  486.  */
  487. quitflag = 0
  488. gadnum.names = 1
  489. gadnum.phones = 2
  490. gadnum.baud = 3
  491. gadnum.parity = 4
  492. gadnum.prefix = 5
  493. gadnum.postfix = 6
  494. gadnum.script = 7
  495.  
  496. do forever until quitflag
  497.    call waitpkt(DIALPORT)
  498.    p = getpkt(DIALPORT)
  499.    if p ~== '0000 0000'x then
  500.       do
  501.  
  502.       thisarg = getarg(p)
  503.       string = getarg(p,1)
  504.       t=reply(p, 0)
  505.  
  506. /*
  507.  * Decode the IDCMP message
  508.  */
  509.  
  510.       select
  511.       /*
  512.        *   Messages are either CLOSEWINDOW ...
  513.        */
  514.      when thisarg == 'CLOSEWINDOW' then do
  515.         if modified = 1 then reply=Request(140, 40,"NOTICE: There are unsaved\changes. Click 'Cancel' to abort.\Click 'Okay' to continue, and\loose all changes.",,"Okay","Cancel")
  516.         else reply="OKAY"
  517.         if reply == "OKAY" then do
  518.            ret="Not Modified"
  519.            quitflag = 1
  520.         end
  521.         else nop
  522.      end
  523.  
  524.       /*
  525.        * ...or "Quit" (exit with new values)
  526.        */
  527.      when thisarg == 'Okay' then do
  528.         if modified == 1 then do
  529.            call formatmod
  530.            mod.names=center(strip(mod.names),25)
  531.            ret = 'Okay'
  532.         end
  533.         else ret = 'Not Modified'
  534.         quitflag = 1
  535.      end
  536.  
  537.       /*
  538.        *   ...or one of the free formstring gadgets has been selected
  539.        */
  540.      when thisarg=='names' | thisarg=='phones' | thisarg=='prefix' ,
  541.           | thisarg=='postfix' | thisarg=='script' then do
  542.         upperarg=upper(thisarg)
  543.         if mod.upperarg ~= string then do
  544.            mod.upperarg = string
  545.            modified = 1
  546.         end
  547.         else nop
  548.         nextgad = gadnum.upperarg + 1
  549.         if nextgad == 8 then nextgad = 1
  550.         else nop
  551.         call ActivateGadget(DIALWIN, nextgad)
  552.      end
  553.  
  554.       /*
  555.        *   ...or baud has been selected
  556.        */
  557.      when thisarg == 'baud' then do
  558.         if string=300 | string=1200 | string=2400 | string=4800 | string=9600 then do
  559.            mod.baud = string
  560.            modified = 1
  561.            call ActivateGadget(DIALWIN, gadnum.baud+1)
  562.         end
  563.         else do
  564.            r=Request(140, 40, "Invalid Baud rate. Baud rate must be\one of the following:\300, 1200, 2400, 4800, 9600",,"Okay")
  565.            call ActivateGadget(DIALWIN, gadnum.baud)
  566.         end
  567.      end
  568.       /*
  569.        *   ...or Parity has been selected
  570.        */
  571.      when thisarg == 'parity' then do
  572.         string = upper(string)
  573.         if string='NONE' | string='MARK' | string='SPACE' | string='EVEN' | string='ODD' then do
  574.            mod.parity = string
  575.            modified = 1
  576.            call ActivateGadget(DIALWIN, gadnum.parity+1)
  577.         end
  578.         else do
  579.            r=Request(140, 40, "Invalid Parity. Parity must be\one of the following:\NONE, MARK, SPACE, EVEN, ODD",,"Okay")
  580.            call ActivateGadget(DIALWIN, gadnum.parity)
  581.         end
  582.      end
  583.  
  584.      otherwise do
  585.         say thisarg
  586.      end
  587.       end
  588.    end
  589.    else nop
  590. end
  591. return ret
  592.  
  593. /*
  594.  * Format fields
  595.  */
  596.  
  597. formatmod: procedure expose mod.
  598. mod.names   = left(strip(mod.names), 25)
  599. mod.phones  = left(strip(mod.phones), 25)
  600. mod.baud    = left(strip(mod.baud), 4)
  601. mod.parity  = left(strip(mod.parity), 5)
  602. mod.prefix  = left(strip(mod.prefix), 25)
  603. mod.postfix = left(strip(mod.postfix), 25)
  604. mod.script  = left(strip(mod.script), 25)
  605. return
  606.