home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / comm / Fido / MailManager / Contrib / Alessandro_Zummo / MM_MultiCode.rexx < prev    next >
OS/2 REXX Batch file  |  1995-06-25  |  20KB  |  914 lines

  1.  /*
  2.  * MM_MultiCode.rexx
  3.  *
  4.  * Copyright © 1995 by Alessandro Zummo
  5.  *
  6.  * USAGE: RX MM_MultiCode <area tag> <message number> <action>
  7.  *
  8.  * MM_Decode.rexx try to rejoin encoded data splitted onto more files into
  9.  * one and than decode the result using the proper decoder.
  10.  *
  11.  * Based on MM_Decode.rexx by Alessandro Zummo
  12.  *
  13.  * HISTORY:
  14.  *    v1.00    First release
  15.  *
  16.  * $VER: MM_MultiCode.rexx 0.53 (30.4.1995)
  17.  */
  18.  
  19. /*
  20.  * User parameters
  21.  */
  22.  
  23. MM.PrgName  = 'MM_MultiCode v0.53'
  24. MM.UUXT     = 'UUxt'
  25. MM.FSCode   = 'FSCode'
  26. MM.Delete   = 'C:Delete'
  27. MM.TempFile = 'T:MM_Decode.trans'
  28. MM.TempList = 'T:MM_Decode.list'
  29. MM.OutPath  = 'RAM:'
  30. MM.Stack    = 10000
  31.  
  32. /* --------------------------------------------------------------------- */
  33.  
  34.  
  35. MM.nl = '0a'x
  36.  
  37. PARSE UPPER ARG MM.Area MM.MsgNum MM.Action
  38.  
  39. ADDRESS MAILMANAGER
  40. OPTIONS RESULTS
  41.  
  42. DROP MM.Msg.
  43.  
  44. MM_ReadMsg MM.Area MM.MsgNum MM.Msg
  45. IF rc ~= 0 THEN exit
  46.  
  47. DROP MM.Type.
  48.  
  49.  
  50. CALL Pragma('S',MM.Stack)
  51.  
  52. SELECT
  53.     WHEN MM.Action = 'E' THEN CALL Encode()
  54.     WHEN MM.Action = 'D' THEN NOP
  55.     WHEN MM.Action = ''  THEN
  56.     DO
  57.         f=Requester(MM.PrgName,'   Select action...  ','EnCode|DeCode')
  58.         IF f = 1 THEN CALL Encode()
  59.     END
  60.     OTHERWISE
  61.     DO
  62.         CALL Requester(MM.PrgName,'Wrong action: 'MM.Action,'Ok')
  63.         exit
  64.     END
  65. END
  66.  
  67.  
  68.  
  69.  
  70. MM_SearchInStem MM.Msg.Text MM.Type '!start#?' STR
  71. IF MM.Type.Count > 0 THEN DO
  72.  
  73.    MM.uu = 'FSCode'
  74.  
  75.    MM.Names. = MM.Type.
  76.  
  77.    PARSE VAR MM.Type.0 null ' ' MM.Name
  78.    DROP MM.Type.
  79.  
  80.    MM_SearchInStem MM.Msg.Text MM.Type '!end#?' STR
  81.    IF MM.Type.Count > 0 THEN DO
  82.     DROP MM.Type.
  83.  
  84.        MM_WriteStem MM.TempFile MM.Msg.Text
  85.  
  86.        ADDRESS COMMAND MM.FsCode MM.TempFile ' TO ' MM.OutPath||MM.Name
  87.        MM_DeleteFile MM.TempFile
  88.  
  89.        MM.fl = MM.OutPath||MM.Name
  90.  
  91.        CALL Requester('File exctracted!',MM.fl,'Ok')
  92.        exit    
  93.    END
  94.    ELSE
  95.    DO
  96.        j = Incomplete("Fscoded")
  97.  
  98.        IF j = 1 THEN CALL SavePartial('FS')
  99.        ELSE exit
  100.    END
  101. END
  102. ELSE 
  103. MM_SearchInStem MM.Msg.Text MM.Type '!mstrt#?' STR
  104. IF MM.Type.Count > 0 THEN 
  105. DO
  106.  
  107.         PARSE VAR MM.Type.0 lp ' ' MM.part '/' MM.tot ' ' MM.Name
  108.  
  109.            DROP MM.Type.
  110.  
  111.  
  112.            MM_SearchInStem MM.Msg.Text MM.Type '!end#?' STR
  113.            IF MM.Type.Count > 0 THEN 
  114.         DO
  115.  
  116.             MM_WriteStem 'T:MFS.'MM.Name||MM.part MM.Msg.Text
  117.  
  118.             IF MM.part = MM.tot THEN CALL CheckPart()
  119.             ELSE
  120.             IF Exists('T:MFS.'MM.Name||MM.tot) THEN
  121.                 CALL CheckPart()
  122.         END
  123.         ELSE
  124.         DO
  125.             Requester('Fatal error!','The FSCoded message is incomplete,'MM.nl' I can''t recover it.','Ok :(')
  126.         END
  127. exit
  128. END
  129. ELSE
  130. DO
  131.     DROP MM.Type.
  132.  
  133.     MM_SearchInStem MM.Msg.Text MM.Type '!end#?' STR
  134.  
  135.     IF MM.Type.Count > 0 THEN 
  136.     DO
  137.          MM_SearchInStem MM.Msg.Text MM.Type '"~(!end#?)"' NUM
  138.         IF rc = 0 THEN CALL LeaveBlank()
  139.  
  140.         MM.Msg.From = TRANSLATE(MM.Msg.From,'.',' ')
  141.         MM.Msg.FromAddr = TRANSLATE(MM.Msg.FromAddr,'...',':/@')
  142.  
  143.         MM_WriteStem 'T:MMD.'MM.Msg.FromAddr MM.Msg.Text APPEND
  144.    
  145.         MM_ReadStem 'T:MMD.'MM.Msg.FromAddr Whc
  146.  
  147.         PARSE VAR Whc.6 null ' ' MM.Name
  148.  
  149.         ADDRESS COMMAND MM.FsCode 'T:MMD.'MM.Msg.FromAddr ' TO ' MM.OutPath||MM.Name
  150.  
  151.         a.0 = MM.OutPath||MM.Name
  152.  
  153.         CALL Requester('Yeah!','File completed & extracted:'MM.nl||a.0,'Ok')
  154.  
  155.         MM_DeleteFile 'T:MMD.'MM.Msg.FromAddr
  156.         exit
  157.     END
  158. END
  159.  
  160.  
  161. CALL CheckResume('FS')
  162.  
  163.  
  164.  
  165. DROP MM.Type.
  166.  
  167.  
  168. MM_SearchInStem MM.Msg.Text MM.Type 'begin#?' STR
  169. IF MM.Type.Count > 0 THEN DO
  170.  
  171.    MM.uu = 'UUCode'
  172.  
  173.    MM.Names. = MM.Type.
  174.  
  175.    PARSE VAR MM.Type.0 null ' ' null ' ' MM.Name
  176.    DROP MM.Type.
  177.  
  178.    MM_SearchInStem MM.Msg.Text MM.Type 'end#?' STR
  179.    IF MM.Type.Count > 0 THEN DO
  180.     DROP MM.Type.
  181.  
  182.        MM_WriteStem MM.TempFile MM.Msg.Text
  183.  
  184.        ADDRESS COMMAND MM.UUXT ' x ' MM.TempFile 'dest='MM.OutPath
  185.        MM_DeleteFile MM.TempFile
  186.  
  187.        MM.fl = MM.OutPath||MM.Name
  188.  
  189.        CALL Requester('File exctracted!',MM.fl,'Ok')
  190.        exit    
  191.    END
  192.    ELSE
  193.    DO
  194.        j = Incomplete("UUCoded")
  195.  
  196.        IF j = 1 THEN CALL SavePartial('UU')
  197.        ELSE exit
  198.    END
  199. END
  200. ELSE 
  201. DO
  202.     DROP MM.Type.
  203.  
  204.     MM_SearchInStem MM.Msg.Text MM.Type 'end#?' STR
  205.  
  206.     IF MM.Type.Count > 0 THEN 
  207.     DO
  208.          MM_SearchInStem MM.Msg.Text MM.Type '"~(end#?)"' NUM
  209.         IF rc = 0 THEN CALL LeaveBlank('UU')
  210.  
  211.         MM.Msg.From = TRANSLATE(MM.Msg.From,'.',' ')
  212.         MM.Msg.FromAddr = TRANSLATE(MM.Msg.FromAddr,'...',':/@')
  213.  
  214.         MM_WriteStem 'T:MMD.'MM.Msg.FromAddr'.uu' MM.Msg.Text APPEND
  215.    
  216.         MM_ReadStem 'T:MMD.'MM.Msg.FromAddr'.uu' Info
  217.  
  218.         PARSE VAR Info.6 null' ' null ' ' MM.Name
  219.     
  220.         ADDRESS COMMAND MM.UUXT 'x T:MMD.'MM.Msg.FromAddr'.uu' ' dest=' MM.OutPath
  221.  
  222.         a.0 = MM.OutPath||MM.Name
  223.  
  224.         CALL Requester('Yeah!','File completed & extracted:'MM.nl||a.0,'Ok')
  225.  
  226.         MM_DeleteFile 'T:MMD.'MM.Msg.FromAddr'.uu'
  227.  
  228.         exit
  229.     END
  230. END
  231.  
  232. CALL CheckResume('UU')
  233.  
  234. CALL Requester(MM.PrgName,'   Nothing to do....   ','Ok')
  235.  
  236.  
  237. EXIT
  238.  
  239. /* --------------------------------------------------------------------- */
  240.  
  241. LeaveBlank: PROCEDURE EXPOSE MM.
  242.  
  243.  
  244. PARSE ARG Arg
  245.  
  246. DO n = 0 FOR MM.Type.Count
  247.  
  248.    a = MM.Type.n
  249.  
  250.    b = POS(' ',a)
  251.  
  252.     IF Arg = 'UU' THEN 
  253.     DO
  254.         g = POS('M',a)
  255.  
  256.         IF g = 1 THEN b = 0 ELSE b = 1
  257.    
  258.     END
  259.  
  260.     IF B ~= 0 THEN MM.Msg.Text.a = ''
  261.  
  262. END
  263.  
  264. RETURN
  265.  
  266. /* --------------------------------------------------------------------- */
  267.  
  268. Incomplete: PROCEDURE EXPOSE MM.
  269.  
  270.  PARSE ARG ttt
  271.  
  272.  a.1 = 'Do you want to save this incompleted'MM.nl' file to a temp file?'
  273.  
  274.  a.2 = '*_Yes|_No'
  275.  
  276.  a.3 = 'Incomplete 'ttt' file found...'
  277.  
  278.  j = Requester(a.3,a.1,a.2)
  279.  
  280.  RETURN j
  281. /* --------------------------------------------------------------------- */
  282.  
  283.  
  284. SavePartial: PROCEDURE EXPOSE MM.
  285.  
  286.  
  287. DROP MM.Type.
  288.  
  289. PARSE UPPER ARG MM.SVArg
  290.  
  291. IF MM.SVArg = 'UU' THEN
  292.     MM_SearchInStem MM.Msg.Text MM.Type '"~(begin#?)"' NUM
  293. ELSE
  294.     MM_SearchInStem MM.Msg.Text MM.Type '"~(!start#?)"' NUM
  295.  
  296. CALL LeaveBlank(MM.SVArg)   
  297.  
  298.  
  299. MM.Msg.From = TRANSLATE(MM.Msg.From,'.',' ')
  300. MM.Msg.FromAddr = TRANSLATE(MM.Msg.FromAddr,'...',':/@')
  301.  
  302. DROP Info.
  303.  
  304. Info.0 = MM.Msg.From
  305. Info.1 = MM.Msg.FromAddr
  306. Info.2 = MM.MsgNum
  307. Info.3 = MM.Area
  308. Info.4 = MM.uu
  309. Info.5 = '' 
  310. Info.Count = 6
  311.  
  312. IF MM.SVArg = 'UU' THEN DO
  313.     MM_WriteStem 'T:MMD.'MM.Msg.FromAddr'.uu' Info
  314.     MM_WriteStem 'T:MMD.'MM.Msg.FromAddr'.uu' MM.Msg.Text APPEND
  315.  
  316. END
  317. ELSE DO
  318.     MM_WriteStem 'T:MMD.'MM.Msg.FromAddr Info
  319.     MM_WriteStem 'T:MMD.'MM.Msg.FromAddr MM.Msg.Text APPEND
  320. END
  321.  
  322. exit
  323.  
  324. RETURN
  325.  
  326. /* --------------------------------------------------------------------- */
  327.  
  328. CheckResume: PROCEDURE EXPOSE MM.
  329.  
  330. PARSE UPPER ARG MM.Arg
  331.  
  332.  
  333. MM.Msg.From     = TRANSLATE(MM.Msg.From,'.',' ')
  334. MM.Msg.FromAddr = TRANSLATE(MM.Msg.FromAddr,'...',':/@')
  335.  
  336. DROP MM.Info.
  337.  
  338.         IF MM.Arg = 'FS' THEN
  339.         DO
  340.  
  341.             FileName = 'T:MMD.'MM.Msg.FromAddr
  342.  
  343.             IF Exists(FileName) THEN
  344.             DO
  345.                 MM_ReadStem FileName MM.Info
  346.  
  347.                 IF rc = 0 THEN CALL Resume()
  348.  
  349.             END
  350.         END
  351.  
  352.         IF MM.Arg = 'UU' THEN
  353.         DO
  354.  
  355.             FileName = 'T:MMD.'MM.Msg.FromAddr'.uu'
  356.  
  357.             IF Exists(FileName) THEN
  358.             DO
  359.  
  360.                 MM_ReadStem FileName MM.Info
  361.  
  362.                 IF rc = 0 THEN CALL Resume()
  363.             END
  364.         END
  365. RETURN 
  366.  
  367. /* --------------------------------------------------------------------- */
  368.  
  369. Resume: PROCEDURE EXPOSE MM. 
  370.  
  371. IF MM.Msg.From     ~= MM.Info.0 THEN CALL InvalidResumeFile()
  372. IF MM.Msg.FromAddr ~= MM.Info.1 THEN CALL InvalidResumeFile()
  373. IF MM.Area         ~= MM.Info.3 THEN CALL InvalidResumeFile()
  374.  
  375. MM.From     = TRANSLATE(MM.Msg.From,' ','.')
  376. MM.FromAddr = TRANSLATE(MM.Msg.FromAddr,':/@','...')
  377.  
  378.  
  379. a.1 = 'Do you want to add this 'MM.Info.4'd ' MM.nl 'file to the previous saved file?'
  380. a.2 = '*_Yes|_No'
  381. a.3 = 'Resuming...'
  382.  
  383. k = Requester(a.3,a.1,a.2)
  384.  
  385. IF k = 1 THEN DO
  386.  
  387.     DROP MM.Type
  388.  
  389.     MM_SearchInStem MM.Msg.Text MM.Type '#?' NUM
  390.  
  391.     IF MM.Info.4 = 'FSCode' THEN
  392.     DO
  393.         CALL LeaveBlank('FS')
  394.         MM_WriteStem 'T:MMD.'MM.Msg.FromAddr MM.Msg.Text APPEND
  395.     END
  396.     ELSE 
  397.     DO
  398.         CALL LeaveBlank('UU')
  399.         MM_WriteStem 'T:MMD.'MM.Msg.FromAddr'.uu' MM.Msg.Text APPEND
  400.     END
  401. END
  402.  
  403. exit
  404.  
  405. RETURN
  406.  
  407. /* --------------------------------------------------------------------- */
  408.  
  409. InvalidResumeFile: PROCEDURE EXPOSE MM.
  410.  
  411. a.1 = 'The previous saved file isn''t correct for this message.' MM.nl 'Should I delete it?'
  412. a.2 = '*_Yes|_No'
  413. a.3 = 'Error...'
  414.  
  415. h = Requester(a.3,a.1,a.2)
  416.  
  417. IF h = 1 THEN DO
  418.         IF MM.Arg = 'FS' THEN MM_DeleteFile 'T:MMD.'MM.Msg.FromAddr
  419.         ELSE MM_DeleteFile 'T:MMD.'MM.Msg.FromAddr'.uu'
  420. END
  421.  
  422. exit
  423.  
  424. /* --------------------------------------------------------------------- */
  425.  
  426. Encode: PROCEDURE EXPOSE MM.
  427.  
  428.   MM_GetCfgPaths MM.Path
  429.   MM.Type.0     = 'UUEncode (Single)'
  430.   MM.Type.1     = 'UUEncode (Multi)'
  431.   MM.Type.2     = 'FSCode   (Single)'
  432.   MM.Type.3     = 'FSCode   (Multi)'
  433.   MM.Type.Count = 4
  434.   MM_SingleSelReq MM.Type MM.ModeResp '"'MM.PrgName'"' STR
  435.   IF MM.ModeResp.Count = 0 THEN EXIT
  436.   MM.FileName = MM.OutPath
  437.   MM_FileReq 'MM.FileName'
  438.  
  439.   SELECT
  440.       WHEN MM.ModeResp.0 = MM.Type.0 THEN Encode2(UU)
  441.       WHEN MM.ModeResp.0 = MM.Type.1 THEN Encode2(UM)
  442.       WHEN MM.ModeResp.0 = MM.Type.2 THEN Encode2(FS)
  443.       WHEN MM.ModeResp.0 = MM.Type.3 THEN Encode2(FM)
  444.     OTHERWISE exit
  445.   END
  446.  
  447.  
  448. /* ---------------------------------------------------------------------- */
  449.  
  450. Trasforma: PROCEDURE EXPOSE MM.
  451.  
  452. PARSE ARG String
  453.  
  454. IF INDEX(String,'%')=0 THEN RETURN String
  455.  
  456. String = Replace(String,MM.TempFile, '%s')
  457.  
  458. RETURN String
  459.  
  460. /* --------------------------------------------------------------------- */
  461.  
  462. TrasformaFS: PROCEDURE EXPOSE MM.
  463.  
  464. PARSE ARG String
  465.  
  466. IF INDEX(String,'%')=0 THEN RETURN String
  467.  
  468. String = Replace(String,MM.TempFile'1', '%s')
  469.  
  470. RETURN String
  471.  
  472. /* --------------------------------------------------------------------- */
  473.  
  474. Requester: PROCEDURE EXPOSE MM.
  475.  
  476. PARSE ARG Titolo, Testo, GadGets
  477. MM_Requester '"'Titolo'"' 'Testo' 'GadGets'
  478.  
  479. RETURN rc
  480.  
  481. /* --------------------------------------------------------------------- */
  482.  
  483. CheckPart: PROCEDURE EXPOSE MM.
  484.  
  485. b = 1
  486.  
  487. DO cnt = 1 FOR MM.Tot
  488.     IF ~Exists('T:MFS.'MM.Name||cnt) THEN 
  489.     DO
  490.  
  491.         MM.No.b = 'Part 'cnt' of 'MM.Tot         
  492.         b = b + 1
  493.     END
  494. END
  495.  
  496. MM.No.Count = b
  497.  
  498. IF (b-1) > 0 THEN DO
  499.         j = Requester('Error!','I haven''t found '||MM.No.Count-1||' part(s) of the file.','_Ok|_Delete temp files|*_Show the missings parts') 
  500.  
  501.         SELECT
  502.             WHEN j = 1 THEN exit
  503.             WHEN j = 2 THEN ADDRESS COMMAND 'C:Delete >NIL: T:MFS.'MM.Name'#?'
  504.             WHEN j = 0 THEN CALL ShowParts()
  505.             OTHERWISE exit
  506.         END
  507. END
  508. ELSE 
  509. DO
  510.     ADDRESS COMMAND MM.FsCode 'T:MFS.'MM.Name MM.OutPath||MM.Name ' MULTI'
  511.  
  512.     MM.fl = MM.OutPath||MM.Name
  513.  
  514.  
  515.     IF Exists(MM.fl) THEN
  516.     DO 
  517.         CALL Requester('Yeah!','File completed & extracted:'MM.nl||MM.fl,'Ok')
  518.         a = 1
  519.     END
  520.     ELSE
  521.     DO
  522.         a = Requester('Oh Nooo!','Error on file:'MM.fl||MM.nl'Should I delete it?','*_Yes|_No')
  523.     END
  524.  
  525.     IF a = 1 THEN 
  526.     ADDRESS COMMAND 'C:Delete >NIL: T:MFS.'MM.Name'#?'
  527. END
  528. RETURN
  529.  
  530. /* --------------------------------------------------------------------- */
  531.  
  532. ShowParts: PROCEDURE EXPOSE MM.
  533.  
  534. MM.No.0 = ''
  535.  
  536. stringa = MM.Name'      'MM.nl
  537.  
  538. DO h = 0 FOR MM.No.Count
  539.     stringa = stringa||MM.No.h||MM.nl
  540. END
  541.  
  542. Requester('Missings parts..',stringa,'Ok')
  543.  
  544. exit
  545.  
  546. /* --------------------------------------------------------------------- */
  547.  
  548. Encode2: PROCEDURE EXPOSE MM.
  549.  
  550. PARSE ARG MM.Coder
  551.  
  552. say MM.Coder
  553.  
  554. CALL SetOrigins()
  555.  
  556.     SELECT
  557.         WHEN MM.Coder = 'FS' THEN
  558.         DO
  559.  
  560.             CommandString = MM.FSCode ' ' MM.FileName ' ' MM.TempFile ' E'
  561.             ADDRESS COMMAND CommandString
  562.             CALL WriteMsg('FS')
  563.         END
  564.         WHEN MM.Coder = 'UU' THEN
  565.         DO
  566.             CommandString = MM.UUXT ' a ' MM.TempFile ' ' MM.FileName
  567.             ADDRESS COMMAND CommandString
  568.             CALL WriteMsg('UU')
  569.         END
  570.         WHEN MM.Coder = 'FM' THEN
  571.         DO
  572.  
  573.             CALL AskLines()
  574.  
  575.             CommandString = MM.FSCode ' ' MM.FileName ' ' MM.TempFile ' ENCODE MULTI LINES 'MM.Dim
  576.  
  577.             ADDRESS COMMAND CommandString
  578.  
  579.             CommandString = 'LIST ' MM.TempFile'[0-9]#? LFORMAT %p%n >'MM.TempList
  580.         
  581.                 IF Exists(MM.TempFile) THEN
  582.                 DO
  583.                     IF MM.Coder = 'FM' THEN 
  584.                         CALL Encode2('FS') 
  585.                     ELSE 
  586.                         CALL Encode2('UU') 
  587.                 END
  588.  
  589.             ADDRESS COMMAND CommandString
  590.  
  591.             MM_ReadStem MM.TempList MM.List
  592.  
  593.             CALL WriteSplittedFSCodedMsg()
  594.         END
  595.         WHEN MM.Coder = 'UM' THEN
  596.         DO
  597.  
  598.             CALL AskLines()
  599.  
  600.             CommandString = MM.UUXT ' a ' MM.TempFile ' ' MM.FileName
  601.  
  602.             ADDRESS COMMAND CommandString
  603.  
  604.             MM_ReadStem MM.TempFile MM.List
  605.  
  606.             MM.Sez = MM.List.Count / MM.Dim
  607.  
  608.             CALL WriteSplittedUUCodedMsg()
  609.         END
  610.     END
  611.  
  612.  
  613.  
  614.  
  615. /* --------------------------------------------------------------------- */
  616.  
  617. WriteMsg: PROCEDURE EXPOSE MM.
  618.  
  619.     PARSE ARG Coder
  620.  
  621.     MM_GetSysop 'MM.Sysop'
  622.  
  623.     MM_ReadMsg MM.Area MM.MsgNum MM.Reply
  624.  
  625.       MM.Editor = Trasforma(MM.Path.Editor)
  626.  
  627.     Messaggio.From   = MM.Sysop
  628.     Messaggio.To     = MM.Reply.From
  629.     Messaggio.ToAddr = MM.Reply.FromAddr
  630.     Messaggio.Subj   = MM.Reply.Subj
  631.     Messaggio.File   = MM.TempFile
  632.     Messaggio.Tear   = MM.PrgName
  633.  
  634.     IF Coder = 'FS' THEN
  635.         Messaggio.Origin = 'Decode command: FsCode <FileName>'
  636.     ELSE
  637.         Messaggio.Origin = 'Decode command: UUxt x <FileName>'
  638.  
  639.     MM_StringReq 'TO:' 'MM.Msg.From'
  640.     IF Rc = 0 THEN DO
  641.       IF MM.Msg.From ~= Messaggio.To THEN DO
  642.         Messaggio.To   = MM.Msg.From
  643.         Messaggio.Subj = 'Message Generated by MM_MultiCode'
  644.         MM_GetAreaInfo MM.Area Area
  645.         IF Area.Type = 'MAIL' THEN DO
  646.           MM_StringReq 'Address:' 'MM.Address'
  647.           Messaggio.ToAddr = MM.Address
  648.         END
  649.       END
  650.  
  651.       a = Requester('Edit?','Would you edit the message?','*_Yes|_No')
  652.       IF a = 1 THEN ADDRESS COMMAND MM.Editor 
  653.  
  654.       MM_WriteMsg MM.Area Messaggio
  655.       MM_DeleteFile MM.TempFile 
  656.     END
  657.   EXIT
  658.  
  659. /* --------------------------------------------------------------------- */
  660.  
  661. AskLines: PROCEDURE EXPOSE MM.
  662.  
  663.     MM.Dim = '100'
  664.  
  665.     MM_StringReq '"Insert the number of lines (100 = ~8 Kbytes)"' 'MM.Dim'
  666.  
  667.     IF Rc ~= 0 THEN exit
  668.  
  669.     dt = DATATYPE(MM.Dim)
  670.  
  671.     IF dt ~= 'NUM' THEN
  672.     DO
  673.         CALL Requester('Warning!','Only numeric values are accepted','Ok')
  674.  
  675.         CALL AskLines()
  676.     END
  677.  
  678. RETURN
  679.  
  680. /* --------------------------------------------------------------------- */
  681.  
  682. WriteSplittedFSCodedMsg: PROCEDURE EXPOSE MM.
  683.  
  684.     DROP Reply.
  685.  
  686.     MM_GetSysop 'MM.Sysop'
  687.  
  688.     MM_ReadMsg MM.Area MM.MsgNum MM.Reply
  689.  
  690.     MM.Editor = TrasformaFS(MM.Path.Editor)
  691.  
  692.     Messaggio.From   = MM.Sysop
  693.     Messaggio.To     = MM.Reply.From
  694.     Messaggio.ToAddr = MM.Reply.FromAddr
  695.     Messaggio.Tear   = MM.PrgName
  696.  
  697.     MM_StringReq 'TO:' 'MM.Reply.From'
  698.     IF Rc = 0 THEN DO
  699.       IF MM.Reply.From ~= Messaggio.To THEN DO
  700.         Messaggio.To   = MM.Msg.From
  701.         MM_GetAreaInfo MM.Area Area
  702.         IF Area.Type = 'MAIL' THEN DO
  703.           MM_StringReq 'Address:' 'MM.Address'
  704.           Messaggio.ToAddr = MM.Address
  705.         END
  706.       END
  707.     END
  708.     ELSE
  709.     DO
  710.         MM_DeleteFile MM.TempList
  711.         ADDRESS COMMAND MM.Delete ' ' MM.TempFile'#? >NIL:'
  712.         EXIT    
  713.     END
  714.  
  715.     a = Requester('Edit?','Would you edit the message?','*_Yes|_No')
  716.     IF a = 1 THEN ADDRESS COMMAND MM.Editor 
  717.  
  718.  
  719.     DO i = 0 FOR MM.List.Count
  720.         a = i + 1
  721.         Messaggio.Subj   = 'Multi FsCoded Message ['a'/'MM.List.Count']'
  722.         Messaggio.File   = MM.TempFile||a
  723.         
  724.     SELECT
  725.         WHEN a = 1 THEN Messaggio.Origin     = MM.Origin.UU
  726.         OTHERWISE 
  727.         DO
  728.             IF a > MM.Origin.Limit THEN Messaggio.Origin = MM.Origin.Final
  729.             ELSE Messaggio.Origin = MM.Origin.a
  730.         END
  731.     END
  732.  
  733.     
  734.         MM_WriteMsg MM.Area Messaggio
  735.     END
  736.  
  737.     MM_DeleteFile MM.TempList
  738.     ADDRESS COMMAND MM.Delete ' ' MM.TempFile'#? >NIL:'
  739. EXIT
  740.  
  741. /* --------------------------------------------------------------------- */
  742.  
  743. Replace: PROCEDURE
  744.  
  745. PARSE ARG Data, New, Old
  746.  
  747. DO WHILE INDEX(Data, Old) ~= 0
  748.   INTERPRET "PARSE VAR Data l '"Old"' r"
  749.   Data = l || New || r
  750. END
  751.  
  752. RETURN Data
  753.  
  754. /* ---------------------------------------------------------------------- */
  755.  
  756. WriteSplittedUUCodedMsg: PROCEDURE EXPOSE MM.
  757.  
  758.     DROP Reply.
  759.  
  760.     MM_GetSysop 'MM.Sysop'
  761.  
  762.     MM_ReadMsg MM.Area MM.MsgNum MM.Reply
  763.  
  764.     MM.Editor = TrasformaFS(MM.Path.Editor)
  765.     Messaggio.From   = MM.Sysop
  766.     Messaggio.To     = MM.Reply.From
  767.     Messaggio.ToAddr = MM.Reply.FromAddr
  768.     Messaggio.Tear   = MM.PrgName
  769.  
  770.     MM_StringReq 'TO:' 'MM.Reply.From'
  771.     IF Rc = 0 THEN DO
  772.       IF MM.Reply.From ~= Messaggio.To THEN DO
  773.         Messaggio.To   = MM.Msg.From
  774.         MM_GetAreaInfo MM.Area Area
  775.         IF Area.Type = 'MAIL' THEN DO
  776.           MM_StringReq 'Address:' 'MM.Address'
  777.           Messaggio.ToAddr = MM.Address
  778.         END
  779.       END
  780.     END
  781.     ELSE
  782.     DO
  783.         MM_DeleteFile MM.TempFile
  784.         EXIT    
  785.     END
  786.  
  787.     CALL WriteSections()
  788.  
  789.     a = Requester('Edit?','Would you edit the message?','*_Yes|_No')
  790.     IF a = 1 THEN ADDRESS COMMAND MM.Editor 
  791.  
  792.  
  793.     DO i = 0 FOR MM.Numero
  794.         a = i + 1
  795.         Messaggio.Subj   = 'Multi UUCoded Message ['a'/'MM.Numero']'
  796.         Messaggio.File   = MM.TempFile||a
  797.  
  798.     SELECT
  799.         WHEN i = 1 THEN Messaggio.Origin     = MM.Origin.FS
  800.         OTHERWISE 
  801.         DO
  802.             IF i > MM.Origin.Limit THEN Messaggio.Origin = MM.Origin.Final
  803.             ELSE Messaggio.Origin = MM.Origin.i
  804.         END
  805.     END
  806.         MM_WriteMsg MM.Area Messaggio
  807.     END
  808.     MM_DeleteFile MM.TempFile
  809.     ADDRESS COMMAND MM.Delete ' ' MM.TempFile'#? >NIL:'
  810. EXIT
  811.  
  812. /* --------------------------------------------------------------------- */
  813.  
  814. WriteSections: PROCEDURE EXPOSE MM.
  815.  
  816. f = POS('.',MM.Sez)
  817.  
  818. IF f ~= 0 THEN
  819. DO
  820.     MM.Numero = SUBSTR(MM.Sez,1,f)
  821.     MM.Numero = MM.Numero + 1
  822. END
  823.  
  824.  
  825. MM.Start = 0 
  826. MM.End = MM.Dim-1
  827.  
  828. DO i = 1 FOR MM.Numero
  829.  
  830.     IF i = MM.Numero-1 THEN 
  831.     DO 
  832.         resto = MM.List.Count-(MM.Dim*i)
  833.  
  834.         IF resto <= 4 THEN
  835.         DO
  836.             MM.End = MM.List.Count
  837.             MM.Numero = MM.Numero-1
  838.         END
  839.     END
  840.  
  841.     CALL CopyStem()
  842.  
  843.     MM_WriteStem MM.TempFile||i MM.Wrt
  844.  
  845.     MM.Start = MM.Start+MM.Dim
  846.     MM.End = MM.Start+(MM.Dim-1)
  847. END
  848.  
  849. RETURN
  850.  
  851. /* --------------------------------------------------------------------- */
  852.  
  853. CopyStem: PROCEDURE EXPOSE MM.
  854.  
  855. DROP MM.Wrt
  856.  
  857. MM.Wrt.Count = 0
  858.  
  859. MM_AddToStem MM.Wrt 'var'
  860.  
  861. DO i = MM.Start TO MM.End BY 1
  862.  
  863.     var = MM.List.i
  864.  
  865.     IF i < MM.List.Count THEN
  866.         MM_AddToStem MM.Wrt 'var'
  867.     ELSE
  868.         RETURN
  869. END
  870.  
  871.  
  872. RETURN
  873.  
  874. /* --------------------------------------------------------------------- */
  875.  
  876. SetOrigins: PROCEDURE EXPOSE MM.
  877.  
  878. MM.Origin.0     = 'Decode command: Rejoin by hand and....'
  879. MM.Origin.2     = '..but.. if you use Mail Manager..'
  880. MM.Origin.3     = '..you can use MM_MultiCode to decode...'
  881. MM.Origin.4     = '.. this file ...'
  882. MM.Origin.5     = '...Mail Manager is by Pino Aliberti..'   
  883. MM.Origin.6     = '..MM_MultiCode is by Alessandro Zummo'
  884. MM.Origin.7     = '..remember...........'
  885. MM.Origin.8     = '.. only Amiga makes it possible!!!!!!!'
  886. MM.Origin.9     = 'WOW!!! This is a very looooong file!'
  887. MM.Origin.10     = '..   MM_MultiCode.. simply the best'
  888. MM.Origin.11    = ' Moderator! This file is too long!'
  889. MM.Origin.12     = ' Moderator, please send me a FC '
  890. MM.Origin.13     = 'Gocce di Luna - FreakNet World Center'
  891. MM.Origin.14     = ' PGP is allowed on FreakNet!'
  892. MM.Origin.15     = '... to be continued .....'
  893. MM.Origin.Final = '...............................'
  894.  
  895. MM.Origin.UU     = ' ... do: UUXT x <FileName>'
  896. MM.Origin.FS    = ' ... do: FsCode <FileName> MULTI'
  897. MM.Origin.Limit = 15
  898.  
  899. /* --------------------------------------------------------------------- */
  900. /* --------------------------------------------------------------------- */
  901. /* --------------------------------------------------------------------- */
  902. /* --------------------------------------------------------------------- */
  903. /* --------------------------------------------------------------------- */
  904. /* --------------------------------------------------------------------- */
  905. /* --------------------------------------------------------------------- */
  906. /* --------------------------------------------------------------------- */
  907. /* --------------------------------------------------------------------- */
  908. /* --------------------------------------------------------------------- */
  909. /* --------------------------------------------------------------------- */
  910. /* --------------------------------------------------------------------- */
  911. /* --------------------------------------------------------------------- */
  912. /* --------------------------------------------------------------------- */
  913. /* --------------------------------------------------------------------- */
  914.