Loading...
Select Version
&pagelevel(5)&pagelevel
The C program examples shown below indicate how to use the C function calls YMLSML(), YMLCML(), YMLDML() and YMLGML().
Example 1: YMLSML() and YMLCML() function calls
#include <stdio.h>
#include <stdlib.h>
#include "FHDR.H"
#define _YMLSML_H_VERSION_3
#include "YMLSML.H"
#define _YMLCML_H_VERSION_2
#include "YMLCML.H"
#define ALIGNMENT 4
#define PAD(length) ((length + ALIGNMENT - 1) & ~(ALIGNMENT - 1))
main(int argc, char *argv[])
{
int c;
int suppressCheck = 0;
struct YMLSML_pl_mdl sendParam;
struct YMLCML_pl_mdl checkParam;
enum {UNIT = 940, SEND_FUNCTION = 20, SEND_VERSION = 3,
CHECK_FUNCTION = 21, CHECK_VERSION = 2,
parLen = 63 * 1024 + 512, orderIdLen = 16};
char sender[] = "Claudio.Monteverdi@mantova.example";
char recipient[] = "Heinrich.Schuetz@dresden.example";
char subject[] = "This is a test message";
char msgText[] = "This is the start of the test message.\n"
"This is the end of the test message.\n";
char srcCCSN[8 + 1] = "EDF04DRV";
char destCCSN[8 + 1] = "ISO88591";
char charSetName[] = "ISO-8859-1";
char *ptr;
struct YMLSML_general *ptrGeneral;
struct YMLSML_msg_att *ptrMsgAtt;
struct YMLSML_data_spec *ptrDataSpec;
struct YMLSML_charset *ptrCharset;
struct YMLSML_encoding *ptrEncoding;
char *mailPar;
char orderId[orderIdLen];
while ((c = getopt(argc, argv, "C")) != EOF) {
if (c == 'C')
suppressCheck = 1;
}
mailPar = ptr = malloc(parLen);
/* [Do some error handling] */
/* Supplying sender address */
ptrGeneral = (struct YMLSML_general *) ptr;
ptrGeneral->tag = YMLSML_tag_from;
ptrGeneral->len = strlen(sender);
ptr += sizeof(*ptrGeneral);
memcpy(ptr, sender, ptrGeneral->len);
ptr += PAD(ptrGeneral->len);
/* Supplying recipient address */
ptrGeneral = (struct YMLSML_general *) ptr;
ptrGeneral->tag = YMLSML_tag_to;
ptrGeneral->len = strlen(recipient);
ptr += sizeof(*ptrGeneral);
memcpy(ptr, recipient, ptrGeneral->len);
ptr += PAD(ptrGeneral->len);
/* Supplying subject line */
ptrGeneral = (struct YMLSML_general *) ptr;
ptrGeneral->tag = YMLSML_tag_subject;
ptrGeneral->len = strlen(subject);
ptr += sizeof(*ptrGeneral);
memcpy(ptr, subject, ptrGeneral->len);
ptr += PAD(ptrGeneral->len);
/* Supplying message body */
ptrMsgAtt = (struct YMLSML_msg_att *) ptr;
ptrMsgAtt->tag = YMLSML_tag_msg_begin;
ptr += sizeof(*ptrMsgAtt);
ptrDataSpec = (struct YMLSML_data_spec *) ptr;
ptrDataSpec->tag = YMLSML_tag_data_spec;
ptrDataSpec->type = YMLSML_data;
ptrDataSpec->len = strlen(msgText);
ptr += sizeof(*ptrDataSpec);
memcpy(ptr, msgText, ptrDataSpec->len);
ptr += PAD(ptrDataSpec->len);
ptrCharset = (struct YMLSML_charset *) ptr;
ptrCharset->tag = YMLSML_tag_charset;
ptrCharset->binary = YMLSML_no;
memcpy(ptrCharset->src_charset_XHCS, srcCCSN,
sizeof(ptrCharset->src_charset_XHCS));
memcpy(ptrCharset->dest_charset_XHCS, destCCSN,
sizeof(ptrCharset->dest_charset_XHCS));
ptrCharset->len = strlen(charSetName);
ptr += sizeof(*ptrCharset);
memcpy(ptr, charSetName, ptrCharset->len);
ptr += PAD(ptrCharset->len);
ptrEncoding = (struct YMLSML_encoding *) ptr;
ptrEncoding->tag = YMLSML_tag_encoding;
ptrEncoding->mechanism = YMLSML_qp;
ptr += sizeof(*ptrEncoding);
ptrMsgAtt = (struct YMLSML_msg_att *) ptr;
ptrMsgAtt->tag = YMLSML_tag_msg_end;
ptr += sizeof(*ptrMsgAtt);
memset(&sendParam, 0x00, sizeof(sendParam));
FHDR_SET_RC_NIL(sendParam.hdr);
FHDR_MOD_IFID(sendParam.hdr, UNIT, SEND_FUNCTION, SEND_VERSION);
sendParam.in_data.mail_par = mailPar;
sendParam.in_data.mail_par_len = ptr - mailPar;
sendParam.in_data.wait = YMLSML_res;
sendParam.in_data.sec_prot = YMLSML_smime;
sendParam.in_data.encrypt = YMLSML_no;
sendParam.in_data.sign = YMLSML_no;
sendParam.in_data.cipher = YMLSML_cipher_from_optfile;
memcpy(sendParam.in_data.optfile, "*NONE", 5);
YMLSML(sendParam);
if (sendParam.hdr.FHDR_RC_MAINCODE == YMLSML_successful) {
printf("YMLSML called successfully\n");
memcpy(orderId, sendParam.out_data.order_id, orderIdLen);
printf(" Order id: %.16s\n", sendParam.out_data.order_id);
if (sendParam.in_data.wait == YMLSML_yes) {
printf(" Return code: %d\n", sendParam.out_data.rc);
printf(" Return message: %.160s\n", sendParam.out_data.ret_msg);
exit(0);
}
}
else {
printf("Error in call of YMLSML: %08X\n", sendParam.hdr.FHDR_RC_NBR);
printf(" Order id: %.16s\n", sendParam.out_data.order_id);
printf(" Return code: %d\n", sendParam.out_data.rc);
printf(" Return message: %.160s\n", sendParam.out_data.ret_msg);
if (sendParam.hdr.FHDR_RC_MAINCODE == YMLSML_asti_error)
printf(" ASTI error: %08X\n", sendParam.out_data.asti_rc);
exit(1);
}
if (!suppressCheck) {
memset(&checkParam, 0x00, sizeof(checkParam));
FHDR_SET_RC_NIL(checkParam.hdr);
FHDR_MOD_IFID(checkParam.hdr, UNIT, CHECK_FUNCTION, CHECK_VERSION);
checkParam.in_data.wait = YMLCML_yes;
checkParam.in_data.order = YMLCML_single;
memcpy(checkParam.in_data.order_id, orderId, orderIdLen);
YMLCML(checkParam);
if (checkParam.hdr.FHDR_RC_MAINCODE == YMLCML_successful) {
printf("YMLCML called successfully\n");
printf(" Order id: %.16s\n", checkParam.out_data.order_id);
printf(" Return code: %d\n", checkParam.out_data.rc);
printf(" Return message: %.160s\n", checkParam.out_data.ret_msg);
}
else {
printf("Error in call of YMLCML: %08X\n", checkParam.hdr.FHDR_RC_NBR);
printf(" Order id: %.16s\n", checkParam.out_data.order_id);
printf(" Return code: %d\n", checkParam.out_data.rc);
printf(" Return message: %.160s\n", checkParam.out_data.ret_msg);
if (checkParam.hdr.FHDR_RC_MAINCODE == YMLCML_asti_error)
printf(" ASTI error: %08X\n", checkParam.out_data.asti_rc);
}
}
}
Example 2: YMLDML() function call
#include <stdio.h>
#include <stdlib.h>
#include "FHDR.H"
#define _YMLDML_H_VERSION_2
#include "YMLDML.H"
main(int argc, char *argv[])
{
int c;
int deleteAll = 0;
struct YMLDML_pl_mdl deleteParam;
enum {UNIT = 940, DELETE_FUNCTION = 22, DELETE_VERSION = 1,
orderIdLen = 16};
char orderId[orderIdLen + 1];
while ((c = getopt(argc, argv, "AO:")) != EOF) {
if (c == 'O') {
strupper(optarg, NULL);
strncpy(orderId, optarg, orderIdLen);
orderId[orderIdLen] = 0x00;
}
else if (c == 'A')
deleteAll = 1;
}
memset(&deleteParam, 0x00, sizeof(deleteParam));
FHDR_SET_RC_NIL(deleteParam.hdr);
FHDR_MOD_IFID(deleteParam.hdr, UNIT, DELETE_FUNCTION, DELETE_VERSION);
if (deleteAll)
deleteParam.in_data.order = YMLDML_all;
else {
deleteParam.in_data.order = YMLDML_single;
memcpy(deleteParam.in_data.order_id, orderId, orderIdLen);
}
deleteParam.in_data.owner = YMLDML_own;
YMLDML(deleteParam);
if (deleteParam.hdr.FHDR_RC_MAINCODE == YMLDML_successful) {
printf("YMLDML called successfully\n");
}
else {
printf("Error in call of YMLDML: %08X\n",
deleteParam.hdr.FHDR_RC_NBR);
if (deleteParam.hdr.FHDR_RC_MAINCODE == YMLDML_asti_error)
printf(" ASTI error: %08X\n", deleteParam.out_data.asti_rc);
exit(1);
}
}
Example 3: YMLGML() function call
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "FHDR.H"
#define _YMLGML_H_VERSION_2
#include "YMLGML.H"
main(int argc, char *argv[])
{
int c;
int getInfo = 0;
struct YMLGML_pl_mdl getInfoParam;
enum {UNIT = 940, GETINFO_FUNCTION = 23, GETINFO_VERSION = 2,
orderIdLen = 16, maxListSize = 30, mailParSize = 32768};
char orderId[orderIdLen + 1];
struct YMLGML_order *orderIdList;
int orderIdListSize = sizeof(orderIdList->num_order) +
sizeof(orderIdList->order_id) * maxListSize;
struct YMLGMLoutpar *mailPar;
char *statusTxt[5] =
{"Waiting", "Deferred", "Active", "Sent", "Failed"};
char *rcTxt[11] =
{"Ok", "Parameter error", "Resource saturation", "SMTP error",
"S/MIME error", NULL, NULL, NULL, NULL, NULL, "Internal error"};
int i;
time_t time;
while ((c = getopt(argc, argv, "AO:S")) != EOF) {
getInfo = c;
if (getInfo == 'O') {
strupper(optarg, NULL);
strncpy(orderId, optarg, orderIdLen);
orderId[orderIdLen] = 0x00;
}
}
memset(&getInfoParam, 0x00, sizeof(getInfoParam));
FHDR_SET_RC_NIL(getInfoParam.hdr);
FHDR_MOD_IFID(getInfoParam.hdr, UNIT, GETINFO_FUNCTION, GETINFO_VERSION);
if (getInfo == 'A') {
getInfoParam.in_data.order = YMLGML_all;
if (!(orderIdList = malloc(orderIdListSize))) {
printf("malloc failed\n");
exit(1);
}
getInfoParam.in_data.out = orderIdList;
getInfoParam.in_data.outl = orderIdListSize;
}
else if (getInfo == 'S') {
getInfoParam.in_data.order = YMLGML_sum;
getInfoParam.in_data.out = NULL;
getInfoParam.in_data.outl = 0;
}
else if (getInfo == 'O') {
getInfoParam.in_data.order = YMLGML_single;
memcpy(getInfoParam.in_data.order_id, orderId, orderIdLen);
if (!(mailPar = malloc(mailParSize))) {
printf("malloc failed\n");
exit(1);
}
getInfoParam.in_data.out = mailPar;
getInfoParam.in_data.outl = mailParSize;
}
else {
printf("No getInfo option specified!\n");
exit(1);
}
getInfoParam.in_data.owner = YMLGML_own;
YMLGML(getInfoParam);
if (getInfoParam.hdr.FHDR_RC_MAINCODE == YMLGML_successful) {
printf("YMLGML called successfully\n");
if (getInfo == 'A' || getInfo == 'S')
printf(" Number of mail orders: %d\n",
getInfoParam.out_data.sum);
if (getInfo == 'A') {
for (i = 0; i < orderIdList->num_order; i++)
printf(" OrderId[%d]: %.16s\n",
i + 1, orderIdList->order_id[i]);
}
else if (getInfo == 'O') {
printf(" Mail status: %s\n",
statusTxt[mailPar->_outp.mail_data.status - 1]);
printf(" Mail submitter: %.8s\n",
mailPar->_outp.mail_data.user);
time = (time_t) mailPar->_outp.mail_data.time -
(50 * 365 + 12) * 24 * 60 * 60;
printf(" Mail send time: %s", ctime(&time));
if (mailPar->_outp.mail_data.slctr == YMLGML_sel_result) {
printf(" Mail result: %s\n",
rcTxt[mailPar->_outp.mail_data._data.result_data.rc]);
printf(" Mail result message: %s\n",
mailPar->_outp.mail_data._data.result_data.ret_msg);
}
printf(" Mail parameter length: %d\n",
mailPar->_outp.mail_data.mail_par_len);
printf(" Mail parameter:");
for (i = 0; i < mailPar->_outp.mail_data.mail_par_len; i++) {
if (i % 32 == 0)
printf("\n ");
else if (i % 4 == 0)
printf(" ");
printf("%02X", mailPar->_outp.mail_data.mail_par[i]);
}
}
}
else if (getInfoParam.hdr.FHDR_RC_MAINCODE == YMLGML_order_not_found) {
printf("No order found.\n");
}
else {
printf("Error in call of YMLGML: %08X\n",
getInfoParam.hdr.FHDR_RC_NBR);
if (getInfoParam.hdr.FHDR_RC_MAINCODE == YMLGML_asti_error)
printf(" ASTI error: %08X\n", getInfoParam.out_data.asti_rc);
}
}