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

📄 isupptl.cpp

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