home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / FileMover / Dopus5 / dOPUS5-DMS-RexxScripts.lzx / UnDMS.dopus5 < prev    next >
Encoding:
Text File  |  1995-06-07  |  2.9 KB  |  104 lines

  1. /*
  2.   $VER: UnDMS.dopus5 1.5 (06.06.95)
  3.   Written by Edmund Vermeulen & Odia The Ultimate.
  4.   ARexx script for DOpus 5 to unpack a dms file with progress indication.
  5.   Call as 'REXX:UnDMS.dopus5 {f} {Qp}'.
  6. */
  7.  
  8. options results
  9.  
  10. lf='0a'x  /* ascii code for linefeed */
  11.  
  12. parse arg '"' dmsfile '"' portname .
  13.  
  14. if portname~=='' then address value portname
  15. else exit
  16.  
  17. Open('isitdms',dmsfile,'R')
  18. If ReadCh('isitdms',3)~='DMS' then do
  19.   dopus request '"Not a DMS disk archive file!" _OK'
  20.   exit
  21. end
  22. Close('isitdms')
  23.  
  24. lister query dest
  25. handle = word(result,1)
  26. lister query handle path
  27. dest=result
  28. if dest=='RESULT' then do
  29.   dopus request '"No Destination Selected!" _OK'
  30.   exit
  31. end
  32.  
  33. verify="NOVERIFY"
  34. dopus request '"Do you want to verify disk?" _Yes|_No'
  35. if rc==1 then verify="VERIFY"
  36.  
  37. dopus request '"Please insert disk in drive "'dest||lf'_OK|_Cancel'
  38. if rc==0 then exit
  39.  
  40. cuthere=lastpos('/',dmsfile)
  41. if cuthere=0 then
  42.    cuthere=pos(':',dmsfile)
  43. dmsname="'"substr(dmsfile,cuthere+1)"'"
  44.  
  45. lister set handle busy on
  46. lister set handle path dest
  47. lister set handle progress 80 'Unpacking' dmsname'...'
  48.  
  49. /* wow! some clever stuff here */
  50. address command 'Run >NIL: <NIL: DMS <NIL: >PIPE:dmsout WRITE' dmsfile 'TO' dest 'NOTEXT' verify
  51. address command 'Status >T:ProcessNo COMMAND DMS'
  52. call open('temp','T:ProcessNo','r')
  53. process=readln('temp')
  54. close('temp')
  55. address command 'Delete >NIL: T:ProcessNo QUIET'
  56.  
  57. nomessage=1
  58. errorreport=''
  59. buffer=''
  60. call open('dmsout','PIPE:dmsout','r')   /* output from DMS comes through PIPE: */
  61.  
  62. do until eof('dmsout')
  63.   buffer=buffer||readch('dmsout',25)    /* read portions of 25 characters */
  64.   here=verify(buffer,'0a0d'x,'m')       /* check for new lines */
  65.   if here>0 then do
  66.     line=left(buffer,here-1)            /* one whole line */
  67.     if nomessage&left(line,7)='No Disk' then do
  68.       lister set handle progress name 'Insert disk in' dest
  69.         nomessage=0
  70.     end
  71.     parse var line ' ' line             /* get rid of some ugly stuff */
  72.     buffer=substr(buffer,here+1)
  73.     if pos('ERROR',upper(line))>0 then do
  74.       errorreport=errorreport||lf||line
  75.       say '07'x                         /* beep the display */
  76.     end
  77.     if pos('unP',line)>0 then do
  78.       track=right(line,2)
  79.       lister set handle progress count track+1
  80.       lister set handle progress name 'Writing Track' track
  81.       lister query handle abort
  82.       if result then do
  83.         address command 'Break' process 'C'
  84.         lister set handle busy off
  85.         lister set handle title 'UnDMS aborted...'
  86.         lister refresh handle full
  87.         exit
  88.       end
  89.     end
  90.     if pos('Verifying track:',line)>0 then lister set handle progress name 'Verifying Track' track
  91.   end
  92. end
  93.  
  94. call close('dmsout')
  95.  
  96. lister set handle busy off
  97. lister read handle dest force
  98. lister set handle title dest
  99. lister refresh handle full
  100.  
  101. if verify="VERIFY" then
  102.   if errorreport~=='' then
  103.     dopus request '"DMS Error Report'||lf||errorreport'" OK'
  104.