📄 isupptl.cpp
字号:
pPdu += sizeof(STransmissionMediumRequirement);
vpos = pPdu - ptr;
vptr = *pPdu ++;
opos = pPdu - ptr;
optr = *pPdu ++;
ieLen = *pPdu ++;
// PutIE(PSG_IE_CLDPRTNUM, ieLen, pPdu); // ?????
// Unwrap BCD code.
numLen = UnwrapCalledPartyNumber((unsigned char *)pPdu, ieLen, (unsigned char *)tmpbuf);
PutIE(PSG_IE_CLDPRTNUM, numLen, tmpbuf);
pPdu += ieLen;
break;
case PSG_MSG_ISUP_REL:
vpos = pPdu - ptr;
vptr = *pPdu ++;
opos = pPdu - ptr;
optr = *pPdu ++;
ieLen = *pPdu ++;
PutIE(PSG_IE_CAUSEIND, ieLen, pPdu);
pPdu += ieLen;
break;
case PSG_MSG_ISUP_SAM:
vpos = pPdu - ptr;
vptr = *pPdu ++;
opos = pPdu - ptr;
optr = *pPdu ++;
ieLen = *pPdu ++;
// PutIE(PSG_IE_SUBNUM, ieLen, pPdu); // ?????
// Unwrap BCD code.
numLen = UnwrapSubsequentNumber((unsigned char *)pPdu, ieLen, (unsigned char *)tmpbuf);
PutIE(PSG_IE_SUBNUM, numLen, tmpbuf);
pPdu += ieLen;
break;
case PSG_MSG_ISUP_USR:
vpos = pPdu - ptr;
vptr = *pPdu ++;
opos = pPdu - ptr;
optr = *pPdu ++;
ieLen = *pPdu ++;
PutIE(PSG_IE_USRTOUSRINF, ieLen, pPdu);
pPdu += ieLen;
break;
case PSG_MSG_ISUP_SUS:
case PSG_MSG_ISUP_RES:
PutIE(PSG_IE_RESSUSIND, sizeof(SSuspendResumeIndicators), pPdu);
pPdu += sizeof(SSuspendResumeIndicators);
opos = pPdu - ptr;
optr = *pPdu ++;
break;
case PSG_MSG_ISUP_BLO: // Not any parameters.
case PSG_MSG_ISUP_BLA:
case PSG_MSG_ISUP_CCR:
case PSG_MSG_ISUP_LPA:
case PSG_MSG_ISUP_OLM:
case PSG_MSG_ISUP_RSC:
case PSG_MSG_ISUP_UBL:
case PSG_MSG_ISUP_UBA:
case PSG_MSG_ISUP_UCIC:
// No any parameters be included.
break;
case PSG_MSG_ISUP_CGB:
case PSG_MSG_ISUP_CGBA:
case PSG_MSG_ISUP_CGU:
case PSG_MSG_ISUP_CGUA:
if (CGS_MAINTENANCE == ((SCircuitGroupSupervisionMessageType *)pPdu)->ti)
{
tmpbuf[0] = CGIND_MAINTENANCE;
}
else if (CGS_HARDWARE == ((SCircuitGroupSupervisionMessageType *)pPdu)->ti)
{
tmpbuf[0] = CGIND_HARDWARE;
}
else
{
// Exception.
r = -3; // ISUP message content invalid IE value.
break;
}
pPdu ++;
vpos = pPdu - ptr;
vptr = *pPdu ++;
ieLen = *pPdu ++;
memcpy(tmpbuf+1, pPdu, ieLen);
tmpbuf[1] ++; // Range --> Number of circuits.
PutIE(PSG_IE_CG_IND, ieLen+1, tmpbuf);
pPdu += ieLen;
break;
case PSG_MSG_ISUP_GRS:
case PSG_MSG_ISUP_CQM:
vpos = pPdu - ptr;
vptr = *pPdu;
pPdu ++;
ieLen = *pPdu;
pPdu ++;
tmpbuf[0] = CGIND_RESET;
memcpy(tmpbuf+1, pPdu, ieLen);
tmpbuf[1] ++; // Range --> Number of circuits.
PutIE(PSG_IE_CG_IND, ieLen+1, tmpbuf);
pPdu += ieLen;
break;
case PSG_MSG_ISUP_FAA:
case PSG_MSG_ISUP_FAR:
PutIE(PSG_IE_FACIND, sizeof(SFacilityIndicators), pPdu);
pPdu += sizeof(SFacilityIndicators);
opos = pPdu - ptr;
optr = *pPdu ++;
break;
case PSG_MSG_ISUP_PAM:
break;
case PSG_MSG_ISUP_MPM:
PutIE(PSG_IE_CRGINF, sizeof(SChargeInformation), pPdu);
pPdu += sizeof(SChargeInformation);
opos = pPdu - ptr;
optr = *pPdu ++;
break;
default:
// Unrecognize message type.
break;
} // End of switch (GetMessageType( ))
if (optr != 0)
{
if ((pPdu - ptr) >= len)
{
r = -2; // ISUP message too short, missing some parameters.
}
else
{
// Get OPTIONAL parameters.
while (((pPdu - ptr) < len)
&& (r >= 0))
{
isupIe = *pPdu ++;
ieLen = *pPdu ++;
joyitIe = ToJoyitIe(isupIe);
switch (joyitIe)
{
case 0xFF:
r = -4; // ISUP IE unrecognized.
break;
case PSG_IE_ENDOPT:
ieLen = 1;
PutIE(joyitIe, ieLen, &eoop);
// Fix the position of pPdu.
pPdu -= 2;
break;
case PSG_IE_CLNPRTNUM: // Calling party number
// Unwrap BCD codes.
memset(tmpbuf, 0, 64);
numLen = UnwrapCallingPartyNumber((unsigned char *)pPdu, ieLen, (unsigned char *)tmpbuf);
PutIE(joyitIe, numLen, tmpbuf);
break;
case PSG_IE_ORGCLDNUM: // Original called number
case PSG_IE_REDNGNUM: // Redirecting number
case PSG_IE_REDIRNUM: // Redirection number
case PSG_IE_CONNUM: // Connected number
case PSG_IE_LCTNUM: // Location number
// Unwrap BCD codes.
memset(tmpbuf, 0, 64);
numLen = UnwrapOthersNumber((unsigned char *)pPdu, ieLen, (unsigned char *)tmpbuf);
PutIE(joyitIe, numLen, tmpbuf);
break;
case PSG_IE_GNRNUM: // Generic number
memset(tmpbuf, 0, 64);
numLen = UnwrapGenericNumber((unsigned char *)pPdu, ieLen, (unsigned char *)tmpbuf);
PutIE(joyitIe, numLen, tmpbuf);
break;
default:
PutIE(joyitIe, ieLen, pPdu);
break;
} // End of switch(joyitIe)
pPdu += ieLen;
}
if ((pPdu - ptr) > len)
{
r = -2; // ISUP message too short or data out of range.
}
else if ((pPdu - ptr) < len)
{
r = -5; // ISUP message too long, exceeding data be attached.
}
}
}
// else // No optional parameters.
}
}
return r;
}
char * CIsupPdu::ComposeIsupPdu(UINT16& len)
{
int r = 0;
char * pPdu;
char * pdu;
pdu = new char[MAX_MSGLEN];
pPdu = pdu;
if (pdu != NULL)
{
memset(pdu, 0, MAX_MSGLEN); // Initialize all pdu data to zero.
uchar opos = 0; // Optional parameter pointer position.
// int isup_header_len;
char tmpbuf[64];
UINT16 tmplen;
// char eoop = 0;
memset(tmpbuf, 0, 64);
// Make up ISUP header.
// Make up FIX and VARIABLE parameters.
switch (GetMessageType( ))
{
case PSG_MSG_ISUP_ACM:
case PSG_MSG_ISUP_CON:
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupAcmHeader * acm = (SCIsupAcmHeader *)pPdu;
acm->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
CIeBase * pIe;
pIe = GetIE(PSG_IE_BCKCALLIND);
if (pIe->id != IE_NOT_EXIST)
{
memcpy((char *)&acm->bci, pIe->GetIeData(tmplen), sizeof(SBackwardCallIndicators));
DelIE(PSG_IE_BCKCALLIND);
}
else
{ // IE not exist, assign the default value.
acm->bci.ci = BCI_CI_CHARGE;
acm->bci.cpsi = BCI_CPSI_SUBSCRIBER_FREE;
acm->bci.cpci = BCI_CPCI_ORDINARY_SUBSCRIBER;
acm->bci.isupi = BCI_ISUPI_ALLTHEWAY;
acm->bci.isdnai = BCI_ISDNAI_ISDN;
}
if (NoIe( ) > 0)
{
acm->op = 1;
}
pPdu += sizeof(SCIsupAcmHeader);
opos = sizeof(SCIsupAcmHeader) - 1;
}
break;
case PSG_MSG_ISUP_ANM:
case PSG_MSG_ISUP_RLC:
case PSG_MSG_ISUP_FOT:
case PSG_MSG_ISUP_UPT:
case PSG_MSG_ISUP_UPA:
case PSG_MSG_ISUP_FAC:
case PSG_MSG_ISUP_NRM:
case PSG_MSG_ISUP_IDR:
case PSG_MSG_ISUP_IRS:
case PSG_MSG_ISUP_SGM:
case PSG_MSG_ISUP_OPR:
case PSG_MSG_ISUP_CCL:
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupAnmHeader * anm = (SCIsupAnmHeader *)pPdu;
anm->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
if (NoIe( ) > 0)
{
anm->op = 1;
}
pPdu += sizeof(SCIsupAnmHeader);
opos = sizeof(SCIsupAnmHeader) - 1;
}
break;
case PSG_MSG_ISUP_CPG: // Event information and optional parameters.
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupCpgHeader * cpg = (SCIsupCpgHeader *)pPdu;
cpg->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
CIeBase * pIe;
pIe = GetIE(PSG_IE_EVENTINF);
if (pIe->id != IE_NOT_EXIST)
{
memcpy((char *)&cpg->ei, pIe->GetIeData(tmplen), sizeof(SEventInformation));
DelIE(PSG_IE_EVENTINF);
}
else
{ // IE not exist, assign the default value.
cpg->ei.ei = EI_EI_ALERTING; // EI_EI_PROGRESS;
cpg->ei.epri = EI_EPRI_NO_INDICATION;
}
if (NoIe( ) > 0)
{
cpg->op = 1;
}
pPdu += sizeof(SCIsupCpgHeader);
opos = sizeof(SCIsupCpgHeader) - 1;
}
break;
case PSG_MSG_ISUP_CQR: // Only variable.
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupCqrHeader * cqr = (SCIsupCqrHeader *)pPdu;
cqr->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
CIeBase * pIe;
pIe = GetIE(PSG_IE_RNGSTATUS);
if (pIe->id != IE_NOT_EXIST)
{
memcpy(tmpbuf, pIe->GetIeData(tmplen), pIe->len);
pPdu += sizeof(SCIsupCqrHeader);
pPdu --;
memcpy(pPdu, tmpbuf, pIe->len);
pPdu += pIe->len;
DelIE(PSG_IE_RNGSTATUS);
}
else
{ // Exception.
*pPdu ++ = 2; // Default value set to 2.
r = -1; // Missing VARIABLE parameter.
}
pIe = GetIE(PSG_IE_CIRSTA);
if (pIe->id != IE_NOT_EXIST)
{
memcpy(pPdu, pIe->GetIeData(tmplen), pIe->len);
pPdu += pIe->len ;
DelIE(PSG_IE_CIRSTA);
}
else
{ // Exception.
memset(tmpbuf, 0, 64);
memcpy(pPdu, tmpbuf, *(pPdu-1));
pPdu += *(pPdu-1);
r = -1; // Missing VARIABLE parameter.
}
}
break;
case PSG_MSG_ISUP_GRA:
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupGraHeader * gra = (SCIsupGraHeader *)pPdu;
gra->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
gra->vp = 1;
pPdu += sizeof(SCIsupGraHeader);
CIeBase * pIe;
pIe = GetIE(PSG_IE_CG_IND);
if (pIe->id != IE_NOT_EXIST)
{
memcpy(tmpbuf, pIe->GetIeData(tmplen), pIe->len);
*pPdu ++ = (pIe->len ); // Length of range and status.
memcpy(pPdu, tmpbuf, pIe->len); // range and status
*pPdu -= 1;
pPdu += (pIe->len );
DelIE(PSG_IE_CG_IND);
}
else
{ // Exception
// Set default value.
*pPdu ++ = 2; // Length of range and status.
*pPdu ++ = 2; // Range
*pPdu ++ = '\0';
r = -1; // Missing VARIABLE parameter.
}
}
break;
case PSG_MSG_ISUP_CFN:
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupCfnHeader * cfn = (SCIsupCfnHeader *)pPdu;
cfn->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
cfn->vp = 2;
cfn->op = 0;
pPdu += sizeof(SCIsupCfnHeader);
CIeBase * pIe;
pIe = GetIE(PSG_IE_CAUSEIND);
if (pIe->id != IE_NOT_EXIST)
{
*pPdu ++ = pIe->len;
memcpy(pPdu, pIe->GetIeData(tmplen), pIe->len);
pPdu += pIe->len;
DelIE(PSG_IE_CAUSEIND);
}
else
{ // Exception.
r = -1; // Missing VARIABLE parameter.
}
opos = sizeof(SCIsupCfnHeader) - 1;
}
break;
case PSG_MSG_ISUP_COT:
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupCotHeader * cot = (SCIsupCotHeader *)pPdu;
cot->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
CIeBase * pIe;
pIe = GetIE(PSG_IE_COTIND);
if (pIe->id != IE_NOT_EXIST)
{
memcpy((char *)&cot->ci, pIe->GetIeData(tmplen), sizeof(SContinuityIndicators));
DelIE(PSG_IE_COTIND);
}
else
{ // Set default value.
cot->ci.ci = COT_SUCCESSFUL;
cot->ci.spare = 0;
// r = -1; // Missing VARIABLE parameters.
}
pPdu += sizeof(SCIsupCotHeader);
}
break;
case PSG_MSG_ISUP_FRJ: // Facility indicator and V & O.
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupFrjHeader * frj = (SCIsupFrjHeader *)pPdu;
frj->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
CIeBase * pIe;
pIe = GetIE(PSG_IE_FACIND);
if (pIe->id != IE_NOT_EXIST)
{
frj->fi.fi = pIe->GetIeData( );
DelIE(PSG_IE_FACIND);
}
else
{ // Set default value.
frj->fi.fi = 0x02; // User-to-user service.
}
frj->vp = 2;
frj->op = 0;
pPdu += sizeof(SCIsupFrjHeader);
opos = sizeof(SCIsupFrjHeader) - 1;
pIe = GetIE(PSG_IE_CAUSEIND);
if (pIe->id != IE_NOT_EXIST)
{
*pPdu ++ = pIe->len;
memcpy(pPdu, pIe->GetIeData(tmplen), pIe->len);
pPdu += pIe->len;
DelIE(PSG_IE_CAUSEIND);
}
else
{ // Exception.
r = -1; // Missing VARIABLE parameter.
}
}
break;
case PSG_MSG_ISUP_INF:
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == ISUP_VAR_CHINA))
{
SCIsupInfHeader * inf = (SCIsupInfHeader *)pPdu;
inf->hdr.msgtype = ToIsupMsg(GetMessageType( ));
// Construct other fields here.
CIeBase * pIe;
pIe = GetIE(PSG_IE_INFIND);
if (pIe->id != IE_NOT_EXIST)
{
memcpy((char *)&inf->ii, pIe->GetIeData(tmplen), sizeof(SInformationIndicators));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -