Hello All

 I have added requesters to the script, so that it can be started from a
'message list' button, what you need is listed near the top of the script.

 Can now handle 'begin 666' types.

 All the best for the festive season.

--- 8< -- Cut Here -- 8< ---
/*
 $VER: 0.11 UudecodeAttach.rx (18-12-2000)
 $AUTHOR: by Jules (JA888)© 2000
 $DESCRIPTION: Near automatic Uudecode of attachments.

This script requires the following.
Libraries:
  ixemul.library (v48)
  reqtools.library (v38.1413)
  rexxreqtools.library (v37.95)

Command:
  Uudecode (on Aminet, search slrn in News/Comm)

Programme:
  Snoopdos (by Eddy Carroll)

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

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 'Message List' button.

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 [3])
  4) When it has finished, it will either print to a window or show a requester.
*/
OPTIONS RESULTS
PARSE ARG PICOUNT

CALL PRAGMA 'DIRECTORY','RAM:'

IF PICOUNT <1 THEN DO
 USINGREQTOOLS=0
 NL = '0a'x
 CALL ADDLIB("libs:rexxreqtools.library", 0, -30, 0)
 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=99')
 IF RTRESULT~=1 THEN DO ; EXIT ; END
 PICOUNT=RESULT
 USINGREQTOOLS=1
END

/*
 And the path of Snoopdos. Example SNOOP="SYS:Tools/Snoopdos"
 */
SNOOP="SNOOPDOS"

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

/*
 Check that Microdot is running
 */
IF ~SHOW('P','MD.1') THEN EXIT

/*
 Check if SnoopDos is running; if not, then start it
 */
SNOOPPATH="RUN >NIL: "||SNOOP||" HIDEMETHOD=TOOLSMENU HIDE"
IF ~SHOW('P','SNOOPDOS') THEN DO
  ADDRESS COMMAND SNOOPPATH ; ADDRESS COMMAND "WAITFORPORT SNOOPDOS"
END

/*
 Start of Main loop
 */
DO MAINLOOP=1 TO PICOUNT
/*
 Set up Snoopdos
 */
ADDRESS SNOOPDOS ; ENABLE ; CLEARBUFFER ; FORMAT "%50n"

/*
 Read the message in MD-II
 */
ADDRESS MD.1
IF MAINLOOP<2 THEN READSELECTEDMSGS
              ELSE GOTOMSG NEXT

ADDRESS COMMAND 'WAIT'
ADDRESS SNOOPDOS ; SAVEBUFFER "T:SnoopMD"
ADDRESS COMMAND 'WAIT'
DISABLE
CALL OPEN('MD','T:SnoopMD','R')
AA=READCH('MD',125) ; AA=STRIP(AA,'B')
CALL CLOSE('MD')
IF LENGTH(AA)<120 THEN DO
  CALL GETOUTOFHERE ; EXIT
END

/*
 Find the correct line.
 */
DETEC=0 ; PDRAW="" ; DFILE=""
CALL OPEN('MD','T:SnoopMD','R')
DO UNTIL DETEC>1
 PDRAW=READLN('MD') ; DETEC=POS('DBX_',PDRAW)
 IF EOF('MD')=1 THEN DO
 CALL GETOUTOFHERE ; EXIT
 END
END
DFILE=READLN('MD')
CALL CLOSE('MD')
/*
 Give it a hair cut
 */
TARGETFILE=STRIP(PDRAW)||"/"||STRIP(DFILE)
/*
OPF = OUTPUT FILE
SUBCOUNT =  Counter for the number of attachments
BOUNDARY = Mailer boundary
BOUNDARYCOUNTER = Only look for one boundary
 */
BOUNDARY="" ; BOUNDARYCOUNTER=0 ; SUBJECTCOUNTER=0
CALL OPEN('TF',TARGETFILE,'R')
SUBCOUNT=0

CONTA='begin 644' ; CONTB='Content-Type: image/'
CONTC='Content-Type: text/html' ;CONTD='Content-Type: application/rtf'
CONTE='Content-Transfer-Encoding: base64' ; CONTF='begin 666'
/*
 Start of inner loop
 */
