Hello All

  After the fun of last week I found a way of making the script faster, but
with one side effect, it looked as if the script had stopped, so I've added
a progress bar, please read  the required bits before running.

-- 8< --- Cut Here --- 8< --
/*
 $VER: 1.01 UudecodeAttach.rx (14-02-2001)
 $AUTHOR: by Jules <[EMAIL PROTECTED]> ©2001
 $DESCRIPTION: The bulk saving of attachments.

This script requires the following.
Libraries: ixemul.library (v48) - reqtools.library (v37,1413)
           rexxreqtools.library (v38) - rexxsupport.library(34.9)
Commands:   Uudecode (on Aminet, search for 'slrn' in News/Comm)
           (it has no version string but the size can be 80352 or 20052)
           FreshBar 1.1 (On Aminet/util/rexx/FreshBar.lha)
Programme: Snoopdos (Version >3)

Note:
 This script cannot handle attachments which have been split across
 more than one message. Nor will it; as yet, save 'text/plain' attachments.

Instructions:
  1) If 'Snoopdos' is not in your system path, enter the new path in this script.
  2) Select but do not open the first Email or news message, as the script will do
     that. (the first file will be opened with the 'READSELECTEDMSGS' command and
     the subsequent ones' will use the 'GotoMsg Next' command.)
  3) If this scritp is run without arguments it will show a requester for you to
     enter the number of files to be read. Output is by default to 'RAM:'.
     (if run from shell - rx rexx:UudecodeAttach.rx [number of files])
  4) When it has finished, it will either print to a window or show a requester.
*/
OPTIONS RESULTS
PARSE ARG PICOUNT

/* Snoopdos Path */
SNOOP='SNOOPDOS'

/* Libraries */
LIBR.1='rexxreqtools.library' ; LIBR.2='ixemul.library'
LIBR.3='reqtools.library'     ; LIBR.4='rexxsupport.library'
CMAD.1='uudecode' ; CMAD.2='freshbar'

USINGREQTOOLS=0

DO I=1 TO 4
 IF ~EXISTS('Libs:'||LIBR.I) THEN DO
  ERRT='Could not find '||LIBR.I ; CALL WEHAVEAPROBLEM
 END ; ELSE DO
  IF ~SHOW('L',LIBR.I) THEN ADDLIB('Libs:'||LIBR.I, 0, -30, 0)
 END
END
DROP I

IF PICOUNT <1 THEN DO ; USINGREQTOOLS=1 ; PICOUNT=1 ; END

/* Default Paths */
WHERETOPUTTHEM='RAM:'
SNOOPPATH="RUN >NIL: "||SNOOP||" HIDEMETHOD=TOOLSMENU HIDE"

DO I=1 TO 2
IF ~EXISTS('C:'||CMAD.I) THEN DO
 ERRT='Could not find '||CMAD.I ; CALL WEHAVEAPROBLEM
 END ; ELSE DO
  IF I=2 THEN ADDRESS COMMAND "RUN >NIL: C:FreshBar"
 END
END
DROP I

/* Is Microdot running */
IF ~SHOW('P','MD.1') THEN DO
 ERRT="Microdot is not running" ; CALL WEHAVEAPROBLEM
END

IF USINGREQTOOLS=1 THEN DO
 CALL WHEREAREWE ; CALL HOWMANY
END

/* The counters */
AA=0 ; MAINLOOP=1 ; PICOUNT=STRIP(PICOUNT)

CALL PRAGMA 'DIRECTORY',WHERETOPUTTHEM
IF EXISTS('T:SnoopMD') THEN ADDRESS COMMAND "C:DELETE T:SnoopMD QUIET >NIL:"

/* Is SnoopDos running; if not, start it */
IF ~SHOW('P','SNOOPDOS') THEN DO
 ADDRESS COMMAND SNOOPPATH ; ADDRESS COMMAND "WAITFORPORT SNOOPDOS"
END
ADDRESS SNOOPDOS
FUNCTIONS NONE ; FUNCTIONS NOSYSTEM ; NOONLYSHOWFAILS ; NOSHOWCLI
NOMONITORPACKETS ; NOPACKETDEBUGGER ; NOMONITORROMCALLS ; IGNORESHELL
NOUSEDEVICENAMES ; SHOWFULLPATH ; OPEN ; MATCHNAME "microdot"

