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

📄 tupptl.cpp

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