project BLF > class Mail > method ReadHandler

Description

This Procedure handles the return messages form the server


Internal usage


unused


program code (program1/mail.p)

do while true:

    /* pause for just a few milliseconds */
    vgt1 = etime.
    do while true:
        vgt2 = etime.
        if (vgt2 - vgt1) > 50 then leave.
    end.

    assign vilength = vhSocket:GET-BYTES-AVAILABLE()
           vlResponded = yes.
    
    IF vilength > 0 
    THEN DO:
        set-size(vmBuffer) = 0.
        SET-SIZE(vmBuffer) = vilength + 1.
        vhSocket:READ(vmBuffer, 1, vilength, 1).
        vcmessage = vcMessage + GET-STRING(vmBuffer,1).
        vleod = (get-byte(vmBuffer,viLength - 1) = 13 and
                 get-byte(vmBuffer,viLength    ) = 10).
        SET-SIZE(vmBuffer) = 0.

        /* debugging */
        publish "Logging.BusinessCode"
               ("packet in : ":U + vcmessage + chr(10) + "Step : ":U + string(viStep), "").
    end.
    
    virepeats = virepeats + 1.
    if vleod or virepeats > 100 then leave.
end.

if vcMessage <> ""
then do:        
    do while true:
        assign vib = vib + 1
               vcA = substring(vcmessage,vib,1,"CHARACTER":U).
        if  vcA >= "0":U
        and vcA <= "9":U
        then assign vcMessageNR = vcMessageNR + vcA.
        else leave.
    end.
    assign vimessagenumber = INTEGER(vcmessageNR).
    
    CASE viStep:
        WHEN 1 THEN IF vimessagenumber = 220 
                    THEN do:
                        <M-10 run SendHandler (input  'HELO ':U + substring(vcFrom,index(vcFrom,'@':U) + 1,-1,'CHARACTER':U) (icString), 
                       input  2 (iiNewState), 
                       output viWriteReturn (oiReturnStatus)) in Mail>
                    end.
                    ELSE viStep = -1.
        WHEN 2 THEN IF vimessagenumber = 250 
                    THEN do:
                        <M-11 run SendHandler (input  'MAIL FROM:<':U + vcFrom + chr(62) (icString), 
                       input  3 (iiNewState), 
                       output viWriteReturn (oiReturnStatus)) in Mail>
                    end.
                    ELSE viStep = -1.
        WHEN 3 THEN IF vimessagenumber = 250 
                    THEN do:
                        assign viRecipients = viRecipients + 1.
                        <M-12 run SendHandler (input  'RCPT TO:<':U + entry(viRecipients,vcRecipientsPerDomain,'|':u) + chr(62) (icString), 
                       input  (if num-entries(vcRecipientsPerDomain,'|':u) <= viRecipients then 4 else 3) (iiNewState), 
                       output viWriteReturn (oiReturnStatus)) in Mail>
                    end.
                    ELSE viStep = -1.
        WHEN 4 THEN IF vimessagenumber = 250 
                    THEN do:
                        <M-13 run SendHandler (Input  'DATA':U (icString), 
                       Input  5 (iiNewState), 
                       Output viWriteReturn (oiReturnStatus)) in Mail>
                    end.
                    ELSE viStep = -1.
        WHEN 5 THEN IF vimessagenumber = 354 
                    THEN do:
                        <M-26 run InitializeMessage (output viFcReturnSuper (oiReturnStatus)) in Mail>
                        ASSIGN viMessageID = viMessageID + 1
                               vcString = 'Message-ID: <':U + string(viFcCurrentInstanceId)
                                                            + string(viMessageID)
                                                            + (if index(vcFrom,'@':U) = 0
                                                               then ''
                                                               else substring(vcFrom,index(vcFrom,'@':U),-1,'CHARACTER':U))
                                                            + '>':U + CHR(13) + CHR(10) +
                                          'From: ':U + vcFrom + CHR(13) + CHR(10) + 
                                          'To: ':U + replace(vcTo,'|':u,'; ':u) + CHR(13) + CHR(10) +
                                          'Cc: ':U + replace(vcCc,'|':u,'; ':u) + CHR(13) + CHR(10) +
                                          'Date: ':U + vcDate + CHR(13) + CHR(10) +
                                          'Subject: ':U + vcSubject + CHR(13) + CHR(10) +
                                          'Mime-Version: 1.0':U + CHR(13) + CHR(10) +
                                          'X-Mailer: "Mail Component" - by CB v1.X':U + CHR(13) + CHR(10) +
                                          'Content-Type: multipart/mixed;':U +
                                          ' boundary="----=_CB.PART"':U + CHR(13) + CHR(10) +
                                          chr(13) + CHR(10) +
                                          '------=_CB.PART':U + chr(13) + CHR(10) +
                                          'Content-Type: text/plain':U +
                                          '; charset="' + session:cpinternal + '"':U + chr(13) + CHR(10) + 
                                          'Content-Transfer-Encoding: 8bit':U + chr(13) + CHR(10) +
                                          chr(13) + CHR(10) +
                                          vcBody.
                        <M-27 run AddToMessage (input  vcString (icString), 
                        input  vmEmpty (imPart), 
                        output viFcReturnSuper (oiReturnStatus)) in Mail>

                        DO viCnt = 1 TO NUM-ENTRIES (vcAttachments) :
                            
                            ASSIGN vcAttach = replace(entry(viCnt,vcAttachments),"~\":U,"/":U)
                                   vcAttach = ENTRY(NUM-ENTRIES(vcAttach,"/":U),vcAttach,"/":U).
                            ASSIGN vcString = CHR(13) + CHR(10) + "------=_CB.PART":U + chr(13) + CHR(10) +
                                              "Content-Type: application/octet-stream; ":U +
                                              "name=":U + vcAttach + chr(13) + CHR(10) +
                                              "Content-Transfer-Encoding: base64":U + chr(13) + CHR(10) +
                                              "Content-ID: ":U + vcAttach + chr(13) + CHR(10) +
                                              "Content-Disposition: attachment; ":U + 
                                              "filename=":U + vcAttach + CHR(13) + CHR(10) + CHR(13) + CHR(10).
                            <M-28 run AddToMessage (input  vcString (icString), 
                                                    input  vmEmpty (imPart), 
                                                    output viFcReturnSuper (oiReturnStatus)) in Mail>
                            
                            <M-29 run FileToMemptr (input  entry(viCnt,vcAttachments) (icFile), 
                                                    input  true (ilEncode), 
                                                    output vmAttach (omFile), 
                                                    output viWriteReturn (oiReturnStatus)) in Mail>
                            
                            <M-30 run AddToMessage (input  '':U (icString), 
                                                    input  vmAttach (imPart), 
                                                    output viWriteReturn (oiReturnStatus)) in Mail>
                            SET-SIZE(vmAttach) = 0.
                        END.
                        do viCnt = 1 to 50 :
                            if get-size(vmAttachmentStore[viCnt]) <> 0
                            then do :
                                ASSIGN vcAttach = replace(entry(viCnt,vcAttachmentStore[viCnt]),"~\":U,"/":U)
                                       vcAttach = ENTRY(NUM-ENTRIES(vcAttach,"/":U),vcAttach,"/":U).
                                ASSIGN vcString = CHR(13) + CHR(10) + "------=_CB.PART":U + chr(13) + CHR(10) +
                                                  "Content-Type: application/octet-stream; ":U +
                                                  "name=":U + vcAttach + chr(13) + CHR(10) +
                                                  "Content-Transfer-Encoding: base64":U + chr(13) + CHR(10) +
                                                  "Content-ID: ":U + vcAttach + chr(13) + CHR(10) +
                                                  "Content-Disposition: attachment; ":U + 
                                                  "filename=":U + vcAttach + CHR(13) + CHR(10) + CHR(13) + CHR(10).
                                <M-36 run AddToMessage (input  vcString (icString), 
                                                        input  vmEmpty (imPart), 
                                                        output viFcReturnSuper (oiReturnStatus)) in Mail>

                                <M-34 run FileEncode (input  vmAttachmentStore[viCnt] (imIn), 
                                                      input  true (ilLineBreaks), 
                                                      output vmAttach (omOut), 
                                                      output viFcReturnSuper (oiReturnStatus)) in Mail>
                                <M-35 run AddToMessage (input  '':U (icString), 
                                                        input  vmAttach (imPart), 
                                                        output viWriteReturn (oiReturnStatus)) in Mail>
                                SET-SIZE(vmAttach) = 0.
                                set-size(vmAttachmentStore[viCnt]) = 0.
                                assign vcAttachmentStore[viCnt] = "".
                            end.
                        end.

                        ASSIGN vcString = CHR(13) + CHR(10) + "------=_CB.PART--":U + CHR(13) + CHR(10).
                        <M-31 run AddToMessage (input  vcString (icString), 
                                                input  vmEmpty (imPart), 
                                                output viFcReturnSuper (oiReturnStatus)) in Mail>
                        ASSIGN vcString = CHR(13) + CHR(10) + ".":U + CHR(13) + CHR(10).
                        <M-32 run AddToMessage (input  vcString (icString), 
                                                input  vmEmpty (imPart), 
                                                output viWriteReturn (oiReturnStatus)) in Mail>

                        <M-33 run SendMessage (output viWriteReturn (oiReturnStatus)) in Mail>
                    end.    
        WHEN 6 THEN IF vimessagenumber = 250 
                    THEN do:
                        <M-22 run SendHandler (Input  'quit':U (icString), 
                       Input  7 (iiNewState), 
                       Output viWriteReturn (oiReturnStatus)) in Mail>
                    end.
                    ELSE viStep = -1.
        when 7 then do:
                <M-23 run Disconnect () in Mail>
              end.
    END CASE.
END.

IF vistep = 7
THEN DO:
    <M-25 run Disconnect () in Mail>
END.
else if viStep = -1
then do:
    <M-38 run SetMessage
          (input  #T-39'Error message received from mail server: $1':100(15)t-39# (icMessage), 
           input  vcMessage (icArguments), 
           input  '' (icFieldName), 
           input  '' (icFieldValue), 
           input  'D':U (icType), 
           input  3 (iiSeverity), 
           input  '' (icRowid), 
           input  'BLF-341':U (icFcMsgNumber), 
           input  '' (icFcExplanation), 
           input  '' (icFcIdentification), 
           input  '' (icFcContext), 
           output viFcReturnSuper (oiReturnStatus)) in Mail>
end.
else if viWriteReturn <> 0
then assign viStep = -1.