/* Headers to look for */
CONTA='644' ; CONTB='image/' ; CONTC='text/html' ; CONTD='application/rtf'
CONTE='base64' ; CONTF='666' ; CONTG='755' ; CONTH='BASE64'
LNSTA='Content-Transfer-Encoding:' ; LNSTB='Content-Type:' ; LNSTC='begin'

/* Set up Snoopdos */
ADDRESS SNOOPDOS ; ENABLE ; CLEARBUFFER ; FORMAT "%255n"

/* Make the list of Files */
ADDRESS MD.1
DO SNLOOP=1 TO PICOUNT
 IF SNLOOP<2 THEN READSELECTEDMSGS
             ELSE GOTOMSG NEXT
END

ADDRESS COMMAND 'WAIT'
ADDRESS SNOOPDOS ; SAVEBUFFER "T:SnoopMD" ; DISABLE ; QUIT
ADDRESS COMMAND 'WAIT'

IF ~EXISTS('T:SnoopMD') THEN DO
 ERRT='Could not find SnoopMD' ; CALL WEHAVEAPROBLEM
END

/* Find the correct line. */
DETEC=0 ; PDRAW="" ; PICOUNT=0
CALL OPEN('MD','T:SnoopMD','R')
CALL OPEN('DT','T:DETACH','W')
 DO UNTIL EOF('MD')
  PDRAW=STRIP(READLN('MD'),'B')
   IF POS('DBX_',PDRAW)>1 THEN DO
    CALL WRITELN('DT',PDRAW) ; PICOUNT=PICOUNT+1
   END
 END
CALL CLOSE('MD') ; CALL CLOSE ('DT')
CALL OPEN('DT','T:DETACH','R')

/* Set up progress bar */
ADDRESS FRESHBAR_REXX.1 ; CALL PROGRESSBARSETUP

/*
 Start of Main loop
 */
DO MAINLOOP=1 TO PICOUNT
 BOUNDARY="" ; BOUNDARYCOUNTER=0 ; SUBJECTCOUNTER=0 ; SUBCOUNT=0
 SETCURRENT WINDI1 BARDI1 MAINLOOP
 TARGETFILE=READLN('DT')
 CALL OPEN('TF',TARGETFILE,'R')

/* Start of inner loop */
DO UNTIL EOF('TF')=1
  SUBCOUNT=SUBCOUNT+1 ; DETEC=0 ; PDRAW="" ; DFILE="" ; REFERRED=0
 DO UNTIL DETEC=1
  PDRAW=READLN('TF')
  SELECT
   WHEN EOF('TF')=1 THEN LEAVE
   WHEN SUBJECTCOUNTER<1 & POS('Subject:',PDRAW)>0 THEN CALL FINDTHESUBJECT
   WHEN BOUNDARYCOUNTER<1 & POS('Content-Type: multipart',PDRAW)>0 THEN CALL 
FINDBOUNDARY
   WHEN SUBSTR(PDRAW,1,5) = LNSTC & SUBSTR(PDRAW,7,3) = CONTA | SUBSTR(PDRAW,7,3) = 
CONTF | SUBSTR(PDRAW,7,3) = CONTG THEN DETEC=2
   WHEN SUBSTR(PDRAW,15,6) = CONTB & SUBSTR(PDRAW,1,13) = LNSTB THEN DETEC=1
   WHEN SUBSTR(PDRAW,15,9) = CONTC & SUBSTR(PDRAW,1,13) = LNSTB THEN CALL 
HTMLATTACHMENT
   WHEN SUBSTR(PDRAW,15,15) = CONTD & SUBSTR(PDRAW,1,13) = LNSTB THEN CALL 
RTFATTACHMENT
   WHEN SUBSTR(PDRAW,1,26) = LNSTA & SUBSTR(PDRAW,28,6) = CONTE | SUBSTR(PDRAW,28,6) = 