DO UNTIL EOF('TF')=1
SUBCOUNT=SUBCOUNT+1 ; DETEC=0 ; PDRAW="" ; DFILE=""
DO UNTIL DETEC=1
 PDRAW=READLN('TF')
 IF SUBJECTCOUNTER<1 & POS('Subject',PDRAW)>0 THEN CALL FINDSUBJECT
 IF BOUNDARYCOUNTER<1 & POS('Content-Type: multipart',PDRAW)>0 THEN CALL FINDBOUNDARY
 IF SUBSTR(PDRAW,1,9) =CONTA THEN DETEC=1
 IF SUBSTR(PDRAW,1,9) =CONTF THEN DETEC=1
 IF SUBSTR(PDRAW,1,20)=CONTB THEN DETEC=1
 IF SUBSTR(PDRAW,1,23)=CONTC THEN CALL OHNOITSHTML
 IF SUBSTR(PDRAW,1,29)=CONTD THEN CALL OHNOITSRTF
 IF SUBSTR(PDRAW,1,33)=CONTE THEN DETEC=1
 IF EOF('TF')=1 THEN LEAVE
END
DETEC=0 ; OPF='T:TF'||PICOUNT||SUBCOUNT
CALL OPEN('IMAGE',OPF,'W')
CALL WRITELN('IMAGE',PDRAW)
DO UNTIL DETEC=1
 PDRAW=READLN('TF') ; CALL WRITELN('IMAGE',PDRAW)
 IF SUBSTR(PDRAW,1,3)='end' THEN DETEC=1
 IF BOUNDARYCOUNTER=1 & PDRAW=BOUNDARY THEN DETEC=1
 IF EOF('TF')=1 THEN DETEC=1
END
END
/*
 End of inner loop
 */
CALL CLOSE('IMAGE') ; CALL CLOSE('TF')
ADDRESS COMMAND 'C:uudecode T:TF* >NIL:'
SAY MAINLOOP' of 'PICOUNT' saved.'
END
/*
 End of Main loop
 */

SAY 'Cleaning up.'
CALL PRAGMA 'DIRECTORY','sys:'
CALL GETOUTOFHERE
ADDRESS COMMAND "C:WAIT"
SAY 'Complete.'
IF  USINGREQTOOLS=1 THEN CALL rtezrequest('All done.',"Thank you")

EXIT

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

OHNOITSRTF:
CALL FINDFILENAME
DO UNTIL SUBSTR(PDRAW,1,5)='{\rtf' ; PDRAW=READLN('TF') ; END
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

OHNOITSHTML:
DD=0
DO UNTIL POS('<HTML>',PDRAW)>0
 IF POS('filename',PDRAW)>0 THEN DO
  EE=PDRAW ; EE=SUBSTR(EE,POS('filename',EE)+10)
  HTMLSTEM.0='RAM:'||SUBSTR(EE,1,LENGTH(EE)-1) ; DD=1
 END
 PDRAW=READLN('TF')
END
DDD=1
DO UNTIL EOF('TF')
 HTMLSTEM.DDD = PDRAW
 IF DD=0 & POS('<TITLE>',PDRAW)>0 THEN DO
   CALL HTMLTITLE ; HTMLSTEM.0=EE ; DD=1
 END
 IF 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

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

FINDFILENAME:
DO UNTIL DD>0
 IF POS('filename',PDRAW)>1 THEN DO
  EE=PDRAW ; EE=SUBSTR(EE,POS('filename',PDRAW)+10)
  EE='RAM:'||SUBSTR(EE,1,LENGTH(EE)-1) ; DD=1
 END
 PDRAW=READLN('TF')
END
DD=0
RETURN

NEEDADUMMY:
CALL OPEN('DUM','T:TFA','W') ; CALL WRITELN('DUM','A') ; CALL CLOSE('DUM')
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

OHNOITSPLAINTEXT:
RETURN

FINDSUBJECT:
SUBJECTID=SPACE(STRIP(SUBSTR(PDRAW,9),'B'),0)
DO UNTIL POS(':',SUBJECTID)=0
 SUBJECTID=SUBSTR(SUBJECTID,POS(':',SUBJECTID)+1)
END
SUBJECTCOUNTER=1
RETURN

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

--
Regards
  Jules

--
I will not complain about the solution when I hear it
-- Bart Simpson
__________________________________________________________________
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