⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tupptl.cpp

📁 ABis无线接口全套资料
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					}
					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 + -