CONTH THEN DETEC=1
   OTHERWISE NOP
  END
   IF DETEC=2 THEN DO
     DETEC=1 ; REFERRED=644
   END
 END
  DETEC=0 ; OPF='T:TF'||PICOUNT||SUBCOUNT
  CALL OPEN('IMAGE',OPF,'W')
  CALL WRITELN('IMAGE',PDRAW)
   IF REFERRED=644 THEN DO
    DO UNTIL EOF('TF')
     PDRAW=READCH('TF',SUBWORD(STATEF(TARGETFILE),2,1)+1) ; CALL WRITECH('IMAGE',PDRAW)
    END
   DETEC=1
  END ; ELSE DO
    DO UNTIL DETEC=1
      PDRAW=READLN('TF') ; CALL WRITELN('IMAGE',PDRAW)
     SELECT
      WHEN EOF('TF')=1 | SUBSTR(PDRAW,1,3)='end' THEN DETEC=1
      WHEN BOUNDARYCOUNTER=1 & PDRAW=BOUNDARY THEN DETEC=1
      OTHERWISE NOP
     END
    END
   END
END
/* End of inner loop */
 CALL CLOSE('IMAGE') ; CALL CLOSE('TF')
 ADDRESS COMMAND "C:uudecode T:TF* >NIL:"
END
/* End of Main loop */

CALL CLOSE('DT')
IF USINGREQTOOLS~=1 THEN SAY 'Cleaning up.'
CALL PRAGMA 'DIRECTORY','sys:'
CALL GETOUTOFHERE
IF USINGREQTOOLS=1 THEN CALL rtezrequest('All done.',"Thank you")
                   ELSE SAY 'Complete.'
EXIT

GETOUTOFHERE:
 DELETEBARWINDOW WINDI1 ; QUIT
 ADDRESS COMMAND "C:DELETE T:DETACH T:SnoopMD T:TF#? QUIET >NIL:"
RETURN

RTFATTACHMENT:
DD=0
DO UNTIL POS('{\rtf',PDRAW)>0
 CALL FINDFILENAME ; PDRAW=READLN('TF')
END
IF DD<1 THEN EE='DUMMYNAME.RTF'
CALL OPEN('IMAGE',EE,'W')
DO UNTIL EOF('TF')
 CALL WRITELN('IMAGE',PDRAW) ; PDRAW=READLN('TF')
 IF PDRAW=BOUNDARY THEN DO
  CALL CLOSE('IMAGE') ; LEAVE
 END
END
CALL NEEDADUMMY
SUBCOUNT=SUBCOUNT+1
RETURN

HTMLATTACHMENT:
DD=0
DO UNTIL POS('<html>',PDRAW)>0 | POS('<HTML>',PDRAW)>0
 CALL FINDFILENAME ; PDRAW=READLN('TF')
END
IF DD=1 THEN HTMLSTEM.0=EE
        ELSE HTMLSTEM.0=SUBJECTID||'-'||SUBCOUNT||'.html'
DDD=1
DO UNTIL EOF('TF')
  HTMLSTEM.DDD = PDRAW
 IF DD=0 & POS('<title>',PDRAW)>0 | POS('<TITLE>',PDRAW)>0 THEN DO
   CALL HTMLTITLE ; HTMLSTEM.0=EE ; DD=1
 END
  IF POS('</html>',HTMLSTEM.DDD)>0 | POS('</HTML>',HTMLSTEM.DDD)>0 THEN LEAVE
  PDRAW=READLN('TF')
  DDD=DDD+1
END
 CALL OPEN('IMAGE',HTMLSTEM.0,'W')
DO FF=1 TO DDD
 CALL WRITELN('IMAGE',HTMLSTEM.FF)
END
 CALL CLOSE('IMAGE')
 CALL NEEDADUMMY
 DROP DDD HTMLSTEM.
 SUBCOUNT=SUBCOUNT+1
RETURN

NEEDADUMMY:
 CALL OPEN('DUM','T:TFA','W') ; CALL WRITELN('DUM','A') ; CALL CLOSE('DUM')
RETURN

