Code:
void
TestHandler::callMsgTransmit(
char * reqQName,
IMQMsg * msg,
bool reliably)
throw(EBBaseExcept)
{
if (reliably)
{
try
{
if ((BASTrx::Current::getSingleton())->get_status() !=
BASTrx::Status::StatusActive)
{
throw BASTrxRequiredExcept(MQ_TRC_GRP,
_callMsgTransmitFctName,
_callMsgTransmitFctName,
_FILE_, _LINE_);
}
}
catch(...)
{
throw BASTrxRequiredExcept(MQ_TRC_GRP,
_callMsgTransmitFctName,
_callMsgTransmitFctName,
_FILE_, _LINE_);
}
}
MQMD1 & msgDescriptor = msg->msgDescriptor();
MQPMOputMsgOptions = { MQPMO_DEFAULT };
putMsgOptions.Options = defaultPutOptions;
if ( ! reliably)
{
(putMsgOptions.Options) &= ~MQPMO_SYNCPOINT;
(putMsgOptions.Options) |= MQPMO_NO_SYNCPOINT;
}
const BASBuffer & buffer = msg->buffer();
const char * data = buffer.getBuffer();
MQLONG dataLength = buffer.tell();
if ((0 == data) || (dataLength < 1))
{
throw EBinvParValExcept(MQ_TRC_GRP,
_callMsgTransmitFctName,
"msg->buffer()", 0, 0,
"(0 == (msg->buffer()).getBuffer()) ||"
" ((msg->buffer()).tell() < 1",
_FILE_, _LINE_);
}
//---------------------------------------------------------
// struct 'TestHandler::TestParms'
//---------------------------------------------------------
const char validEyeCatcher[8] = { 'H', 'Y', 'Q', 'C', 'M', 'Q', 'P', 'R' };
const char version_1_0[4] = { '0' , '1', '0', '0' };
TestParms MsgParms;
memcpy(MsgParms.m_eyeCatcher, validEyeCatcher, sizeof(MsgParms.m_eyeCatcher));
memcpy(MsgParms.m_version, version_1_0, sizeof(MsgParms.m_version));
memcpy(MsgParms.m_mqprQueueMgr, &msgDescriptor.ReplyToQMgr, sizeof(MsgParms.m_mqprQueueMgr));
memcpy(MsgParms.m_mqprQueue, &reqQName, sizeof(MsgParms.m_mqprQueue));
memcpy(MsgParms.m_mqprReplyQueue, &msgDescriptor.ReplyToQ, sizeof(MsgParms.m_mqprReplyQueue));
memcpy(MsgParms.m_mqprMessageP, &data, sizeof(MsgParms.m_mqprMessageP));
memcpy(MsgParms.m_mqprMessageL, &dataLength, sizeof(MsgParms.m_mqprMessageL));
memcpy(MsgParms.m_mqprMessageId, &msgDescriptor.MsgId, sizeof(MsgParms.m_mqprMessageId));
memcpy(MsgParms.m_mqprCorrelId, &msgDescriptor.CorrelId, sizeof(MsgParms.m_mqprCorrelId));
memcpy(MsgParms.m_mqprCommitScope, &putMsgOptions.Options, sizeof(MsgParms.m_mqprCommitScope));
memcpy(MsgParms.m_mqprFormat, &msgDescriptor.Format, sizeof(MsgParms.m_mqprFormat));
memcpy(MsgParms.m_mqprPersistency, &msgDescriptor.Persistence, sizeof(MsgParms.m_mqprPersistency));
memcpy(MsgParms.m_mqprPriority, &msgDescriptor.Priority, sizeof(MsgParms.m_mqprPriority));
memcpy(MsgParms.m_mqprExpiry, &msgDescriptor.Expiry, sizeof(MsgParms.m_mqprExpiry));
memset(MsgParms.m_mqprTargetEntity, ' ', sizeof(MsgParms.m_mqprTargetEntity));
memset(MsgParms.m_reserved1, ' ', sizeof(MsgParms.m_reserved1));
IMQSspSvcStdPar::SspSvcStdPar * svcStdPar = IMQSspSvcStdPar::getSingleton().sspSvcStdPar();
// note:
// on OS/390 a pointer is a 31 bits quantity kept in a 4 bytes word;
// COBOL functions (the COBOL run time system) expect(s)
// the most significant bit of the last parameter to be set
TestParms * hyqcmqprParmsPtr = &MsgParms;
TestParms * _hyqcmqprParmsPtr =
(TestParms *)(((int)hyqcmqprParmsPtr) | 0x80000000);
{
hyqcmqprHandlerFct(
svcStdPar,
_hyqcmqprParmsPtr);
}
if (IMQSspSvcStdPar::getSingleton().rc1() == IMQSspSvcStdPar::FAILED)
{
throw EBCLibFctErrExcept(
SRV_CONT_TRC_GRP,
_callMsgTransmitFctName,
hyqcmqprHandlerFct, 0, 0, 0,
IMQSspSvcStdPar::getSingleton()._rc1(),
0,
_FILE_, _LINE_ );
TC_TRACE_LEAVE(SRV_CONT_TRC_GRP);
return ;
}
}
TestHandler.h