home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / MODEM / HOST1.ZIP / HOST.SCR < prev    next >
Text File  |  1994-02-19  |  18KB  |  703 lines

  1. '
  2. ' Host mode script for QmodemPro for Windows.
  3. '
  4. ' Version 1.0
  5. '
  6. ' Last updated December 1, 1993.
  7. '
  8.  
  9. '$include 'hostutil.scr'
  10.  
  11. ' Constants
  12.  
  13. const BS  = chr(8)
  14. const LF  = chr(10)
  15. const CR  = chr(13)
  16. const ESC = chr(27)
  17.  
  18. const PrelogFileNamePart   = "host.pre"
  19. const MenuFileNamePart     = "host.mnu"
  20. const ProtocolFileNamePart = "host.pro"
  21. const LogoffFileNamePart   = "host.off"
  22. const HelpFileNamePart     = "host.hlp"
  23.  
  24. const UserFileNamePart      = "host.usr"
  25. const MsgHeaderFileNamePart = "host.hdr"
  26. const MsgDetailFileNamePart = "host.msg"
  27.  
  28. const MaxMsgLines = 99
  29.  
  30. ' Type declarations
  31.  
  32. dialog SetupDialog 18, 18, 214, 200
  33.   caption "QmodemPro Host Setup"
  34.   groupbox "Mode", 101, 18, 9, 74, 64
  35.   modeopen as radiobutton "Open", 102, 26, 23, 62, 12
  36.   modeclosed as radiobutton "Closed", 103, 26, 38, 62, 12
  37.   modecallback as radiobutton "Callback", 104, 26, 53, 62, 12
  38.   groupbox "Security", 150, 100, 9, 100, 64
  39.   maxtime as edittext 105, 151, 22, 42, 12
  40.   dospass as edittext 106, 151, 39, 42, 12
  41.   shutdownpass as edittext 107, 151, 56, 42, 12
  42.   rtext "Max time", -1, 108, 25, 41, 8
  43.   rtext "DOS pwd", -1, 108, 41, 41, 8
  44.   rtext "Shutdown pwd", -1, 108, 59, 41, 8
  45.   groupbox "File transfers", 160, 18, 80, 182, 85
  46.   dlpath as edittext 108, 22, 104, 169, 12
  47.   ulpath as edittext 109, 22, 130, 169, 12
  48.   ltext "Download path", -1, 24, 95, 62, 8
  49.   ltext "Upload path", -1, 24, 120, 69, 8
  50.   sysopanypath as checkbox "Sysop can download from any path", 110, 25, 148, 165, 12
  51.   pushbutton "&Modem...", 200, 15, 175, 50, 14
  52.   defpushbutton "OK", IDOK, 80, 175, 50, 14
  53.   pushbutton "Cancel", IDCANCEL, 150, 175, 50, 14
  54. end dialog
  55.  
  56. dialog ModemSetupDialog 6, 15, 194, 119
  57.   caption "QmodemPro Host Modem Setup"
  58.   groupbox "", -1, 8, 9, 177, 79
  59.   init as edittext 101, 48, 17, 127, 12
  60.   answer as edittext 102, 48, 33, 47, 12
  61.   busy as edittext 103, 48, 49, 47, 12
  62.   ok as edittext 104, 48, 65, 47, 12
  63.   ring as edittext 105, 129, 33, 45, 12
  64.   ringcount as edittext 106, 148, 49, 27, 12
  65.   rtext "&Init", -1, 16, 19, 28, 8
  66.   rtext "&Answer", -1, 12, 34, 33, 8
  67.   rtext "&Busy", -1, 12, 50, 33, 8
  68.   rtext "&OK msg", -1, 13, 66, 32, 8
  69.   rtext "&Ring", -1, 105, 35, 20, 8
  70.   rtext "Ring &Count", -1, 106, 51, 38, 8
  71.   defpushbutton "OK", IDOK, 77, 96, 50, 14
  72.   pushbutton "Cancel", IDCANCEL, 137, 96, 50, 14
  73. end dialog
  74.  
  75. type TUser
  76.   Name as string*25
  77.   Password as string*20
  78.   Level as integer
  79.   Phone as string*30
  80. end type
  81.  
  82. type TMessageHeader
  83.   Sender as string*25
  84.   Receiver as string*25
  85.   Subject as string*75
  86.   DateTime as string*20
  87.   Private as integer
  88.   Received as integer
  89.   Killed as integer
  90.   Lines as integer
  91.   Detailpos as long
  92. end type
  93.  
  94. ' connection variables
  95. dim Local as integer
  96. dim Port as integer
  97. dim ModemResult as string
  98. dim BaudRate as long
  99. dim LogonTime as DateTimeRec
  100. dim LogoffTime as DateTimeRec
  101. dim ForceLogoff as integer
  102.  
  103. dim Setup as SetupDialog
  104. dim ModemSetup as ModemSetupDialog
  105. dim User as TUser
  106. dim MsgLines(MaxMsgLines) as string
  107.  
  108. dim PrelogFileName as string
  109. dim MenuFileName as string
  110. dim ProtocolFileName as string
  111. dim LogoffFileName as string
  112. dim HelpFileName as string
  113. dim UserFileName as string
  114. dim MsgHeaderFileName as string
  115. dim MsgDetailFileName as string
  116.  
  117. '$include 'hostcfg.scr'
  118.  
  119. declare sub PackMessages
  120.  
  121. ' Utility routines
  122.  
  123. sub GetCurrentTime(dt as DateTimeRec)
  124.   do
  125.     dt.D = Today
  126.     dt.T = CurrentTime
  127.   loop until dt.D = Today
  128. end sub
  129.  
  130. function MinutesSince(dt as DateTimeRec)
  131.   dim now as DateTimeRec
  132.   call GetCurrentTime(now)
  133.   while now.D > dt.D
  134.     now.D = now.D - 1
  135.     now.T = now.T + SecondsInDay
  136.   wend
  137.   MinutesSince = (now.T - dt.T) / 60
  138. end function
  139.  
  140. function MinutesUntil(dt as DateTimeRec)
  141.   dim now as DateTimeRec
  142.   call GetCurrentTime(now)
  143.   while dt.D > now.D
  144.     now.D = now.D + 1
  145.     now.T = now.T - SecondsInDay
  146.   wend
  147.   MinutesUntil = (dt.T - now.T) / 60
  148. end function
  149.  
  150. function TimeLeft as integer
  151.   TimeLeft = MinutesUntil(LogoffTime)
  152. end function
  153.  
  154. function CallerHungUp as integer
  155.   CallerHungUp = (not Local and not Carrier) or ForceLogoff
  156. end function
  157.  
  158. sub DoChat
  159.   dim s as string, c as string
  160.   send #Port,
  161.   send #Port, "You are now chatting with the sysop"
  162.   send #Port,
  163.   do
  164.     c = inkey
  165.     if c = "F2" then
  166.       exit do
  167.     end if
  168.     if c = "" and not Local then
  169.       c = inkey(Port)
  170.     end if
  171.     select case c
  172.       case BS
  173.         if len(s) > 0 then
  174.           s = left(s, len(s)-1)
  175.           send #Port, BS;" ";BS;
  176.         end if
  177.       case CR
  178.         send #Port,
  179.         s = ""
  180.       case is >= " "
  181.         s = s + c
  182.         send #Port, c;
  183.         if len(s) >= 79 then
  184.           if instr(s, " ") then
  185.             dim i as integer
  186.             i = len(s)
  187.             while mid(s, i, 1) <> " "
  188.               i = i - 1
  189.             wend
  190.             send #Port, string(len(s)-i, BS); string(len(s)-i, " ")
  191.             s = mid(s, i+1, len(s)-i)
  192.             send #Port, s;
  193.           else
  194.             send #Port,
  195.             s = ""
  196.           end if
  197.         end if
  198.     end select
  199.   loop until CallerHungUp
  200.   send #Port,
  201.   send #Port,
  202.   send #Port, "Returning you to host mode"
  203.   send #Port,
  204. end sub
  205.  
  206. function YesNo(x as integer) as string
  207.   if x then
  208.     YesNo = "Yes"
  209.   else
  210.     YesNo = "No"
  211.   end if
  212. end function
  213.  
  214. declare function GetLine(prompt as string = "", maxlen as integer = 0, start as string = "", passchar as string = "") as string
  215. function GetLine(prompt as string, maxlen as integer, start as string, passchar as string) as string
  216.   dim s as string
  217.   dim starttime as DateTimeRec
  218.   dim warned as integer
  219.   call GetCurrentTime(starttime)
  220.   warned = false
  221.   s = start
  222.   send #Port, prompt; s;
  223.   do
  224.     dim c as string
  225.     c = inkey
  226.     if c = "" and not Local then
  227.       c = inkey(Port)
  228.     end if
  229.     select case c
  230.       case ""
  231.         dim idle as integer
  232.         idle = MinutesSince(starttime)
  233.         if idle >= 4 and not warned then
  234.           send #Port,
  235.           send #Port,
  236.           send #Port, "CAUTION!  You will be logged off if you do not continue in 60 seconds!"
  237.           send #Port,
  238.           send #Port, prompt; s;
  239.           warned = true
  240.         elseif idle >= 5 then
  241.           send #Port,
  242.           send #Port,
  243.           send #Port, "Logged off due to inactivity."
  244.           delay 1
  245.           hangup
  246.           ForceLogoff = True
  247.         end if
  248.       case "F2"
  249.         DoChat
  250.         send #Port, prompt; s;
  251.       case BS
  252.         if len(s) > 0 then
  253.           s = left(s, len(s)-1)
  254.           send #Port, BS;" ";BS;
  255.         end if
  256.       case CR
  257.         GetLine = s
  258.         send #Port,
  259.         exit function
  260.       case ESC
  261.         ' esc handling
  262.       case is >= " "
  263.         s = s + c
  264.         if len(passchar) > 0 then
  265.           send #Port, passchar;
  266.         else
  267.           send #Port, c;
  268.         end if
  269.         if maxlen > 0 and len(s) >= maxlen then
  270.           GetLine = s
  271.           exit function
  272.         end if
  273.     end select
  274.   loop until TimeLeft < 0 or CallerHungUp
  275.   GetLine = ""
  276. end function
  277.  
  278. function DisplayFile(fn as string) as integer
  279.   dim f as integer, count as integer
  280.   DisplayFile = TRUE
  281.   f = freefile
  282.   open fn for input as #f
  283.   count = 0
  284.   do while not eof(f)
  285.     dim s as string
  286.     input #f, s
  287.     send #Port, s
  288.     count = count + 1
  289.     if count >= 24 then
  290.       if OemUpper(GetLine("-Pause- [C]ontinue, [S]top? ", 1)) = "S" then
  291.         exit do
  292.       end if
  293.       send #Port,
  294.       count = 0
  295.     end if
  296.   loop
  297.   close #f
  298. catch err_fileopen
  299.   DisplayFile = FALSE
  300. end function
  301.  
  302. sub SendModemString(s as string)
  303.   dim i as integer, c as string
  304.   i = 1
  305.   while i <= len(s)
  306.     c = mid(s, i, 1)
  307.     if c = "^" and i+1 <= len(s) then
  308.       i = i + 1
  309.       c = mid(s, i, 1)
  310.       if c = "~" then
  311.         delay 0.5
  312.         goto nextchar
  313.       else
  314.         c = chr(asc(c) and 0x3f)
  315.       end if
  316.     end if
  317.     send c;
  318. nextchar:
  319.     i = i + 1
  320.   wend
  321. end sub
  322.  
  323. sub InitModem
  324.   dim result as string
  325.   hostecho off
  326.   if carrier then exit sub
  327.   timeout 5
  328. tryagain:
  329.   delay 1
  330.   SendModemString ModemSetup.init
  331.   do
  332.     receive result
  333.   loop until result = ModemSetup.ok
  334. catch err_timeout
  335.   goto tryagain
  336. end sub
  337.  
  338. function WaitForCall as integer
  339.   hostecho off
  340.   if carrier then
  341.     Local = False
  342.     Port = comm
  343.     WaitForCall = True
  344.     exit function
  345.   end if
  346.   do
  347.     dim rings as integer
  348.     rings = 0
  349.     dim result as string
  350.     do
  351.       dim c as string
  352.       c = inkey(comm)
  353.       if c = "" then
  354.         c = inkey
  355.         select case OemUpper(c)
  356.           case "F1"
  357.             if ModemSetup.busy <> "" then
  358.               SendModemString ModemSetup.busy
  359.               delay 1
  360.               flush input
  361.             end if
  362.             Local = True
  363.             Port = 0
  364.             WaitForCall = True
  365.             exit function
  366.           case "F7"
  367.             PackMessages
  368.             WaitForCall = False
  369.             exit function
  370.           case "F8"
  371.             SetupHost
  372.           case "F9"
  373.             print "Host mode terminated, returning to normal operation."
  374.             end
  375.         end select
  376.       elseif c = LF then
  377.         result = ""
  378.       else
  379.         result = result + c
  380.         if len(result) > len(ModemSetup.ring) then
  381.           result = right(result, len(result)-1)
  382.         end if
  383.         if result = ModemSetup.ring then
  384.           rings = rings + 1
  385.         end if
  386.       end if
  387.     loop until rings >= val(ModemSetup.ringcount)
  388.     delay 0.2
  389.     SendModemString ModemSetup.answer
  390.     timeout 60
  391.     do
  392.       receive result
  393.       if left(result, 7) = "CONNECT" then
  394.         ModemResult = result
  395.         BaudRate = val(right(ModemResult, len(ModemResult)-8))
  396.         Local = False
  397.         Port = comm
  398.         WaitForCall = True
  399.         exit function
  400.       end if
  401.     loop until result = "NO CARRIER"
  402.   loop
  403. catch err_timeout
  404.   WaitForCall = False
  405. end function
  406.  
  407. function NextField(s as string, delim as string) as string
  408.   dim i as integer
  409.   i = instr(s, delim)
  410.   if i > 0 then
  411.     NextField = left(s, i-1)
  412.     s = right(s, len(s)-i)
  413.   else
  414.     NextField = s
  415.     s = ""
  416.   end if
  417. end function
  418.  
  419. function LookupUser(uname as string, user as TUser) as integer
  420.   dim f as integer, s as string
  421.   LookupUser = False
  422.   f = freefile
  423.   open UserFileName for input as #f
  424.   do while not eof(f)
  425.     input #f, s
  426.     dim i as integer
  427.     i = instr(s, ";")
  428.     if i > 0 then
  429.       s = rtrim(left(s, i-1))
  430.     end if
  431.     if OemUpper(uname)+"," = left(s, len(uname)+1) then
  432.       user.Name = NextField(s, ",")
  433.       user.Password = NextField(s, ",")
  434.       user.Level = val(NextField(s, ","))
  435.       user.Phone = NextField(s, ",")
  436.       close #f
  437.       LookupUser = True
  438.       exit function
  439.     end if
  440.   loop
  441.   close #f
  442. catch err_fileopen
  443. end function
  444.  
  445. function GetPassword as integer
  446.   GetPassword = True
  447.   if User.Password = "" then
  448.     exit function
  449.   end if
  450.   GetPassword = False
  451.   dim password as string, tries as integer
  452.   do
  453.     password = GetLine("Password? ", 0, "", "*")
  454.     if CallerHungUp then
  455.       exit function
  456.     end if
  457.     if OemUpper(password) = OemUpper(User.Password) then
  458.       send #Port, "Password ok"
  459.       GetPassword = True
  460.       exit function
  461.     end if
  462.     tries = tries + 1
  463.     if tries > 3 then
  464.       send #Port,
  465.       send #Port, "Sorry, access denied"
  466.       send #Port,
  467.       exit function
  468.     else
  469.       send #Port,
  470.       send #Port, "Incorrect password entered"
  471.       send #Port,
  472.     end if
  473.   loop
  474.   GetPassword = True
  475. end function
  476.  
  477. function CallUserBack as integer
  478.   CallUserBack = False
  479.   if User.Phone = "" then
  480.     send #Port, "Your phone number is not on file."
  481.     send #Port, "(click)"
  482.     exit function
  483.   end if
  484.   send #Port, "Hanging up now, type ATA and press Enter after you get a ring."
  485.   delay 1
  486.   hostecho off
  487.   hangup
  488.   delay 10
  489.   send "ATDT"; User.Phone
  490.   timeout 60
  491.   dim result as string
  492.   do
  493.     receive result
  494.     if left(result, 7) = "CONNECT" then
  495.       ModemResult = result
  496.       BaudRate = val(right(ModemResult, len(ModemResult)-8))
  497.       exit do
  498.     end if
  499.   loop
  500.   timeout off
  501.   hostecho on
  502.   delay 1
  503.   send #Port, "Welcome "; User.Name
  504.   send #Port,
  505.   if GetPassword then
  506.     CallUserBack = True
  507.   end if
  508. catch err_timeout
  509.   send
  510. end function
  511.  
  512. function GetCallerInfo as integer
  513.   dim uname as string
  514.   do
  515.     uname = OemUpper(GetLine("Please enter your name? "))
  516.     if CallerHungUp then
  517.       GetCallerInfo = False
  518.       exit function
  519.     end if
  520.     if LookupUser(uname, User) then
  521.       if not GetPassword then
  522.         GetCallerInfo = False
  523.         exit function
  524.       end if
  525.       if Setup.modecallback and not Local then
  526.         if not CallUserBack then
  527.           GetCallerInfo = False
  528.           exit function
  529.         end if
  530.       end if
  531.       GetCallerInfo = True
  532.       exit function
  533.     elseif Setup.modeopen then
  534.       User.Name = uname
  535.       send #Port,
  536.       send #Port, "Your name ";chr(34);uname;chr(34);" was not found in the user list."
  537.       if OemUpper(left(GetLine("Is it spelled correctly? "), 1)) = "Y" then
  538.         exit do
  539.       end if
  540.       send #Port,
  541.     else
  542.       send #Port,
  543.       send #Port, "Sorry, you are not registered with this system."
  544.       send #Port, "(click)"
  545.       send #Port,
  546.       GetCallerInfo = False
  547.       exit function
  548.     end if
  549.   loop
  550.   send #Port,
  551.   do
  552.     dim password as string
  553.     User.Password = GetLine("Please select a password? ", 0, "", "*")
  554.     password      = GetLine("Type your password again? ", 0, "", "*")
  555.     if OemUpper(password) = OemUpper(User.Password) then exit do
  556.     send #Port,
  557.     send #Port, "The passwords you typed did not match.  Try again."
  558.     send #Port,
  559.   loop
  560.   User.Level = 0
  561.   open UserFileName for append as #1
  562.   print #1, User.Name;",";User.Password;",";User.Level
  563.   close #1
  564.   send #Port, "Welcome new user!"
  565.   GetCallerInfo = True
  566. catch err_fileopen
  567.   send "Fatal error - could not open user database"
  568.   GetCallerInfo = False
  569. end function
  570.  
  571. '$include 'hostfile.scr'
  572. '$include 'hostmsg.scr'
  573. '$include 'hostdos.scr'
  574.  
  575. sub HelpScreen
  576.   if DisplayFile(HelpFileName) then
  577.     do
  578.       dim s as string
  579.       send #Port,
  580.       send #Port, "Type the letter of the command you would like more help with,"
  581.       s = OemUpper(GetLine("or press Enter to return to the main menu: "))
  582.       if s = "" or CallerHungUp then exit do
  583.       send #Port,
  584.       if not DisplayFile(ConfigScriptPath+"\host" + left(s, 1) + ".hlp") then
  585.         send #Port, "Sorry, no help is available for that item."
  586.       end if
  587.     loop
  588.   else
  589.     send #Port, "Sorry, no help information is available."
  590.   end if
  591. end sub
  592.  
  593. ' Page sysop
  594.  
  595. sub PageSysop
  596.   send #Port, "Paging sysop..."
  597.   print "(Sysop: Press F2 to enter chat mode)"
  598.   play "RINGIN"
  599.   send #Port,
  600.   GetLine "Press Enter to continue? "
  601. end sub
  602.  
  603. sub Shutdown
  604.   if User.Level = 0 or Setup.shutdownpass = "" then
  605.     send #Port, "Sorry, shutdown option not available."
  606.     send #Port,
  607.     exit sub
  608.   end if
  609.   if OemUpper(GetLine("Enter shutdown password: ", 0, "", "*")) <> OemUpper(Setup.shutdownpass) then
  610.     send #Port,
  611.     send #Port, "Wrong password entered."
  612.     send #Port,
  613.     exit sub
  614.   end if
  615.   hangup
  616.   end
  617. end sub
  618.  
  619. do
  620.   PrelogFileName    = ConfigScriptPath+"\"+PrelogFileNamePart
  621.   MenuFileName      = ConfigScriptPath+"\"+MenuFileNamePart
  622.   ProtocolFileName  = ConfigScriptPath+"\"+ProtocolFileNamePart
  623.   LogoffFileName    = ConfigScriptPath+"\"+LogoffFileNamePart
  624.   HelpFileName      = ConfigScriptPath+"\"+HelpFileNamePart
  625.   UserFileName      = ConfigScriptPath+"\"+UserFileNamePart
  626.   MsgHeaderFileName = ConfigScriptPath+"\"+MsgHeaderFileNamePart
  627.   MsgDetailFileName = ConfigScriptPath+"\"+MsgDetailFileNamePart
  628.   LoadConfig
  629.   InitModem
  630.   do
  631.     cls
  632.     print "QmodemPro for Windows Host Mode"
  633.     print
  634.     print "Press F1 to log on locally"
  635.     print "Press F7 to pack the messages"
  636.     print "Press F8 to set up the host mode"
  637.     print "Press F9 to quit the host mode"
  638.     print
  639.     print "Modem ready for calls..."
  640.   loop until WaitForCall
  641.   timeout off
  642.   ForceLogoff = False
  643.   print "Call connected at "; BaudRate; " baud"
  644.   hostecho on
  645.   delay 1
  646.   send #Port, "Welcome to the Qmodem for Windows host mode!"
  647.   send #Port,
  648.   send #Port, "Modem result: "; ModemResult
  649.   send #Port, "Connected at "; BaudRate; " bps. ";
  650.   send #Port,
  651.   send #Port,
  652.   DisplayFile PrelogFileName
  653.   call GetCurrentTime(LogonTime)
  654.   call IncDateTime(LogonTime, LogoffTime, 0, val(Setup.MaxTime)*60)
  655.   if GetCallerInfo then
  656.    dim sysopdir as string
  657.    sysopdir = setup.dlpath
  658.    chdrive sysopdir
  659.    chdir sysopdir
  660.     do
  661.       send #Port,
  662.       DisplayFile MenuFileName
  663.       dim cmd as string
  664.       cmd = GetLine("("+str(TimeLeft)+" min. left) Command? ")
  665.       send #Port,
  666.       select case OemUpper(cmd)
  667.         case "?"
  668.           HelpScreen
  669.         case "D"
  670.           DownloadFile
  671.         case "E"
  672.           EnterMessage
  673.         case "F"
  674.           ListFiles
  675.         case "G"
  676.           DisplayFile LogoffFileName
  677.           send #Port, "Thanks for calling!"
  678.           exit do
  679.         case "P"
  680.           PageSysop
  681.         case "C"
  682.           ChangeDir
  683.         case "R"
  684.           ReadMessages
  685.         case "S"
  686.           DosShell
  687.         case "U"
  688.           UploadFile
  689.         case "Z"
  690.           Shutdown
  691.         case else
  692.           send #Port, "Unknown command, try again"
  693.       end select
  694.     loop until TimeLeft < 0 or CallerHungUp
  695.   end if
  696.   hostecho off
  697.   if not Local then
  698.     delay 1
  699.     hangup
  700.     delay 1
  701.   end if
  702. loop
  703.