HTMLTITLE:
EE="" ; GG=""
EE=UPPER(STRIP(PDRAW)) ; GG=STRIP(PDRAW)
GG=SUBSTR(GG,POS('<TITLE>',EE)+7)
EE=REVERSE(EE) ; GG=REVERSE(GG)
GG=SUBSTR(GG,POS('<ELTIT/>',EE)+9)
GG=REVERSE(GG) ; EE=WHERETOPUTTHEM||GG||'.html'
DROP GG
RETURN

FINDBOUNDARY:
DD=0
DO UNTIL EOF('TF')
 DD=POS('boundary=',PDRAW)
 IF DD>0 THEN DO
  PDRAW=STRIP(PDRAW) ; EE=SUBSTR(PDRAW,DD+10)
  BOUNDARY='--'||SUBSTR(EE,1,LENGTH(EE)-1)
  DD=0 ; LEAVE
 END
 PDRAW=READLN('TF')
END
BOUNDARYCOUNTER=1
RETURN

FINDFILENAME:
IF POS('filename',PDRAW)>1 THEN DO
  EE=STRIP(PDRAW,'B')
 DO FF=1 TO 2
  EE=SUBSTR(EE,POS('"',EE)+1) ; EE=REVERSE(EE)
 END
  EE=WHERETOPUTTHEM||EE ; DD=1
END
RETURN

PLAINTEXT:
RETURN

FINDTHESUBJECT:
SUBJECTID=SUBSTR(PDRAW,9)
IF POS('Re:',SUBJECTID)>0 & POS('Re:',SUBJECTID)<5 THEN 
SUBJECTID=SUBSTR(SUBJECTID,POS('Re:',SUBJECTID)+4)
SUBJECTID=COMPRESS(SUBJECTID,' :_!$%&*+=|\?/<>')
SUBJECTCOUNTER=1
RETURN

WHEREAREWE:
WHERETOPUTTHEM = RTFILEREQUEST(,,"Where shall I put them?","Alright","rtfi_flags = 
freqf_nofiles")
IF RTRESULT==0 THEN EXIT
RETURN

HOWMANY:
NL = '0a'x
CALL RTGETLONG('1','How Many Messages'NL'do you wish to open','Get attachments by 
Jules',
                  ,"_Yes please|_No thank you",'RTGL_MIN=1 RTGL_MAX=250')
IF RTRESULT~=1 THEN EXIT
PICOUNT=RESULT
RETURN

WEHAVEAPROBLEM:
IF USINGREQTOOLS=1 THEN CALL RTEZREQUEST(ERRT, "Shame", "Error!")
                   ELSE SAY ERRT
EXIT
RETURN

PROGRESSBARSETUP:
 CREATEBARWINDOW "Now" ; WINDI1 = RESULT
 SETBARWINDOWWIDTH WINDI1 200
 ADDBAR WINDI1 PICOUNT NAME 'Message:' ; BARDI1 = RESULT
 SETPROGRESSMODE WINDI1 BARDI1 2
 OPENBARWINDOW WINDI1
RETURN

/*
Version 0.07 - base64 only.
Version 0.08 - Some HTML and RTF added.
Version 0.10 - base64 HTML RTF
Version 0.11 - 'begin 666' added. Can now be started from shell or a 'Message List' 
button.
Version 0.12 - 'begin 755' added.
Version 0.13 - Added the destination requester. A bit more html work.
Version 0.14 - Destination fixed. Stray SnoopMD killed.
Version 0.15 - Faster 644 666 755 processing
Version 0.16 - Error checks improved. - BASE64 - 'SnoopDos' setup changed.
Version 1.00 - Speed increase - One 'open', many 'reads' introduced.
Version 1.01 - Added a progress bar due to the new read method.
*/

-- 8< --- And Here --- 8< --

-- 
Regards
  Jules
__________________________________________________________________
MicroDot-II Mailing List - http://www.vapor.com/md2/
MicroDot-II FAQ: http://faq.vapor.com/md2/
Listserver Help: mailto:[EMAIL PROTECTED]?Subject=HELP
Unsubscribe....: mailto:[EMAIL PROTECTED]?Subject=UNSUBSCRIBE

Reply via email to