📄 tupptl.cpp
字号:
}
else
{ // Exception handle.
r = -1; // Missing mandatory IE.
}
}
}
break;
/* case PSG_MSG_TUP_GRS:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupRscHeader *grs = (SCTupRscHeader *)pPdu;
memcpy(pdu, Header, LengthOfHeader);
pPdu += LengthOfHeader;
CIeBase * pIe;
pIe = GetIE(PSG_IE_CGPSPVIND);
if (pIe->id != IE_NOT_EXIST)
{
memcpy((char *)&grs->rng, pIe->GetIeData(tmplen), sizeof(STupGrmRng));
memcpy(pPdu, (char *)&grs->rng, tmplen);
DelIE(PSG_IE_CGPSPVIND);
pPdu += sizeof(STupGrmRng);
}
else
{ //
}
}
}
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:
case PSG_MSG_TUP_GRA:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupMgbHeader *grm = (SCTupMgbHeader *)pPdu;
grm->hdr.h0 = tupHx & 0x0F;
grm->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_CG_IND);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
SCircuitGroupIndicatorIE * cgi = (SCircuitGroupIndicatorIE *)pIe->GetIeData(l);
grm->rs.range = cgi->noc-1; // Number of circuit --> Range.
memcpy(grm->rs.status, cgi->sb, grm->rs.range/8+1);
pPdu += (sizeof(SCTupMgbHeader)-4+grm->rs.range/8+1);
}
else
{ // Exception.
r = -1; // Missing parameter.
}
}
}
break;
case PSG_MSG_TUP_GRS:
// case PSG_MSG_TUP_GRA:
{
if ((24 == GetSS7Pcf( )) &&
(GetVariant( ) == TUP_VAR_CHINA))
{
SCTupMgbHeader *grm = (SCTupMgbHeader *)pPdu;
grm->hdr.h0 = tupHx & 0x0F;
grm->hdr.h1 = (tupHx & 0xF0) >> 4;
CIeBase * pIe;
pIe = GetIE(PSG_IE_CG_IND);
if ((NULL != pIe)
&& (IE_NOT_EXIST != pIe->id))
{
SCircuitGroupIndicatorIE * cgi = (SCircuitGroupIndicatorIE *)pIe->GetIeData(l);
grm->rs.range = cgi->noc-1; // Number of circuit --> Range.
pPdu += (sizeof(SCTupMgbHeader)-4);
}
else
{ // Exception.
r = -1; // Missing parameter.
}
}
}
break;
}
}
if (r < 0)
{
delete pdu;
pdu = NULL;
}
len = pPdu - pdu;
return pdu;
}
// ================================================================================================
unsigned char CTupPdu::UnwrapCalledPartyNumber(unsigned char *src, unsigned char len, unsigned char *dst)
{
// memset(dst, 0, 64);
// Extend the adress signals.
int ret = (len % 2) ? len/2 + 1 : len/2;
for (int i = 0; i < ret; i++)
{
unsigned char digits;
digits = * src;
digits &= 0x0F; // Lower digit.
*dst++ = digits;
digits = *src;
digits >>= 4; // Higher digit.
*dst++ = digits;
src ++;
}
// src--;
return ret;
}
//===========================================================================
unsigned short CTupPdu::WrapCalledPartyNumber(unsigned char *src,//
unsigned short len, unsigned char *dst)
{
unsigned short ln = 0;
// memset(dst, 0, 64);
for (int i = 0; i < len; i += 2)
{
unsigned char digit;
digit = *src++;
*dst = (digit & 0x0F);
digit = *src++;
*dst |= (digit << 4);
dst ++;
ln ++;
}
if (len % 2)
{ // Odd
dst --;
(*dst) &= 0x0F; // Set the last digit as filler.
}
return ln;
}
void CTupPdu::UnwrapCallingPartyNumber(unsigned char *src,//
unsigned char *para, unsigned char *dst)
{
// memset(dst, 0, 64);
unsigned char ln = 0;
STupCallingLineIdentity_H * pCg;
memcpy(dst, src, sizeof(STupCallingLineIdentity_H)); // Copy the head.
pCg = (STupCallingLineIdentity_H *)dst; // src;
dst += sizeof(STupCallingLineIdentity_H);
src += sizeof(STupCallingLineIdentity_H);
ln += sizeof(STupCallingLineIdentity_H);
// unsigned char ilen = pCg->noas;
unsigned char tmp = (pCg->noas % 2) ? pCg->noas/2 + 1 : pCg->noas/2; // Address length.
// Extend the adress signals.
for (int i = 0; i < tmp; i++)
{
unsigned char digits;
ln ++;
digits = *src;
digits &= 0x0F; // Lower digit.
*dst ++ = digits;
ln++;
digits = *src;
digits >>= 4; // Higher digit.
*dst ++ = digits;
src ++;
}
if (pCg->noas % 2)
{ // If the address number is odd, then discard the last digits.
ln --;
}
if ((*(--dst) == 0x0F)) // If the last digit is stop digit.
{
ln --;
}
pCg->noas = ln - 1;
para[0] = ln; // address length.
para[1] = sizeof(STupCallingLineIdentity_H) + tmp; // IE length.
}
unsigned short CTupPdu::WrapCallingPartyNumber(unsigned char *src,//
unsigned short len,unsigned char *dst)
{
// memset(dst, 0, 64);
STupCallingLineIdentity_H * pCg;
unsigned short ln = 0;
unsigned char lastDigit = src[len-1];
memcpy(dst, src, sizeof(STupCallingLineIdentity_H));
pCg = (STupCallingLineIdentity_H *)dst; // src;
unsigned char oe = (len-1) % 2; // pCg->noas % 2;
dst += sizeof(STupCallingLineIdentity_H);
src += sizeof(STupCallingLineIdentity_H);
ln += sizeof(STupCallingLineIdentity_H);
for (int i=sizeof(STupCallingLineIdentity_H); i < len; i += 2)
{
unsigned char digit;
digit = *src++;
*dst = (digit & 0x0F);
digit = *src++;
*dst |= (digit << 4);
dst ++;
ln ++;
}
// if ((pCg->noas != (--len)))
if (lastDigit != 0x0F)
{ // If PDK/HOST are not add the stop digits then ISUP will add it.
// if (len % 2)
pCg->noas = len;
if (oe)
{
dst --;
(*dst) |= 0xF0;
dst ++;
}
else
{
ln++;
(*dst) = 0x0F;
dst ++;
}
}
else
{
pCg->noas = len-1;
}
/*
if (oe)
{ // Odd
dst --;
(*dst) &= 0x0F; // Set the last digit as filler.
}
*/
return ln;
}
//=======================================================================================
void CTupPdu::UnwrapOriginalCalledPartyNumber(unsigned char *src,unsigned char *para, //
unsigned char *dst)
{
CTupPdu::UnwrapCallingPartyNumber((unsigned char *)src,(unsigned char *)para, //
(unsigned char *)dst);
}
//========================================================================================
unsigned short CTupPdu::WrapOriginalCalledPartyNumber(unsigned char *src,//
unsigned short len,unsigned char *dst)
{
STupOrignalCalledNumber_H * pCg;
unsigned short ln = 0;
memcpy(dst, src, sizeof(STupOrignalCalledNumber_H));
pCg = (STupOrignalCalledNumber_H *)dst; // src;
unsigned char oe = (len-1) % 2; // pCg->noas % 2;
dst += sizeof(STupOrignalCalledNumber_H);
src += sizeof(STupOrignalCalledNumber_H);
ln += sizeof(STupOrignalCalledNumber_H);
for (int i=sizeof(STupOrignalCalledNumber_H); i < len; i += 2)
{
unsigned char digit;
digit = *src++;
*dst = (digit & 0x0F);
digit = *src++;
*dst |= (digit << 4);
dst ++;
ln ++;
}
// Set the last byte higher 4 bits to zero.
if (oe)
{
dst --;
*dst &= 0x0F;
}
pCg->noas = len-1;
return ln;
}
char * CTupPdu::ComposeJoyitApi(UINT16& len)
{
char * pPdu = NULL;
char pdu[MAX_MSGLEN] = { 0 };
UINT8 pos = 0;
UINT16 l;
int i;
UINT16 msgType = GetMessageType( );
UINT8 noIe = 2; // = NoIe( );
// Make up API header.
memcpy(pdu, Header, sizeof(SInterApiHead));
pos += sizeof(SInterApiHead);
CIeBase * pIe;
pIe = GetIE(PSG_IE_MSGTYPE);
if ((pIe != NULL)
&& (pIe->id != IE_NOT_EXIST))
{
pdu[pos++] = pIe->id;
pdu[pos++] = pIe->len;
memcpy(pdu+pos, pIe->GetIeData(l), pIe->len);
pos += pIe->len;
}
else
{ // Not exist, I will get it from mType.
pdu[pos++] = PSG_IE_MSGTYPE;
pdu[pos++] = 2;
// memcpy(pdu+pos, &mType, 2);
memcpy(pdu+pos, &msgType, 2);
pos += 2;
}
if (pIe != NULL)
{
DelIE(PSG_IE_MSGTYPE);
}
// Circuit structure.
pIe = GetIE(PSG_IE_CIR_STRUCT);
if ((pIe != NULL)
&& (pIe->id != IE_NOT_EXIST))
{
pdu[pos++] = pIe->id;
pdu[pos++] = pIe->len;
memcpy(pdu+pos, pIe->GetIeData(l), pIe->len);
pos += pIe->len;
}
else
{ // Exception handle.
// return pPdu;
pdu[pos ++] = PSG_IE_CIR_STRUCT;
pdu[pos ++] = sizeof(SCircuitStructIE);
SCircuitStructIE chn;
chn.pcmId = GetPcm( );
chn.tsId = GetTs( );
memcpy(pdu+pos, &chn, sizeof(SCircuitStructIE));
pos += sizeof(SCircuitStructIE);
}
if (pIe != NULL)
{
DelIE(PSG_IE_CIR_STRUCT);
}
// Circuit group indicator.
pIe = GetIE(PSG_IE_CG_IND);
if ((pIe != NULL)
&& (pIe->id != IE_NOT_EXIST))
{
pdu[pos++] = pIe->id;
pdu[pos++] = pIe->len;
memcpy(pdu+pos, pIe->GetIeData(l), pIe->len);
pos += pIe->len;
++ noIe;
}
if (pIe != NULL)
{
DelIE(PSG_IE_CG_IND);
}
// }
// ### End 2005-10-30 ###
// Make up all other IEs.
for (i=0; i<NoIe( ); ++i)
{
pdu[pos++] = IE[i].id;
pdu[pos++] = IE[i].len;
noIe ++;
if ((pos + IE[i].len) >= MAX_MSGLEN)
{ // Message too long.
printf("Joyit API too long. mType:0x%04X\n", msgType);
break;
}
memcpy(pdu+pos, IE[i].GetIeData(l), IE[i].len);
pos += IE[i].len;
}
// Allocate memory for this PDU.
// if (i == IeCounter)
// {
pPdu = new char[pos];
if (pPdu != NULL)
{
((SInterApiHead *)pdu)->primType = GetPrimitiveType( ); // Modify 2005-10-27, by Wujianjin.
((SInterApiHead *)pdu)->noie = noIe;;
// ((SJoyitApiHead *)pdu)->PktLength = pos;
memcpy(pPdu, pdu, pos);
len = pos;
}
else
{ // Out of memory.
printf("Make up Joyit API out of memory. mType:0x%04X\n", msgType);
}
// }
return pPdu;
}
UINT16 CTupPdu::WhatPrimitive(UINT16 mType, UINT8 ri) // Input Joyit API message type, return what Joyit API primitive type belong to.
{ // ri = 0 Indication; ri = 1; Request.
UINT16 pType;
switch (mType)
{
case PSG_MSG_TUP_IAM:
case PSG_MSG_TUP_IAI:
pType = (ri) ? PSG_CC_SETUP_REQ : PSG_CC_SETUP_IND;
break;
case PSG_MSG_TUP_ACM:
pType = (ri) ? PSG_CC_AC_REQ : PSG_CC_AC_IND;
break;
case PSG_MSG_TUP_ANC:
case PSG_MSG_TUP_ANN:
case PSG_MSG_TUP_ANU:
pType = (ri) ? PSG_CC_ANSWER_REQ : PSG_CC_ANSWER_IND;
break;
case PSG_MSG_TUP_CLF:
// case PSG_MSG_TUP_RLG:
case PSG_MSG_TUP_CBK:
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_SSB:
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_STB:
case PSG_MSG_TUP_SLB:
pType = (ri) ? PSG_CC_RELEASE_REQ : PSG_CC_RELEASE_IND;
break;
case PSG_MSG_TUP_RLG:
if (rlgType)
{
pType = (ri) ? PSG_CC_CIRCUIT_REQ : PSG_CC_CIRCUIT_IND;
}
else
{
pType = (ri) ? PSG_CC_RELEASE_REQ : PSG_CC_RELEASE_IND;
}
break;
case PSG_MSG_TUP_BLO:
// case PSG_MSG_TUP_BLA:
case PSG_MSG_TUP_UBL:
// case PSG_MSG_TUP_UBA:
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_RSC:
case PSG_MSG_TUP_GRS:
// case PSG_MSG_TUP_GRA:
case PSG_MSG_TUP_SGB:
case PSG_MSG_TUP_SGU:
pType = (ri) ? PSG_CC_CIRCUIT_REQ : PSG_CC_CIRCUIT_IND;
break;
case PSG_MSG_TUP_BLA:
case PSG_MSG_TUP_UBA:
case PSG_MSG_TUP_MBA:
case PSG_MSG_TUP_MUA:
case PSG_MSG_TUP_HBA:
case PSG_MSG_TUP_HUA:
case PSG_MSG_TUP_GRA:
pType = PSG_CC_CIRCUIT_IND;
break;
default:
pType = (ri) ? PSG_CC_EVENT_REQ : PSG_CC_EVENT_IND;
} // End of switch(mType)
SetPrimitiveType(pType);
return pType;
}
// ------------------------------------------------------------------------
//
// Revision list.
// ==============
//
// 1.0, 2005-12-12, Wang jinquan
// Initial version.
//
// 2.0, 2005-12-25, Wu jianjin.
// Fix TUP message unpacked and output logical error.
// -------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -