home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / tcp / Networking / TCP / FTP / DaFTP / Rexx / Browse.DaFTP next >
Text File  |  1995-02-08  |  13KB  |  455 lines

  1. /* Browse.DaFTP
  2.  * Browse AmiNet using DaFTP and AmigaGuide
  3.  * $VER: Browse.daftp 0.15 (31.12.94)
  4.  * By Osma Ahvenlampi and Dan Murrell, Jr.
  5.  */
  6.  
  7. if ~show(l, 'rexxsupport.library') then
  8.     if ~addlib('rexxsupport.library', 0, -30, 0) then
  9.         exit 50
  10.  
  11. if ~show(l, 'rexxreqtools.library') then
  12.     if ~addlib('rexxreqtools.library', 0, -30, 0) then
  13.         exit 50
  14.  
  15. if ~show(l, 'amigaguide.library') then
  16.     if ~addlib('amigaguide.library', 0, -30, 0) then
  17.         exit 50
  18.  
  19. if ~exists("REXX:Browse.DaFTP") then do
  20.     call rtezrequest("Please copy Browse.DaFTP to REXX: before using!",,"BrowseAminet Error")
  21.     exit 10
  22. end
  23.  
  24. /* globals
  25.  */
  26. dir = "T:BrowseAminet"
  27. daftp_args = "NOANIMABORT ICONIFIED" /* if Browse.DaFTP needs to start DaFTP, use these args */
  28.  
  29. /* Initialisation */
  30. parse arg action ' ' sitename ' ' portname ' ' pubscreen ' ' opt1 ' ' opt2
  31.  
  32. action = upper( action )
  33.  
  34. if portname = "" then
  35.     portname = address()
  36. if portname = "REXX" then
  37.     portname = "daftp"
  38. if pubscreen = "" then
  39.     pubscreen = "Workbench"
  40.  
  41. address value portname
  42. options results
  43.  
  44. call CreateDir
  45. call CreatePrefsFile
  46.  
  47. if open( fdate, "ENVARC:BrowseAminet", 'R' ) then do
  48.     lastdate = readln( fdate )
  49.     temp = readln( fdate )
  50.     parse var temp findsite ' ' use_gzip ' ' maxfind
  51.     call close( fdate )
  52. end
  53. else do
  54.     lastdate = 0
  55.     findsite = ""
  56.     use_gzip = 0
  57.     maxfind = 30
  58. end
  59.  
  60. if findsite = "" then
  61.     call ChooseFindSite
  62.     
  63. if use_gzip = "" | use_gzip = "USE_GZIP" then
  64.     use_gzip = 0
  65.     
  66. if maxfind = "" | maxfind = "MAXFIND" then
  67.     maxfind = 30
  68.  
  69. say lastdate findsite use_gzip maxfind
  70.  
  71. /* Possible actions... from first arg:
  72.  * CONNECT - connect to a site
  73.  * LIST - list all files in the ADT_RECENT
  74.  * UPLOAD - send a file
  75.  * FIND - find a file
  76.  * GETFILE - get a file
  77.  * GETMARKED - get all marked files
  78.  * something else - show front page
  79.  */
  80. if action = "CONNECT" then
  81.     call ConnectAminet
  82. else if action = "LIST" then 
  83.     call ParseRecent dir'/ADT_RECENT' 1
  84. else if action = "UPLOAD" then
  85.     call UploadFile
  86. else if action = "FIND" then
  87.     call FindFile
  88. else if action = "GETFILE" then
  89.     call GetFile
  90. else if action = "GETMARKED" then
  91.     call GetMarked
  92. else if action = "SHOWFILE" then
  93.     call ShowFile
  94. else
  95.     call ShowFrontPage
  96.  
  97. call Cleanup
  98. exit 0
  99.  
  100. /******* main modes ********/
  101.  
  102. ShowFrontPage: procedure expose portname pubscreen dir
  103.     hotlist = dir'/' || pragma('ID') || '.guide'
  104.     if open(fhotlist, hotlist, 'W') then do
  105.         call writeln(fhotlist, '@database AmiNetBrowser')
  106.         call writeln(fhotlist, '@node "Main" "AmiNet Browser for DaFTP"')
  107.         call writeln(fhotlist, '@{b}AmiNet Browser for DaFTP@{ub}')
  108.         call writeln(fhotlist, 'by Osma Ahvenlampi and Dan Murrell Jr.')
  109.         call writeln(fhotlist, '')
  110.         call writeln(fhotlist, '@{" About BrowseAminet " alink "BrowseAminet.guide/Main"}')
  111.         call writeln(fhotlist, '')
  112.         call writeln(fhotlist, '@{b}AmiNet Sites@{ub}')
  113.  
  114.         if open( fsitelist, "ENVARC:BrowseAminet", 'R' ) then do
  115.             call readln( fsitelist )
  116.             call readln( fsitelist )
  117.             line = readln( fsitelist )
  118.             do while line ~= ""
  119.                 colon = lastpos(":", line) + 1
  120.                 call writeln(fhotlist, '@{"' line '" rx "Browse.DaFTP CONNECT' substr(line, colon) portname pubscreen'"}')
  121.                 line = readln( fsitelist )
  122.             end
  123.             call close( fsitelist )
  124.         end
  125.         else
  126.             exit 10
  127.  
  128.         call writeln(fhotlist, '@endnode')
  129.         call close(fhotlist)
  130.         call shownode( pubscreen, hotlist, 'Main', 0, 0 )
  131.         return
  132.     end
  133.     exit 10
  134.  
  135. ConnectAminet: 
  136.     call InitDaFTP
  137.  
  138.     if use_gzip = 1 then do
  139.         'GET BIN /pub/aminet/info/adt/ADT_RECENT_7.gz LOCAL' dir'/ADT_RECENT.gz'
  140.  
  141.         address command 'gzip >NIL: -df' dir'/ADT_RECENT.gz'
  142.         if RC ~= 0 then do
  143.             'DISCONNECT'
  144.             call rtezrequest("Failed to uncompress RECENT file",,"BrowseAminet Error")
  145.             exit 10
  146.         end
  147.     end
  148.     else
  149.         'GET BIN /pub/aminet/info/adt/ADT_RECENT_7 LOCAL' dir'/ADT_RECENT'
  150.  
  151.     call ParseRecent dir'/ADT_RECENT' 0
  152.     if result ~= "OK" then do
  153.         call rtezrequest(result,,"BrowseAminet Error")
  154.         'DISCONNECT'
  155.         exit 10
  156.     end
  157.  
  158.     'DISCONNECT'
  159.  
  160.     call WriteSiteList
  161.  
  162.     return
  163.     
  164. UploadFile: procedure expose sitename pubscreen portname dir
  165.     filename = rtfilerequest("","","Choose file to be uploaded")
  166.     call rtfreefilebuffer()
  167.     if filename = "" then
  168.         return
  169.     dot = lastpos(".", filename)
  170.     if (dot > 0) then
  171.         readme = left(filename, dot) || 'readme'
  172.     else
  173.         readme = filename'.readme'
  174.     if ~exists( filename ) | ~exists( readme ) then do
  175.         call rtezrequest("Need both file and .readme",,"BrowseAminet Error")
  176.         exit 10
  177.     end
  178.  
  179.     call InitDaFTP
  180.  
  181.     'CD /pub/aminet/new'
  182.     if RC ~= 0 then do
  183.         call rtezrequest("This site doesn't accept uploads",,"BrowseAminet Error")
  184.         exit 10
  185.     end
  186.  
  187.     'MPUT' filename readme
  188.  
  189.     return
  190.     
  191. FindFile: procedure expose sitename pubscreen portname dir lastdate findsite maxfind
  192.     if ~showlist('H','TCP') then do
  193.         call rtezrequest("This function needs TCP: mounted!",,"BrowseAminet Error")
  194.         exit 10
  195.     end
  196.     
  197.     findstr = rtgetstring(,"Please enter search keyword","Find which file?")
  198.     if findstr="" then
  199.         return
  200.     if open( ffindfile, dir'/FINDFILE', 'W' ) then do
  201.         if open( ffind, 'TCP:' || findsite || '/1848', 'W' ) then do
  202.             call writeln( ffind, 'max' maxfind '; ADTfind' findstr '; quit' || d2c(13) )
  203.             do until line = ""
  204.                 line = readln( ffind )
  205.                 call writeln( ffindfile, line )
  206.             end
  207.             call close( ffind )
  208.         end
  209.         else do
  210.             call rtezrequest("Failed to connect to find server",,"BrowseAminet Error")
  211.             exit 10
  212.         end
  213.  
  214.         call close( ffindfile )
  215.     
  216.         call ParseRecent dir'/FINDFILE' 1
  217.         if result ~= "OK" then do
  218.             call rtezrequest(result,,"BrowseAminet Error")
  219.             exit 10
  220.         end
  221.         return
  222.     end
  223.  
  224.     call rtezrequest("Failure during find attempt",,"BrowseAminet Error")
  225.     exit 10
  226.  
  227. GetFile: procedure expose sitename pubscreen portname opt1 daftp_args
  228.     call InitDaFTP
  229.     'SETATTR BATCH 0 PROCESS 1'
  230.     'GET BIN' opt1
  231.     'SETATTR PROCESS 0'
  232.     exit 0
  233.     
  234. GetMarked: procedure expose sitename pubscreen daftp_args portname
  235.     call InitDaFTP
  236.     'SETATTR BATCH 1 PROCESS 0'
  237.     'MGET'
  238.     exit 0
  239.  
  240. ShowFile: procedure expose sitename pubscreen portname opt1 opt2 daftp_args
  241.     call InitDaFTP
  242.     'SETATTR BATCH 0 PROCESS 0'
  243.     'GET BIN' opt1 'LOCAL' opt2
  244.     call shownode(pubscreen,opt2,'Main',0,0)
  245.     exit 0
  246.  
  247. /******* utility procedures ********/
  248.  
  249. /*  read ADT_RECENT and parse it to a .guide
  250.  */
  251. ParseRecent: procedure expose lastdate sitename dir portname pubscreen
  252.     parse arg recentfile list
  253.  
  254.     newfile = dir'/' || pragma('ID') || '.guide'
  255.  
  256.     if ~open( frecent, recentfile, 'R' ) then
  257.         return "Can't open" recentfile
  258.     if ~open( fnewfile, newfile, 'W' ) then do
  259.         call close( frecent )
  260.         return "Can't create" newfile
  261.     end
  262.  
  263.     line = readln( frecent )
  264.     if line ~= "#adt-v2" then do
  265.         call close( frecent )
  266.         call close( fnewfiles )
  267.         return "Wrong ADT_RECENT version"
  268.     end
  269.  
  270.     call writeln( fnewfile, '@database Browse_RECENT' )
  271.     call writeln( fnewfile, '@node Main "Aminet - using site' sitename'"' )
  272.     call writeln( fnewfile, '@{"  Show last week  " rx "Browse.DaFTP LIST' sitename portname pubscreen'"}   @{" Search for a file " rx "Browse.DaFTP FIND' sitename portname pubscreen'"}   @{" Top downloads chart " rx "Browse.DaFTP SHOWFILE' sitename portname pubscreen '/pub/aminet/CHARTS' dir'/CHARTS"}')
  273.     call writeln( fnewfile, '@{" Get marked files " rx "Browse.DaFTP GETMARKED' sitename portname pubscreen'"}   @{"    Upload file    " rx "Browse.DaFTP UPLOAD' sitename portname pubscreen'"}   @{"  BrowseAminet Help  " alink "BrowseAminet.guide/Usage"}')
  274.     call writeln( fnewfile, '' )
  275.  
  276.     do while abbrev( line, "#", 1 )
  277.         line = readln( frecent )
  278.         if list ~= 1 then do
  279.             if abbrev(line,"#amotd",6) then do
  280.                 if lastdate < substr(line,8) then do
  281.                     'GET BIN /pub/aminet/info/adt/aminet-motd LOCAL' dir'/motd'
  282.                     call shownode(pubscreen,dir'/motd','Main',0,0)
  283.                 end
  284.             end
  285.             else if abbrev(line,"#sites",6) then do
  286.                 if lastdate < substr(line,8) then
  287.                     call ParseSiteList
  288.             end
  289.         end
  290.     end
  291.  
  292.     newdate = lastdate
  293.     newfiles = 0
  294.  
  295.     if list = 1 then
  296.         lastdate = 0
  297.  
  298.     do while line ~= "" & ~abbrev( line, '#' )
  299.         parse var line file.date '@' file.dir '@' file.name '@' file.size '@' a '@' b '@' c '@' file.desc
  300.         if file.date > lastdate then do
  301.             if newdate <= file.date then
  302.                 newdate = file.date
  303.             dot = lastpos(".", file.name)
  304.             if (dot > 0) then
  305.                 file.readme = left(file.name, dot) || 'readme'
  306.             else
  307.                 file.readme = file.name'.readme'
  308.  
  309. /*name*/    lin = '@{"' left(file.name, 16, ' ') '" rx "Browse.DaFTP GETFILE' sitename portname pubscreen '/pub/aminet/'file.dir'/'file.name'"}'
  310. /*dir*/        lin = lin left(file.dir, 9, ' ')
  311. /*size*/    lin = lin '@{"'right(trunc(file.size/1024, 0), 4, ' ') || 'K" rxs "address '''portname''';''SETATTR BATCH 1'';''REVEAL GETLIST 1'';''GET BIN /pub/aminet/'file.dir'/'file.name'''"}'
  312. /*desc*/    lin = lin '@{"' file.desc '" rx "Browse.DaFTP SHOWFILE' sitename portname pubscreen '/pub/aminet/'file.dir'/'file.readme dir'/'file.readme'"}'
  313.  
  314.             call writeln( fnewfile, lin )
  315.  
  316.             newfiles = 1
  317.         end
  318.  
  319.         line = readln( frecent )
  320.     end
  321.  
  322.     if ~newfiles then
  323.         if list ~= 1 then 
  324.             call writeln( fnewfile, '  No new files on' sitename'.' )
  325.         else
  326.             call writeln( fnewfile, '  No files ('sitename').' )
  327.  
  328.     call writeln( fnewfile, '@endnode' )
  329.  
  330.     call close( frecent )
  331.     call close( fnewfile )
  332.  
  333.     call shownode(pubscreen,newfile,'Main',0,0)
  334.  
  335.     lastdate = newdate
  336.  
  337.     return "OK"
  338.  
  339. /* Make sure DaFTP is running and connected to the correct site
  340.  */
  341. InitDaFTP: procedure expose portname pubscreen daftp_args sitename
  342.     if ~show( 'P', portname ) then do
  343.         address command 'Run >NIL: DaFTP >NIL:' daftp_args 'PUBSCREEN' pubscreen
  344.         address command 'WaitForPort' portname
  345.         if RC ~= 0 then do
  346.             call rtezrequest("Could not start DaFTP",,"BrowseAminet Error")
  347.             exit 20
  348.         end
  349.     end
  350.  
  351. /*    'DEACTIVATE' */
  352.     'SETATTR PROCESS 0 BEEP 0'
  353.     'REVEAL LOG 0 GETLIST 0 PUTLIST 0 HOTLIST 0'
  354.     'GETATTR STEM STAT'
  355.     if stat.host ~= sitename then do
  356.         'DISCONNECT'
  357.         'SETATTR HOST' sitename 'PORT 21 ANONYMOUS 1 REMOTEDIR /pub/aminet'
  358.     end
  359.     if ~stat.connected then
  360.         'CONNECT NOSCAN'
  361.     
  362.     return
  363.  
  364. /* Create a dir for all these files
  365.  */
  366. CreateDir: procedure expose dir
  367.     if ~exists(dir) then
  368.         call makedir(dir)
  369.     return
  370.  
  371. /* Cleanup after myself
  372.  */
  373. Cleanup: procedure expose dir
  374.     address command 'Delete >NIL:' dir 'ALL FORCE QUIET'
  375.     return
  376.  
  377. /* Read ADT sites file and make a prefs file
  378.  */
  379. ParseSiteList: procedure expose lastdate dir findsite
  380.     'GET BIN /pub/aminet/info/adt/sites LOCAL' dir'/sites'
  381.     if open( fsites, dir'/sites', 'R' ) then do
  382.         if open( fsitelist, "ENVARC:BrowseAminet", 'W' ) then do
  383.             call writeln( fsitelist, lastdate )
  384.             call writeln( fsitelist, findsite )
  385.             if readln( fsites ) ~= '#adtrc-v2' then
  386.                 return
  387.             do until abbrev( pline, 'ftpsites', 7 )
  388.                 pline = readln( fsites )
  389.             end
  390.             sites = 1
  391.             do forever
  392.                 line = readln( fsites )
  393.                 parse var line area ',' address ',' rest
  394.                 writeln( fsitelist, area':'address )
  395.                 if right( rest, 1 ) ~= '\' then
  396.                     leave
  397.             end
  398.             call close( fsitelist )
  399.         end
  400.         call close( fsites )
  401.     end
  402.     return
  403.  
  404. /* Update prefs file to current lastdate/findsite/gzip/maxfind
  405.  */
  406. WriteSiteList: procedure expose lastdate findsite use_gzip maxfind
  407.     tempname = "ENVARC:BrowseAminet-" || pragma('ID')
  408.     if open( fprefs, tempname, 'W' ) then do
  409.         if open( fsitelist, "ENVARC:BrowseAminet", 'R' ) then do
  410.             call readln( fsitelist )
  411.             call writeln( fprefs, lastdate )
  412.             call readln( fsitelist )
  413.             call writeln( fprefs, findsite use_gzip maxfind )
  414.             do until line = ""
  415.                 line = readln( fsitelist )
  416.                 if line ~= "" then
  417.                     call writeln( fprefs, line )
  418.             end
  419.             call close( fsitelist )
  420.         end
  421.         call close( fprefs )
  422.         call delete( "ENVARC:BrowseAminet" )
  423.         call rename( tempname, "ENVARC:BrowseAminet" )
  424.     end
  425.     return
  426.  
  427. /* Create a simple prefs file for the first run
  428.  */
  429. CreatePrefsFile: procedure 
  430.     if ~exists( "ENVARC:BrowseAminet" ) then
  431.         if open( fsitelist, "ENVARC:BrowseAminet", 'W' ) then do
  432.             call writeln( fsitelist, '0' )
  433.             call writeln( fsitelist, '' )
  434.             call writeln( fsitelist, 'US:ftp.wustl.edu' )
  435.             call writeln( fsitelist, 'US:ftp.netnet.net' )
  436.             call writeln( fsitelist, 'SWEDEN:ftp.luth.se' )
  437.             call writeln( fsitelist, 'GERMANY:ftp.uni-paderborn.de' )
  438.             call writeln( fsitelist, 'UK:ftp.doc.ic.ac.uk' )
  439.             call close( fsitelist )
  440.         end
  441.     return
  442.  
  443. /* Choose the nearest ADT find server
  444.  */
  445. ChooseFindSite: procedure expose findsite lastdate
  446.     location = rtezrequest("Please choose the country located nearest to you.","USA|Switzerland|Germany","BrowseAminet configuration")
  447.     if location = 1 then
  448.         findsite = "ftp.wustl.edu"
  449.     else if location = 2 then
  450.         findsite = "amiga.icu.net.ch"
  451.     else if location = 0 then
  452.         findsite = "haegar2.uni-paderborn.de"
  453.     call WriteSiteList
  454.     return
  455.