mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Rename samples subdirectories
This commit is contained in:
574
samples/OpenEdge ABL/Email.cls
Normal file
574
samples/OpenEdge ABL/Email.cls
Normal file
@@ -0,0 +1,574 @@
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
File : Email
|
||||
Purpose : Abstraction of an Email message
|
||||
Description : Holds information needed for an email message - senders,
|
||||
recipients, subject, a message body, attachment files, and
|
||||
other extra information such as importance, priority,
|
||||
sensitivity, custom reply-to addresses, delivery receipts,
|
||||
read receipts, custom sent date, reply-by date, and expire date.
|
||||
Author(s) : Abe Voelker
|
||||
Created : Sat Jul 17 16:27:05 CDT 2010
|
||||
----------------------------------------------------------------------*/
|
||||
|
||||
USING Progress.Lang.*.
|
||||
|
||||
|
||||
CLASS email.Email USE-WIDGET-POOL:
|
||||
|
||||
&SCOPED-DEFINE QUOTES """"
|
||||
&SCOPED-DEFINE CR CHR(13)
|
||||
&SCOPED-DEFINE LF CHR(10)
|
||||
&SCOPED-DEFINE DEFAULT_MIME_BOUNDARY "!@#$%^&*+-._MIME_BOUNDARY_.-+*&^%$#@!"
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
Purpose:
|
||||
Notes:
|
||||
------------------------------------------------------------------------------*/
|
||||
|
||||
DEFINE PRIVATE VARIABLE objSendEmailAlgorithm AS email.SendEmailAlgorithm NO-UNDO.
|
||||
|
||||
DEFINE PRIVATE TEMP-TABLE ttSenders NO-UNDO
|
||||
FIELD cEmailAddress AS CHARACTER
|
||||
FIELD cRealName AS CHARACTER INITIAL ?
|
||||
INDEX IXPK_ttSenders cEmailAddress.
|
||||
|
||||
DEFINE PRIVATE TEMP-TABLE ttToRecipients NO-UNDO
|
||||
FIELD cEmailAddress AS CHARACTER
|
||||
FIELD cRealName AS CHARACTER INITIAL ?
|
||||
INDEX IXPK_ttToRecipients cEmailAddress.
|
||||
|
||||
DEFINE PRIVATE TEMP-TABLE ttCCRecipients NO-UNDO
|
||||
FIELD cEmailAddress AS CHARACTER
|
||||
FIELD cRealName AS CHARACTER INITIAL ?
|
||||
INDEX IXPK_ttCCRecipients cEmailAddress.
|
||||
|
||||
DEFINE PRIVATE TEMP-TABLE ttBCCRecipients NO-UNDO
|
||||
FIELD cEmailAddress AS CHARACTER
|
||||
FIELD cRealName AS CHARACTER INITIAL ?
|
||||
INDEX IXPK_ttBCCRecipients cEmailAddress.
|
||||
|
||||
DEFINE PRIVATE TEMP-TABLE ttReplyToRecipients NO-UNDO
|
||||
FIELD cEmailAddress AS CHARACTER
|
||||
FIELD cRealName AS CHARACTER INITIAL ?
|
||||
INDEX IXPK_ttReplyToRecipients cEmailAddress.
|
||||
|
||||
DEFINE PRIVATE TEMP-TABLE ttReadReceiptRecipients NO-UNDO
|
||||
FIELD cEmailAddress AS CHARACTER
|
||||
FIELD cRealName AS CHARACTER INITIAL ?
|
||||
INDEX IXPK_ttReadReceiptRecipients cEmailAddress.
|
||||
|
||||
DEFINE PRIVATE TEMP-TABLE ttDeliveryReceiptRecipients NO-UNDO
|
||||
FIELD cEmailAddress AS CHARACTER
|
||||
FIELD cRealName AS CHARACTER INITIAL ?
|
||||
INDEX IXPK_ttDeliveryReceiptRecipients cEmailAddress.
|
||||
|
||||
DEFINE PRIVATE TEMP-TABLE ttAttachments NO-UNDO
|
||||
FIELD cFileName AS CHARACTER
|
||||
FIELD lcData AS Object /* Longchar object */
|
||||
FIELD lBase64Encode AS LOGICAL.
|
||||
|
||||
DEFINE PRIVATE VARIABLE cMimeBoundary AS CHARACTER NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE lcBody AS LONGCHAR NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE lBodyIsBase64 AS LOGICAL NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE cSubject AS CHARACTER NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE mptrAttachments AS MEMPTR NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE cImportance AS CHARACTER NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE cSensitivity AS CHARACTER NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE cPriority AS CHARACTER NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE dttmtzSentDate AS DATETIME-TZ INITIAL ? NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE dttmtzReplyByDate AS DATETIME-TZ INITIAL ? NO-UNDO.
|
||||
DEFINE PRIVATE VARIABLE dttmtzExpireDate AS DATETIME-TZ INITIAL ? NO-UNDO.
|
||||
|
||||
DEFINE PRIVATE VARIABLE cNewLine AS CHARACTER NO-UNDO.
|
||||
|
||||
/* Other email headers: */
|
||||
|
||||
CONSTRUCTOR PUBLIC Email (INPUT ipobjSendEmailAlgorithm AS email.SendEmailAlgorithm):
|
||||
SUPER ().
|
||||
ASSIGN objSendEmailAlgorithm = ipobjSendEmailAlgorithm
|
||||
cMimeBoundary = {&DEFAULT_MIME_BOUNDARY}
|
||||
lBodyIsBase64 = TRUE.
|
||||
IF (OPSYS BEGINS "WIN") THEN
|
||||
ASSIGN cNewLine = {&CR} + {&LF}.
|
||||
ELSE
|
||||
ASSIGN cNewLine = {&LF}.
|
||||
END CONSTRUCTOR.
|
||||
|
||||
DESTRUCTOR PUBLIC Email ():
|
||||
FOR EACH ttAttachments:
|
||||
IF VALID-OBJECT(ttAttachments.lcData) THEN
|
||||
DELETE OBJECT ttAttachments.lcData NO-ERROR.
|
||||
END. /* FOR EACH ttAttachments */
|
||||
END DESTRUCTOR.
|
||||
|
||||
/* Add a sender ("From:" address) to the email */
|
||||
METHOD PUBLIC VOID addSender(INPUT ipcEmailAddress AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttSenders
|
||||
WHERE ttSenders.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttSenders.
|
||||
ASSIGN ttSenders.cEmailAddress = ipcEmailAddress.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a sender ("From:" address) (with Real Name) to the email */
|
||||
METHOD PUBLIC VOID addSender(INPUT ipcEmailAddress AS CHARACTER,
|
||||
INPUT ipcRealName AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttSenders
|
||||
WHERE ttSenders.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttSenders.
|
||||
ASSIGN ttSenders.cEmailAddress = ipcEmailAddress
|
||||
ttSenders.cRealName = ipcRealName.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a "To:" recipient to the email */
|
||||
METHOD PUBLIC VOID addToRecipient(INPUT ipcEmailAddress AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttToRecipients
|
||||
WHERE ttToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttToRecipients.
|
||||
ASSIGN ttToRecipients.cEmailAddress = ipcEmailAddress.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a "To:" recipient (with Real Name) to the email */
|
||||
METHOD PUBLIC VOID addToRecipient(INPUT ipcEmailAddress AS CHARACTER,
|
||||
INPUT ipcRealName AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttToRecipients
|
||||
WHERE ttToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttToRecipients.
|
||||
ASSIGN ttToRecipients.cEmailAddress = ipcEmailAddress
|
||||
ttToRecipients.cRealName = ipcRealName.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a "CC:" recipient to the email */
|
||||
METHOD PUBLIC VOID addCCRecipient(INPUT ipcEmailAddress AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttCCRecipients
|
||||
WHERE ttCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttCCRecipients.
|
||||
ASSIGN ttCCRecipients.cEmailAddress = ipcEmailAddress.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a "CC:" recipient (with Real Name) to the email */
|
||||
METHOD PUBLIC VOID addCCRecipient(INPUT ipcEmailAddress AS CHARACTER,
|
||||
INPUT ipcRealName AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttCCRecipients
|
||||
WHERE ttCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttCCRecipients.
|
||||
ASSIGN ttCCRecipients.cEmailAddress = ipcEmailAddress
|
||||
ttToRecipients.cRealName = ipcRealName.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a "BCC:" recipient to the email */
|
||||
METHOD PUBLIC VOID addBCCRecipient(INPUT ipcEmailAddress AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttBCCRecipients
|
||||
WHERE ttBCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttBCCRecipients.
|
||||
ASSIGN ttBCCRecipients.cEmailAddress = ipcEmailAddress.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a "BCC:" recipient (with Real Name) to the email */
|
||||
METHOD PUBLIC VOID addBCCRecipient(INPUT ipcEmailAddress AS CHARACTER,
|
||||
INPUT ipcRealName AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttBCCRecipients
|
||||
WHERE ttBCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttBCCRecipients.
|
||||
ASSIGN ttBCCRecipients.cEmailAddress = ipcEmailAddress
|
||||
ttToRecipients.cRealName = ipcRealName.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a reply-to recipient to the email */
|
||||
METHOD PUBLIC VOID addReplyToRecipient(INPUT ipcEmailAddress AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttReplyToRecipients
|
||||
WHERE ttReplyToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttReplyToRecipients.
|
||||
ASSIGN ttReplyToRecipients.cEmailAddress = ipcEmailAddress.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a reply-to recipient (with Real Name) to the email */
|
||||
METHOD PUBLIC VOID addReplyToRecipient(INPUT ipcEmailAddress AS CHARACTER,
|
||||
INPUT ipcRealName AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttReplyToRecipients
|
||||
WHERE ttReplyToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttReplyToRecipients.
|
||||
ASSIGN ttReplyToRecipients.cEmailAddress = ipcEmailAddress
|
||||
ttReplyToRecipients.cRealName = ipcRealName.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a delivery receipt recipient to the email */
|
||||
METHOD PUBLIC VOID addDeliveryReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttDeliveryReceiptRecipients
|
||||
WHERE ttDeliveryReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttDeliveryReceiptRecipients.
|
||||
ASSIGN ttDeliveryReceiptRecipients.cEmailAddress = ipcEmailAddress.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a delivery receipt recipient (with Real Name) to the email */
|
||||
METHOD PUBLIC VOID addDeliveryReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER,
|
||||
INPUT ipcRealName AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttDeliveryReceiptRecipients
|
||||
WHERE ttDeliveryReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttDeliveryReceiptRecipients.
|
||||
ASSIGN ttDeliveryReceiptRecipients.cEmailAddress = ipcEmailAddress
|
||||
ttDeliveryReceiptRecipients.cRealName = ipcRealName.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a read receipt recipient to the email */
|
||||
METHOD PUBLIC VOID addReadReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttReadReceiptRecipients
|
||||
WHERE ttReadReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttReadReceiptRecipients.
|
||||
ASSIGN ttReadReceiptRecipients.cEmailAddress = ipcEmailAddress.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Add a read receipt recipient (with Real Name) to the email */
|
||||
METHOD PUBLIC VOID addReadReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER,
|
||||
INPUT ipcRealName AS CHARACTER):
|
||||
IF NOT CAN-FIND(FIRST ttReadReceiptRecipients
|
||||
WHERE ttReadReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
|
||||
CREATE ttReadReceiptRecipients.
|
||||
ASSIGN ttReadReceiptRecipients.cEmailAddress = ipcEmailAddress
|
||||
ttReadReceiptRecipients.cRealName = ipcRealName.
|
||||
END.
|
||||
END METHOD.
|
||||
|
||||
/* Set the subject of the email */
|
||||
METHOD PUBLIC VOID setSubject(INPUT ipcSubject AS CHARACTER):
|
||||
ASSIGN cSubject = ipcSubject.
|
||||
END METHOD.
|
||||
|
||||
/* Set the importance of the email. H = High, L = Low, anything else = Medium/None */
|
||||
METHOD PUBLIC VOID setImportance(INPUT ipcImportance AS CHARACTER):
|
||||
ASSIGN cImportance = ipcImportance.
|
||||
END METHOD.
|
||||
|
||||
/* Set the sensitivity of the email. */
|
||||
/* Possible values (from RFC 2156): "Personal", "Private", or "Company confidential" ("Company-confidential") */
|
||||
METHOD PUBLIC VOID setSensitivity(INPUT ipcSensitivity AS CHARACTER):
|
||||
ASSIGN cSensitivity = ipcSensitivity.
|
||||
END METHOD.
|
||||
|
||||
/* Set the priority of the email (to affect transmission speed and delivery) */
|
||||
/* Possible values (from RFC 2156): "normal", "urgent", or "non-urgent" */
|
||||
METHOD PUBLIC VOID setPriority(INPUT ipcPriority AS CHARACTER):
|
||||
ASSIGN cPriority = ipcPriority.
|
||||
END METHOD.
|
||||
|
||||
/* Set the date/time the email was sent */
|
||||
METHOD PUBLIC VOID setSentDate(INPUT ipdttmtzSentDate AS DATETIME-TZ):
|
||||
ASSIGN dttmtzSentDate = ipdttmtzSentDate.
|
||||
END METHOD.
|
||||
|
||||
/* Set the date/time recipient(s) should reply by */
|
||||
METHOD PUBLIC VOID setReplyByDate(INPUT ipdttmtzReplyByDate AS DATETIME-TZ):
|
||||
ASSIGN dttmtzReplyByDate = ipdttmtzReplyByDate.
|
||||
END METHOD.
|
||||
|
||||
/* Set the date/time the message expires */
|
||||
METHOD PUBLIC VOID setExpireDate(INPUT ipdttmtzExpireDate AS DATETIME-TZ):
|
||||
ASSIGN dttmtzExpireDate = ipdttmtzExpireDate.
|
||||
END METHOD.
|
||||
|
||||
/* If send email algorithm not set in constructor, you must set it using this method before the email can be sent */
|
||||
METHOD PUBLIC VOID setSendEmailAlgorithm(INPUT ipobjSendEmailAlgorithm AS email.SendEmailAlgorithm):
|
||||
ASSIGN objSendEmailAlgorithm = ipobjSendEmailAlgorithm.
|
||||
END METHOD.
|
||||
|
||||
METHOD PUBLIC VOID setBodyText(INPUT ipcBodyText AS CHARACTER):
|
||||
ASSIGN lcBody = ipcBodyText.
|
||||
END METHOD.
|
||||
|
||||
METHOD PUBLIC VOID setBodyText(INPUT iplcBodyText AS LONGCHAR):
|
||||
ASSIGN lcBody = iplcBodyText.
|
||||
END METHOD.
|
||||
|
||||
/* Set the body by reading in an external file */
|
||||
METHOD PUBLIC CHARACTER setBodyFile(INPUT ipcBodyFile AS CHARACTER):
|
||||
FILE-INFO:FILE-NAME = ipcBodyFile.
|
||||
IF FILE-INFO:FULL-PATHNAME EQ ? THEN
|
||||
RETURN "Cannot locate file '" + ipcBodyFile + "' in the filesystem!".
|
||||
IF INDEX(FILE-INFO:FILE-TYPE, "R") EQ 0 THEN
|
||||
RETURN "File '" + FILE-INFO:FULL-PATHNAME + "' exists but is not readable!".
|
||||
COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcBody NO-ERROR.
|
||||
IF ERROR-STATUS:ERROR THEN
|
||||
RETURN "Error copying from file: " + ERROR-STATUS:GET-MESSAGE(1).
|
||||
RETURN "". /* Success */
|
||||
END METHOD.
|
||||
|
||||
/* Body defaults to base64 encoding, but can be manually disabled */
|
||||
METHOD PUBLIC VOID setBodyEncoding(INPUT iplBase64Encode AS LOGICAL):
|
||||
ASSIGN lBodyIsBase64 = iplBase64Encode.
|
||||
END METHOD.
|
||||
|
||||
/* Add a non-encoded file attachment to the email */
|
||||
METHOD PUBLIC CHARACTER addTextAttachment(INPUT ipcFileName AS CHARACTER):
|
||||
DEFINE VARIABLE lcTemp AS LONGCHAR NO-UNDO.
|
||||
FILE-INFO:FILE-NAME = ipcFileName.
|
||||
IF FILE-INFO:FULL-PATHNAME EQ ? THEN
|
||||
RETURN "Cannot locate file '" + ipcFileName + "' in the filesystem!".
|
||||
IF INDEX(FILE-INFO:FILE-TYPE, "R") EQ 0 THEN
|
||||
RETURN "File '" + FILE-INFO:FULL-PATHNAME + "' exists but is not readable!".
|
||||
/* Load file into memory */
|
||||
COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcTemp NO-ERROR.
|
||||
IF ERROR-STATUS:ERROR THEN
|
||||
RETURN "Error copying from file: " + ERROR-STATUS:GET-MESSAGE(1).
|
||||
CREATE ttAttachments.
|
||||
ASSIGN ttAttachments.cFileName = ipcFileName
|
||||
ttAttachments.lcData = NEW email.LongcharWrapper(lcTemp)
|
||||
ttAttachments.lBase64Encode = FALSE.
|
||||
RETURN "". /* Success */
|
||||
END.
|
||||
|
||||
/* Add a file attachment to the email; it defaults to base-64 encoding */
|
||||
METHOD PUBLIC CHARACTER addAttachment(INPUT ipcFileName AS CHARACTER):
|
||||
DEFINE VARIABLE lcTemp AS LONGCHAR NO-UNDO.
|
||||
FILE-INFO:FILE-NAME = ipcFileName.
|
||||
IF FILE-INFO:FULL-PATHNAME EQ ? THEN
|
||||
RETURN "Cannot locate file '" + ipcFileName + "' in the filesystem!".
|
||||
IF INDEX(FILE-INFO:FILE-TYPE, "R") EQ 0 THEN
|
||||
RETURN "File '" + FILE-INFO:FULL-PATHNAME + "' exists but is not readable!".
|
||||
/* Load file into memory */
|
||||
COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcTemp NO-ERROR.
|
||||
IF ERROR-STATUS:ERROR THEN
|
||||
RETURN "Error copying from file: " + ERROR-STATUS:GET-MESSAGE(1).
|
||||
CREATE ttAttachments.
|
||||
ASSIGN ttAttachments.cFileName = ipcFileName
|
||||
ttAttachments.lcData = NEW email.LongcharWrapper(EmailClient.Util:ConvertDataToBase64(lcTemp))
|
||||
ttAttachments.lBase64Encode = TRUE.
|
||||
RETURN "". /* Success */
|
||||
END.
|
||||
|
||||
/* Override default MIME boundary */
|
||||
METHOD PUBLIC VOID setMimeBoundary(INPUT ipcMimeBoundary AS CHARACTER):
|
||||
ASSIGN cMimeBoundary = ipcMimeBoundary.
|
||||
END METHOD.
|
||||
|
||||
/* Return a concatenated list of To:, CC:, and BCC: recipients */
|
||||
METHOD PUBLIC CHARACTER getRecipients():
|
||||
DEFINE VARIABLE cRecipients AS CHARACTER NO-UNDO.
|
||||
|
||||
FOR EACH ttToRecipients
|
||||
BREAK BY ttToRecipients.cEmailAddress:
|
||||
ASSIGN cRecipients = cRecipients + ttToRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttToRecipients.cEmailAddress) THEN DO:
|
||||
ASSIGN cRecipients = cRecipients + ", ".
|
||||
END.
|
||||
END.
|
||||
FOR EACH ttCCRecipients
|
||||
BREAK BY ttCCRecipients.cEmailAddress:
|
||||
IF FIRST(ttCCRecipients.cEmailAddress) AND
|
||||
cRecipients NE "" THEN
|
||||
ASSIGN cRecipients = cRecipients + ", ".
|
||||
ASSIGN cRecipients = cRecipients + ttCCRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttCCRecipients.cEmailAddress) THEN
|
||||
ASSIGN cRecipients = cRecipients + ttCCRecipients.cEmailAddress.
|
||||
END.
|
||||
FOR EACH ttBCCRecipients
|
||||
BREAK BY ttBCCRecipients.cEmailAddress:
|
||||
IF FIRST(ttBCCRecipients.cEmailAddress) AND
|
||||
cRecipients NE "" THEN
|
||||
ASSIGN cRecipients = cRecipients + ", ".
|
||||
ASSIGN cRecipients = cRecipients + ttBCCRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttBCCRecipients.cEmailAddress) THEN
|
||||
ASSIGN cRecipients = cRecipients + ttBCCRecipients.cEmailAddress.
|
||||
END.
|
||||
RETURN cRecipients.
|
||||
END METHOD.
|
||||
|
||||
/* Dumps all email message headers to CHAR */
|
||||
METHOD PUBLIC CHARACTER getHeaders():
|
||||
DEFINE VARIABLE cReturnData AS CHARACTER NO-UNDO.
|
||||
|
||||
/* Write the "From:" header */
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "From:".
|
||||
FOR EACH ttSenders
|
||||
BREAK BY ttSenders.cEmailAddress:
|
||||
IF ttSenders.cRealName NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + ttSenders.cRealName + " <" + ttSenders.cEmailAddress + ">".
|
||||
ELSE
|
||||
ASSIGN cReturnData = cReturnData + ttSenders.cEmailAddress.
|
||||
IF NOT LAST(ttSenders.cEmailAddress) THEN
|
||||
ASSIGN cReturnData = cReturnData + ", ".
|
||||
END.
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "\n".
|
||||
/* Write the "To:" header */
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "To:".
|
||||
FOR EACH ttToRecipients
|
||||
BREAK BY ttToRecipients.cEmailAddress:
|
||||
IF ttToRecipients.cRealName NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + ttToRecipients.cRealName + " <" + ttToRecipients.cEmailAddress + ">".
|
||||
ELSE
|
||||
ASSIGN cReturnData = cReturnData + ttToRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttToRecipients.cEmailAddress) THEN
|
||||
ASSIGN cReturnData = cReturnData + ", ".
|
||||
END.
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "\n".
|
||||
/* Write the "Reply-To:" header */
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "Reply-To:".
|
||||
IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS THEN DO:
|
||||
/* Use manually-overridden reply-to addresses */
|
||||
FOR EACH ttReplyToRecipients
|
||||
BREAK BY ttReplyToRecipients.cEmailAddress:
|
||||
IF ttReplyToRecipients.cRealName NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + ttReplyToRecipients.cRealName + " <" + ttReplyToRecipients.cEmailAddress + ">".
|
||||
ELSE
|
||||
ASSIGN cReturnData = cReturnData + ttReplyToRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttReplyToRecipients.cEmailAddress) THEN
|
||||
ASSIGN cReturnData = cReturnData + ", ".
|
||||
END. /* FOR EACH ttReplyToRecipients ... */
|
||||
END. /* IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS */
|
||||
ELSE DO:
|
||||
/* Write reply-to using sender addresses if reply-to addresses not manually overriddden */
|
||||
FOR EACH ttSenders
|
||||
BREAK BY ttSenders.cEmailAddress:
|
||||
IF ttSenders.cRealName NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + ttSenders.cRealName + " <" + ttSenders.cEmailAddress + ">".
|
||||
ELSE
|
||||
ASSIGN cReturnData = cReturnData + ttSenders.cEmailAddress.
|
||||
IF NOT LAST(ttSenders.cEmailAddress) THEN
|
||||
ASSIGN cReturnData = cReturnData + ", ".
|
||||
END.
|
||||
END. /* ELSE / IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS */
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "\n".
|
||||
/* Write the "Cc:" header */
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "Cc:".
|
||||
FOR EACH ttCCRecipients
|
||||
BREAK BY ttCCRecipients.cEmailAddress:
|
||||
IF ttCCRecipients.cRealName NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + ttCCRecipients.cRealName + " <" + ttCCRecipients.cEmailAddress + ">".
|
||||
ELSE
|
||||
ASSIGN cReturnData = cReturnData + ttCCRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttCCRecipients.cEmailAddress) THEN
|
||||
ASSIGN cReturnData = cReturnData + ", ".
|
||||
END.
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "\n".
|
||||
/* Write the "Bcc:" header */
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "Bcc:".
|
||||
FOR EACH ttBCCRecipients
|
||||
BREAK BY ttBCCRecipients.cEmailAddress:
|
||||
IF ttBCCRecipients.cRealName NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + ttBCCRecipients.cRealName + " <" + ttBCCRecipients.cEmailAddress + ">".
|
||||
ELSE
|
||||
ASSIGN cReturnData = cReturnData + ttBCCRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttBCCRecipients.cEmailAddress) THEN
|
||||
ASSIGN cReturnData = cReturnData + ", ".
|
||||
END.
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "\n".
|
||||
/* If delivery recipients specified, write each recipient out */
|
||||
IF TEMP-TABLE ttDeliveryReceiptRecipients:HAS-RECORDS THEN DO:
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "Return-Receipt-To:".
|
||||
FOR EACH ttDeliveryReceiptRecipients
|
||||
BREAK BY ttDeliveryReceiptRecipients.cEmailAddress:
|
||||
IF ttDeliveryReceiptRecipients.cRealName NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + ttDeliveryReceiptRecipients.cRealName + " <" + ttDeliveryReceiptRecipients.cEmailAddress + ">".
|
||||
ELSE
|
||||
ASSIGN cReturnData = cReturnData + ttDeliveryReceiptRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttDeliveryReceiptRecipients.cEmailAddress) THEN
|
||||
ASSIGN cReturnData = cReturnData + ", ".
|
||||
END. /* FOR EACH ttDeliveryReceiptRecipients */
|
||||
ASSIGN cReturnData = cReturnData + {"ES}.
|
||||
END. /* IF TEMP-TABLE ttDeliveryReceiptRecipients:HAS-RECORDS */
|
||||
/* If read recipients specified, write each recipient out */
|
||||
IF TEMP-TABLE ttReadReceiptRecipients:HAS-RECORDS THEN DO:
|
||||
ASSIGN cReturnData = cReturnData + {"ES} + "Disposition-Notification-To:".
|
||||
FOR EACH ttReadReceiptRecipients
|
||||
BREAK BY ttReadReceiptRecipients.cEmailAddress:
|
||||
IF ttReadReceiptRecipients.cRealName NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + ttReadReceiptRecipients.cRealName + " <" + ttReadReceiptRecipients.cEmailAddress + ">".
|
||||
ELSE
|
||||
ASSIGN cReturnData = cReturnData + ttReadReceiptRecipients.cEmailAddress.
|
||||
IF NOT LAST(ttReadReceiptRecipients.cEmailAddress) THEN
|
||||
ASSIGN cReturnData = cReturnData + ", ".
|
||||
END. /* FOR EACH ttReadReceiptRecipients */
|
||||
ASSIGN cReturnData = cReturnData + {"ES}.
|
||||
END. /* IF TEMP-TABLE ttReadReceiptRecipients:HAS-RECORDS */
|
||||
/* Write the "Subject:" header */
|
||||
ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Subject:" + cSubject + {"ES}.
|
||||
/* Write the "Importance:" header */
|
||||
IF cImportance BEGINS "H" THEN
|
||||
ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Importance:High" + {"ES}.
|
||||
ELSE IF cImportance BEGINS "L" THEN
|
||||
ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Importance:Low" + {"ES}.
|
||||
/* Write the "Sensitivity" header */
|
||||
IF cSensitivity NE "" THEN
|
||||
ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Sensitivity:" + cSensitivity + {"ES}.
|
||||
/* Write the "Priority" header */
|
||||
IF cPriority NE "" THEN
|
||||
ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Priority:" + cPriority + {"ES}.
|
||||
/* Write the "Date" (sent date) header */
|
||||
IF dttmtzSentDate NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Date:" + email.Util:ABLDateTimeToEmail(dttmtzSentDate) + {"ES}.
|
||||
IF dttmtzReplyByDate NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Reply-By:" + email.Util:ABLDateTimeToEmail(dttmtzReplyByDate) + {"ES}.
|
||||
/* Write the "Expiry-Date" header */
|
||||
IF dttmtzExpireDate NE ? THEN
|
||||
ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Expiry-Date:" + email.Util:ABLDateTimeToEmail(dttmtzExpireDate) + {"ES}.
|
||||
RETURN cReturnData.
|
||||
END METHOD.
|
||||
|
||||
/* Dumps all email message payload data (body and attachments) to LONGCHAR */
|
||||
METHOD PUBLIC LONGCHAR getPayload():
|
||||
DEFINE VARIABLE lcReturnData AS LONGCHAR NO-UNDO.
|
||||
|
||||
/* If no body and no text, then return empty string ("") */
|
||||
IF lcBody EQ "" AND NOT TEMP-TABLE ttAttachments:HAS-RECORDS THEN
|
||||
RETURN lcReturnData.
|
||||
|
||||
/* Write payload header */
|
||||
ASSIGN lcReturnData = "Mime-Version: 1.0" + cNewLine +
|
||||
"Content-Type: multipart/mixed; boundary=" + cMimeBoundary + cNewLine + cNewLine.
|
||||
|
||||
/* Write out the email body, if it exists */
|
||||
IF lcBody NE "" THEN DO:
|
||||
ASSIGN lcReturnData = lcReturnData + "--" + cMimeBoundary + cNewLine +
|
||||
"Content-Type: text/plain; charset=~"us-ascii~"" + cNewLine.
|
||||
IF lBodyIsBase64 THEN DO:
|
||||
ASSIGN lcReturnData = lcReturnData + "Content-Transfer-Encoding: base64" + cNewLine +
|
||||
cNewLine +
|
||||
email.Util:ConvertDataToBase64(lcBody) + cNewLine.
|
||||
END.
|
||||
ELSE DO:
|
||||
ASSIGN lcReturnData = lcReturnData + "Content-Transfer-Encoding: 7bit" + cNewLine +
|
||||
cNewLine +
|
||||
lcBody + cNewLine.
|
||||
END.
|
||||
END.
|
||||
|
||||
/* Write out each email attachment */
|
||||
FOR EACH ttAttachments:
|
||||
ASSIGN lcReturnData = lcReturnData + "--" + cMimeBoundary + cNewLine.
|
||||
IF ttAttachments.lBase64Encode THEN DO:
|
||||
ASSIGN lcReturnData = lcReturnData + "Content-Type: application/octet-stream" + cNewLine +
|
||||
"Content-Disposition: attachment; filename=~"" + ttAttachments.cFileName + "~"" + cNewLine +
|
||||
"Content-Transfer-Encoding: base64" + cNewLine + cNewLine +
|
||||
CAST(ttAttachments.lcData, email.LongcharWrapper):getLongchar() + cNewLine.
|
||||
END.
|
||||
ELSE DO:
|
||||
ASSIGN lcReturnData = lcReturnData + "Content-Type: text/plain; charset=~"us-ascii~"" + cNewLine +
|
||||
"Content-Disposition: attachment; filename=~"" + ttAttachments.cFileName + "~"" + cNewLine +
|
||||
"Content-Transfer-Encoding: 7bit" + cNewLine + cNewLine +
|
||||
CAST(ttAttachments.lcData, email.LongcharWrapper):getLongchar() + cNewLine.
|
||||
END.
|
||||
END.
|
||||
|
||||
/* Write payload footer */
|
||||
ASSIGN lcReturnData = lcReturnData + "--" + cMimeBoundary + "--" + cNewLine.
|
||||
|
||||
RETURN lcReturnData.
|
||||
END METHOD.
|
||||
|
||||
METHOD PUBLIC CHARACTER send():
|
||||
RETURN objSendEmailAlgorithm:sendEmail(INPUT THIS-OBJECT).
|
||||
END METHOD.
|
||||
|
||||
END CLASS.
|
||||
23
samples/OpenEdge ABL/SendEmailAlgorithm.cls
Normal file
23
samples/OpenEdge ABL/SendEmailAlgorithm.cls
Normal file
@@ -0,0 +1,23 @@
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
File : SendEmailAlgorithm
|
||||
Purpose :
|
||||
Syntax :
|
||||
Description : Uses object-oriented Strategy Pattern to abstract away the
|
||||
algorithm for sending an email by encapsulating it
|
||||
into a data structure.
|
||||
Author(s) : Abe Voelker
|
||||
Created : Sat Jul 17 17:11:18 CDT 2010
|
||||
Notes :
|
||||
----------------------------------------------------------------------*/
|
||||
|
||||
USING Progress.Lang.*.
|
||||
|
||||
INTERFACE email.SendEmailAlgorithm:
|
||||
|
||||
/* Returns: */
|
||||
/* SUCCESS = empty return string */
|
||||
/* FAILURE = error message in return string */
|
||||
METHOD PUBLIC CHARACTER sendEmail(INPUT ipobjEmail AS email.Email).
|
||||
|
||||
END INTERFACE.
|
||||
118
samples/OpenEdge ABL/SocketReader.p
Normal file
118
samples/OpenEdge ABL/SocketReader.p
Normal file
@@ -0,0 +1,118 @@
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
File : SocketReader.p
|
||||
Purpose :
|
||||
Author(s) : Abe Voelker
|
||||
Created : Sat Aug 21 08:31:38 CDT 2010
|
||||
Notes : Based on code from smtpmail.p
|
||||
----------------------------------------------------------------------*/
|
||||
|
||||
/* *************************** Definitions ************************** */
|
||||
DEFINE INPUT PARAMETER objSendEmailAlg AS email.SendEmailSocket NO-UNDO.
|
||||
DEFINE VARIABLE vbuffer AS MEMPTR NO-UNDO.
|
||||
DEFINE VARIABLE vstatus AS LOGICAL NO-UNDO.
|
||||
DEFINE VARIABLE vState AS INTEGER NO-UNDO.
|
||||
|
||||
|
||||
ASSIGN vstate = 1.
|
||||
|
||||
/* ******************** Preprocessor Definitions ******************** */
|
||||
|
||||
|
||||
/* *************************** Main Block *************************** */
|
||||
|
||||
FUNCTION getHostname RETURNS CHARACTER():
|
||||
DEFINE VARIABLE cHostname AS CHARACTER NO-UNDO.
|
||||
INPUT THROUGH hostname NO-ECHO.
|
||||
IMPORT UNFORMATTED cHostname.
|
||||
INPUT CLOSE.
|
||||
RETURN cHostname.
|
||||
END FUNCTION.
|
||||
|
||||
/*
|
||||
Status:
|
||||
0 - No Connection to the server
|
||||
1 - Waiting for 220 connection to SMTP server
|
||||
2 - Waiting for 250 OK status to start sending email
|
||||
3 - Waiting for 250 OK status for sender
|
||||
4 - Waiting for 250 OK status for recipient
|
||||
5 - Waiting for 354 OK status to send data
|
||||
6 - Waiting for 250 OK status for message received
|
||||
7 - Quiting
|
||||
*/
|
||||
|
||||
PROCEDURE newState:
|
||||
DEFINE INPUT PARAMETER newState AS INTEGER.
|
||||
DEFINE INPUT PARAMETER pstring AS CHARACTER.
|
||||
vState = newState.
|
||||
IF pstring = "" THEN
|
||||
RETURN.
|
||||
SET-SIZE(vbuffer) = LENGTH(pstring) + 1.
|
||||
PUT-STRING(vbuffer,1) = pstring.
|
||||
SELF:WRITE(vbuffer, 1, LENGTH(pstring)).
|
||||
SET-SIZE(vbuffer) = 0.
|
||||
END PROCEDURE.
|
||||
|
||||
PROCEDURE ReadSocketResponse:
|
||||
DEFINE VARIABLE vlength AS INTEGER NO-UNDO.
|
||||
DEFINE VARIABLE str AS CHARACTER NO-UNDO.
|
||||
DEFINE VARIABLE v AS INTEGER NO-UNDO.
|
||||
|
||||
MESSAGE SELF:GET-BYTES-AVAILABLE() VIEW-AS ALERT-BOX.
|
||||
vlength = SELF:GET-BYTES-AVAILABLE().
|
||||
IF vlength > 0 THEN DO:
|
||||
SET-SIZE(vbuffer) = vlength + 1.
|
||||
SELF:READ(vbuffer, 1, vlength, 1).
|
||||
str = GET-STRING(vbuffer,1).
|
||||
SET-SIZE(vbuffer) = 0.
|
||||
objSendEmailAlg:handleResponse(str).
|
||||
/*
|
||||
v = INTEGER(ENTRY(1, str," ")).
|
||||
CASE vState:
|
||||
WHEN 1 THEN
|
||||
IF v = 220 THEN
|
||||
RUN newState(2, "HELO " + getHostname() + "~r~n").
|
||||
ELSE
|
||||
vState = -1.
|
||||
WHEN 2 THEN
|
||||
IF v = 250 THEN
|
||||
RUN newState(3, "MAIL From: " + "hardcoded@gmail.com" + "~r~n").
|
||||
ELSE
|
||||
vState = -1.
|
||||
WHEN 3 THEN
|
||||
IF v = 250 THEN
|
||||
RUN newState(4, "RCPT TO: " + "hardcoded@gmail.com" + "~r~n").
|
||||
ELSE
|
||||
vState = -1.
|
||||
WHEN 4 THEN
|
||||
IF v = 250 THEN
|
||||
RUN newState(5, "DATA ~r~n").
|
||||
ELSE
|
||||
vState = -1.
|
||||
WHEN 5 THEN
|
||||
IF v = 354 THEN
|
||||
RUN newState(6, "From: " + "hardcoded@gmail.com" + "~r~n" +
|
||||
"To: " + "hardcoded@gmail.com" + " ~r~n" +
|
||||
"Subject: " + "Test Subject" +
|
||||
" ~r~n~r~n" +
|
||||
"Test Body" + "~r~n" +
|
||||
".~r~n").
|
||||
ELSE
|
||||
vState = -1.
|
||||
|
||||
WHEN 6 THEN
|
||||
IF v = 250 THEN
|
||||
RUN newState(7,"QUIT~r~n").
|
||||
ELSE
|
||||
vState = -1.
|
||||
END CASE.
|
||||
*/
|
||||
END.
|
||||
/*
|
||||
IF vState = 7 THEN
|
||||
MESSAGE "Email has been accepted for delivery.".
|
||||
IF vState < 0 THEN
|
||||
MESSAGE "Email has been aborted".
|
||||
*/
|
||||
END PROCEDURE.
|
||||
|
||||
57
samples/OpenEdge ABL/Util.cls
Normal file
57
samples/OpenEdge ABL/Util.cls
Normal file
@@ -0,0 +1,57 @@
|
||||
|
||||
/*------------------------------------------------------------------------
|
||||
File : Util.cls
|
||||
Description : Utility class for various methods that do not fit neatly into
|
||||
existing class structures.
|
||||
Author(s) : Abe Voelker
|
||||
Created : Sat Jun 26 16:05:14 CDT 2010
|
||||
Notes :
|
||||
----------------------------------------------------------------------*/
|
||||
|
||||
USING Progress.Lang.*.
|
||||
|
||||
|
||||
CLASS email.Util USE-WIDGET-POOL FINAL:
|
||||
|
||||
DEFINE PRIVATE STATIC VARIABLE cMonthMap AS CHARACTER EXTENT 12 INITIAL
|
||||
["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"].
|
||||
|
||||
/* Converts ABL DateTime-TZ default string format (07/21/2010 21:16:47.141-05:00) */
|
||||
/* to Email standard format (21 Jul 2010 21:16:47 -0500) */
|
||||
METHOD PUBLIC STATIC CHARACTER ABLDateTimeToEmail(INPUT ipdttzDateTime AS DATETIME-TZ):
|
||||
RETURN STRING(DAY(ipdttzDateTime)) + " " + cMonthMap[MONTH(ipdttzDateTime)] + " " +
|
||||
STRING(YEAR(ipdttzDateTime)) + " " +
|
||||
STRING( INTEGER( TRUNCATE( MTIME( ipdttzDateTime ) / 1000, 0 ) ), "HH:MM:SS" ) + " " +
|
||||
ABLTimeZoneToString(TIMEZONE(ipdttzDateTime)).
|
||||
END METHOD.
|
||||
|
||||
METHOD PUBLIC STATIC CHARACTER ABLDateTimeToEmail(INPUT ipdtDateTime AS DATETIME):
|
||||
RETURN ABLDateTimeToEmail(DATETIME-TZ(ipdtDateTime)). /* Time zone will be session value */
|
||||
END METHOD.
|
||||
|
||||
/* Note: ABL MODULO function returns incorrect values for negative numbers! */
|
||||
METHOD PUBLIC STATIC CHARACTER ABLTimeZoneToString(INPUT ipiTimeZone AS INTEGER):
|
||||
RETURN STRING(TRUNCATE(ipiTimeZone / 60, 0), "-99") + STRING(ABSOLUTE(ipiTimeZone) MODULO 60, "99").
|
||||
END METHOD.
|
||||
|
||||
/* Converts input plain text into base64-encoded, email-standard width string data */
|
||||
METHOD PUBLIC STATIC LONGCHAR ConvertDataToBase64(INPUT iplcNonEncodedData AS LONGCHAR):
|
||||
DEFINE VARIABLE lcPreBase64Data AS LONGCHAR NO-UNDO.
|
||||
DEFINE VARIABLE lcPostBase64Data AS LONGCHAR NO-UNDO.
|
||||
DEFINE VARIABLE mptrPostBase64Data AS MEMPTR NO-UNDO.
|
||||
DEFINE VARIABLE i AS INTEGER NO-UNDO.
|
||||
|
||||
/* Read file into MEMPTR and convert it to base-64 */
|
||||
COPY-LOB FROM OBJECT iplcNonEncodedData TO mptrPostBase64Data.
|
||||
lcPreBase64Data = BASE64-ENCODE(mptrPostBase64Data).
|
||||
SET-SIZE(mptrPostBase64Data) = 0. /* Free memory */
|
||||
|
||||
/* Convert base-64 data into 77-char width lines (for email standard) */
|
||||
DO i=1 TO LENGTH(lcPreBase64Data) BY 77:
|
||||
ASSIGN lcPostBase64Data = lcPostBase64Data + SUBSTRING(lcPreBase64Data, i, 77) + CHR(13) + CHR(10).
|
||||
END.
|
||||
|
||||
RETURN lcPostBase64Data.
|
||||
END METHOD.
|
||||
|
||||
END CLASS.
|
||||
1
samples/OpenEdge ABL/openedge.p
Normal file
1
samples/OpenEdge ABL/openedge.p
Normal file
@@ -0,0 +1 @@
|
||||
MESSAGE "Hello, world!".
|
||||
Reference in New Issue
Block a user