📄 tupptl.cpp
字号:
case PSG_MSG_TUP_STB:
break;
case PSG_MSG_TUP_MGB:
case PSG_MSG_TUP_MBA:
case PSG_MSG_TUP_MGU:
case PSG_MSG_TUP_MUA:
case PSG_MSG_TUP_HGB:
case PSG_MSG_TUP_HBA:
case PSG_MSG_TUP_HGU:
case PSG_MSG_TUP_HUA:
case PSG_MSG_TUP_SGB:
case PSG_MSG_TUP_SBA:
case PSG_MSG_TUP_SGU:
case PSG_MSG_TUP_SUA:
{
SCircuitGroupIndicatorIE cgind;
memset(&cgind, 0, sizeof(SCircuitGroupIndicatorIE));
if ((TUP_MGB == msgtype)
|| (TUP_MBA == msgtype)
|| (TUP_MGU == msgtype)
|| (TUP_MUA == msgtype))
{
cgind.type = CGIND_MAINTENANCE;
}
else if ((TUP_HGB == msgtype)
|| (TUP_HBA == msgtype)
|| (TUP_HGU == msgtype)
|| (TUP_HUA == msgtype))
{
cgind.type = CGIND_HARDWARE;
}
else
{
cgind.type = CGIND_SOFTWAER;
}
unsigned short rngln = *pPdu;
// unsigned char stln = (rngln + 1) / 8;
unsigned char ieLen = rngln/8 + 1 + 1;
// if ((rngln + 1) % 8) stln ++;
// memcpy(tmpbuf, pPdu, stln + 1);
// tmpbuf[0] ++; // Range --> Number of circuits.
memcpy((char *)&cgind+1, pPdu, ieLen);
cgind.noc ++; // Range --> Number of circuits.
PutIE(PSG_IE_CG_IND, ieLen+1, (char *)&cgind);
pPdu += ieLen;
}
break;
case PSG_MSG_TUP_GRA:
case PSG_MSG_TUP_GRS:
{
SCircuitGroupIndicatorIE cgind;
memset(&cgind, 0, sizeof(SCircuitGroupIndicatorIE));
cgind.type = CGIND_RESET;
unsigned short rngln = *pPdu; // Range.
// unsigned char stln = (rngln + 1) / 8;
unsigned char ieLen = rngln/8 + 1 + 1;
// if ((rngln + 1) % 8) stln ++;
if (TUP_GRA ==msgtype) // TUP_GRA
{
// memcpy(tmpbuf, pPdu, stln + 1);
// tmpbuf[0] ++; // Range --> Number of circuits.
memcpy((char *)&cgind+1, pPdu, ieLen);
cgind.noc ++; // Range --> Number of circuits.
}
else if (TUP_GRS == msgtype) // TUP_GRS
{
// tmpbuf[0] = *pPdu;
// tmpbuf[0] ++; // Range --> Number of circuits.
// memset(&tmpbuf[1], 0x00, stln);
cgind.noc = *pPdu;
cgind.noc ++; // Range --> Number of circuits.
}
PutIE(PSG_IE_CG_IND, ieLen+1, (char *)&cgind);
pPdu += ieLen;
}
break;
default:
break;
}
}
}
return r;
}
//=================================================================================
// Return:
// >= 0 Success.
// -1 TUP message too short.
// -2 TUP message type unrecognized.
// -3 TUP message content invalid IE value.
// -4 TUP IE unrecognized.
// -5 TUP message too long, exceeding data be attached.
//==================================================================================
char * CTupPdu::ComposeTupPdu(UINT16& len)
{
int r = 0;
char * pPdu;
char * pdu;
UINT16 l, tmplen;
char tmpbuf[64];
memset(tmpbuf, 0, 64);
pdu = new char[MAX_MSGLEN];
pPdu = pdu;
if (pdu != NULL)
{
memset(pPdu, 0, MAX_MSGLEN); // Initialize all pdu data to zero.
UINT8 tupHx = ToTupMsg(GetMessageType( )); // Convert to TUP H0 and H1.
switch (GetMessageType( ))
{
case PSG_MSG_TUP_IAM:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupIamHeader *iam = (SCTupIamHeader *)pPdu;
iam->hdr.h0 = tupHx & 0x0F;
iam->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_CLNPRTCTG);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
iam->cpc.cpc = pIe->GetIeData( );
}
else
{ // Set default value.
iam->cpc.cpc = 0x18;
}
pIe = GetIE(PSG_IE_WMSGIND);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
memcpy(&iam->mi, pIe->GetIeData(l), sizeof(STupIaMessageIndicators));
}
else
{ // Set default value.
memset(&iam->mi, 0, sizeof(STupIaMessageIndicators));
}
pPdu += sizeof(SCTupIamHeader);
pIe = GetIE(PSG_IE_CLDPRTNUM);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
iam->mi.noas = pIe->len;
tmplen = WrapCalledPartyNumber((unsigned char *)pIe->GetIeData(l), pIe->len, (unsigned char *)tmpbuf);
memcpy(pPdu, tmpbuf, tmplen);
pPdu += tmplen;
}
else
{ // Exception.
r = -1; // Missing parameter.
}
}
}
break;
case PSG_MSG_TUP_IAI:
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupIaiHeader * iai = (SCTupIaiHeader *)pPdu;
iai->hdr.h0 = tupHx & 0x0F;
iai->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_CLNPRTCTG);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
iai->cpc.cpc = pIe->GetIeData( );
}
else
{ // Set default value.
iai->cpc.cpc = 0x18;
}
pIe = GetIE(PSG_IE_WMSGIND);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
memcpy(&iai->mi, pIe->GetIeData(l), sizeof(STupIaMessageIndicators));
}
else
{ // Set default value.
memset(&iai->mi, 0, sizeof(STupIaMessageIndicators));
}
pPdu += sizeof(SCTupIaiHeader);
pIe = GetIE(PSG_IE_CLDPRTNUM);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
iai->mi.noas = pIe->len;
tmplen = WrapCalledPartyNumber((unsigned char *)pIe->GetIeData(l),
pIe->len, (unsigned char *)tmpbuf);
memcpy(pPdu, tmpbuf, tmplen);
pPdu += tmplen;
}
else
{ // Exception.
r = -1; // Missing parameter.
}
CIeBase * cliIe, *ocaIe;
cliIe = GetIE(PSG_IE_CLNLINEID);
ocaIe = GetIE(PSG_IE_ORGCLDNUM);
if (((cliIe != NULL) && (cliIe->id != IE_NOT_EXIST))
|| ((ocaIe != NULL) && (ocaIe->id != IE_NOT_EXIST)))
{
STupFirstIndicator * fi = (STupFirstIndicator *)pPdu;
pPdu += sizeof(STupFirstIndicator);
// Construct calling line identity.
if (cliIe != NULL)
{
fi->cli = 1;
memset(tmpbuf, 0, 64);
tmplen = WrapCallingPartyNumber((unsigned char *)cliIe->GetIeData(l), cliIe->len,
(unsigned char *)tmpbuf);
memcpy(pPdu, tmpbuf, tmplen);
pPdu += tmplen;
}
// Construct original called address.
if (ocaIe != NULL)
{
fi->oca = 1;
memset(tmpbuf, 0, 64);
tmplen = WrapOriginalCalledPartyNumber((unsigned char *)ocaIe->GetIeData(l),
ocaIe->len, (unsigned char *)tmpbuf);
memcpy(pPdu, tmpbuf, tmplen);
pPdu += tmplen;
}
}
}
break;
case PSG_MSG_TUP_SAM:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupSamHeader *sam = (SCTupSamHeader *)pPdu;
sam->hdr.h0 = tupHx & 0x0F;
sam->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_SUBNUM);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
pPdu += sizeof(SCTupSamHeader);
char * pSn = pIe->GetIeData(l);
sam->sami.noas = pIe->len-1;
tmplen = WrapCalledPartyNumber((unsigned char *)pSn+1,
pIe->len, (unsigned char *)tmpbuf);
memcpy(pPdu, tmpbuf, tmplen);
pPdu += tmplen;
}
else
{ // Exception.
r = -1; // Missing parameter.
}
}
}
break;
case PSG_MSG_TUP_SAO:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupSaoHeader *sao = (SCTupSaoHeader *)pPdu;
// memcpy(pdu, Header, LengthOfHeader);
// pPdu += LengthOfHeader;
sao->hdr.h0 = tupHx & 0x0F;
sao->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_SUBNUM);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
char * pSn = pIe->GetIeData(l);
sao->digit.digit = pSn[0];
pPdu += sizeof(SCTupSaoHeader);
}
else
{ // Exception.
r = -1; // Missing parameter.
}
}
}
break;
case PSG_MSG_TUP_GSM:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupGsmHeader *gsm = (SCTupGsmHeader *)pPdu;
gsm->hdr.h0 = tupHx & 0x0F;
gsm->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * cpcIe, * cliIe, * ocaIe;
if (((cpcIe != NULL) && (cpcIe->id != IE_NOT_EXIST))
|| ((cliIe != NULL) && (cliIe->id != IE_NOT_EXIST))
|| ((ocaIe != NULL) && (ocaIe->id != IE_NOT_EXIST)))
{
pPdu += sizeof(SCTupGsmHeader);
if (cpcIe != NULL)
{
gsm->rti.cpc = 1;
memcpy(pPdu, cpcIe->GetIeData(l), sizeof(STupCallingPartysCatetgory));
pPdu += sizeof(STupCallingPartysCatetgory);
}
if (cliIe != NULL)
{
gsm->rti.cli = 1;
tmplen = WrapCallingPartyNumber((unsigned char *)cliIe->GetIeData(l), cliIe->len,
(unsigned char *)tmpbuf);
memcpy(pPdu, tmpbuf, tmplen);
pPdu += tmplen;
}
if (ocaIe != NULL)
{
gsm->rti.oca = 1;
memset(tmpbuf, 0, 64);
tmplen = WrapOriginalCalledPartyNumber((unsigned char *)ocaIe->GetIeData(l),
ocaIe->len, (unsigned char *)tmpbuf);
memcpy(pPdu, tmpbuf, tmplen);
pPdu += tmplen;
}
}
}
}
break;
case PSG_MSG_TUP_COT:
case PSG_MSG_TUP_CCF:
case PSG_MSG_TUP_SEC:
case PSG_MSG_TUP_CGC:
case PSG_MSG_TUP_NNC:
case PSG_MSG_TUP_ADI:
case PSG_MSG_TUP_CFL:
case PSG_MSG_TUP_UNN:
case PSG_MSG_TUP_LOS:
case PSG_MSG_TUP_SST:
case PSG_MSG_TUP_ACB:
case PSG_MSG_TUP_DPN:
case PSG_MSG_TUP_ANC:
case PSG_MSG_TUP_ANN:
case PSG_MSG_TUP_CBK:
case PSG_MSG_TUP_CLF:
case PSG_MSG_TUP_RLG:
case PSG_MSG_TUP_RAN:
case PSG_MSG_TUP_FOT:
case PSG_MSG_TUP_CCL:
// case PSG_MSG_TUP_RLG:
case PSG_MSG_TUP_BLO:
case PSG_MSG_TUP_BLA:
case PSG_MSG_TUP_UBL:
case PSG_MSG_TUP_UBA:
case PSG_MSG_TUP_CCR:
case PSG_MSG_TUP_RSC:
case PSG_MSG_TUP_OPR:
case PSG_MSG_TUP_SLB:
case PSG_MSG_TUP_STB:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupClfHeader * tupmsg = (SCTupClfHeader *)pPdu;
tupmsg->hdr.h0 = tupHx & 0x0F;
tupmsg->hdr.h1 = (tupHx & 0xF0) >> 4;
pPdu += sizeof(SCTupClfHeader);
}
}
break;
case PSG_MSG_TUP_GRQ:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupGrqHeader *grq = (SCTupGrqHeader *)pPdu;
grq->hdr.h0 = tupHx & 0x0F;
grq->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_REQTYPEIND);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
memcpy(&grq->rti, pIe->GetIeData(l), sizeof(STupRequestTypeIndicator));
pPdu += sizeof(SCTupGrqHeader);
}
else
{ // Set default value.
grq->rti.cpc = 0; // Not request.
grq->rti.cli = 1; // Request calling line identity.
grq->rti.oca = 0; // Not request.
grq->rti.mci = 0; // Not request.
grq->rti.hr = 0; // Not request.
grq->rti.esr = 0; // Not request.
grq->rti.spare = 0; // Not request.
pPdu += sizeof(SCTupGrqHeader);
}
}
}
break;
case PSG_MSG_TUP_ACM:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupAcmHeader * acm = (SCTupAcmHeader *)pPdu;
acm->hdr.h0 = tupHx & 0x0F;
acm->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_INFIND);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
memcpy((char *)&acm->mi, pIe->GetIeData(l), sizeof(STupAcmMessageIndicator));
pPdu += sizeof(SCTupAcmHeader);
}
else
{ // Set default value.
acm->mi.toacs = 0x01; // Address complete signal, charge.
acm->mi.sf = 0x01; // Subscriber free.
pPdu += sizeof(SCTupAcmHeader);
}
}
}
break;
/*
case PSG_MSG_TUP_EUM:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupEumHeader *eum = (SCTupEumHeader *)pPdu;
memcpy(pdu, Header, LengthOfHeader);
pPdu += LengthOfHeader;
CIeBase * pIe;
if (NULL != (pIe = GetIE(PSG_IE_USRSRVINF)))
{
if (pIe->id != IE_NOT_EXIST)
{
memcpy((char *)&eum->uby, pIe->GetIeData(tmplen), sizeof(STupUserBusyIndicator));
memcpy(pPdu, (char *)&eum->uby, tmplen);
DelIE(PSG_IE_USRSRVINF);
pPdu += sizeof(STupUserBusyIndicator);
}
else
{ //
}
}
if (NULL != (pIe = GetIE(PSG_IE_SPC)))
{
if (pIe->id != IE_NOT_EXIST)
{
memcpy((char *)&eum->pc, pIe->GetIeData(tmplen), sizeof(STupSignalPoitCode));
memcpy(pPdu, (char *)&eum->pc, tmplen);
DelIE(PSG_IE_SPC);
pPdu += sizeof(STupSignalPoitCode);
}
else
{ //
}
}
}
}
break;
*/
/*
case PSG_MSG_TUP_ACC:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupAccHeader *acc = (SCTupAccHeader *)pPdu;
memcpy(pdu, Header, LengthOfHeader);
pPdu += LengthOfHeader;
CIeBase * pIe;
if (NULL != (pIe = GetIE(PSG_IE_BMSGIND )))
{
if (pIe->id != IE_NOT_EXIST)
{
memcpy((char *)&acc->cnf, pIe->GetIeData(tmplen), sizeof(STupMessageCongestionInformation));
memcpy(pPdu, (char *)&acc->cnf, tmplen);
DelIE(PSG_IE_BMSGIND );
pPdu += sizeof(STupMessageCongestionInformation );
}
else
{ //
}
}
}
}
break;
*/
case PSG_MSG_TUP_MPM:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupMpmHeader *mpm = (SCTupMpmHeader *)pPdu;
mpm->hdr.h0 = tupHx & 0x0F;
mpm->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_CRGINF);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
memcpy((char *)&mpm->ci, pIe->GetIeData(l), sizeof(STupChargeInformation));
pPdu += sizeof(SCTupMpmHeader);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -