q931ptl.cpp

来自「ABis无线接口全套资料」· C++ 代码 · 共 1,320 行 · 第 1/3 页

CPP
1,320
字号
						break;

					default:
						t = ieId & 0xF0;
						ieType = CQ931Pdu::ToJoyitIe(t);
						data = ieId & 0x0F;
						break;
				}

				pos ++;
				PutIE (ieType, 1, &data);
			}
			else
			{ // No single octet IE.
				ieType =  CQ931Pdu::ToJoyitIe(ieId);

				ieLen = *pPdu++;
				pIedata = pPdu;
				pPdu += ieLen;
				pos += (ieLen + 2);

				if (pos > len)
				{
					Print("Message too short.");
					// r = -2; // Delete 2005-11-11, by Wujianjin.
					// break; // Delete 2005-11-11, by Wujianjin.
				}
				// else
				else if (0xFF == ieType)
				{
					Print("Unrecognized information element.");
					if (! (ieId & 0xF0))
					{
						r = -7; // As mandatory information element missing.
						break;
					}
					else
					{
						continue; // Ignore this unrecognized information element.
					}
				}
				else if (ieLen > 0) // Modify 2005-10-28, by Wujianjin.
				{
					if (PSG_IE_CLDPRTNUM == ieType)
					{ // To search the "#" char.
						int len = ieLen;
						SQ931CalledPartyNumber  * pCalled = (SQ931CalledPartyNumber *)pIedata;
						// for (int i=0; i<(ieLen-1); ++i)
						for (int i=0; i<(ieLen-1); ++i)
						{
							if (pCalled->digits[i] != '#')
							{
								if ('*' == pCalled->digits[i])
								{
									pCalled->digits[i] = 11; // *
								}
								else
								{
									pCalled->digits[i] -= '0'; // Convert IA5 to numberic digit.
								}
							}
							else
							{ // Ignore '#' digit and the IA5 char follow it.
								len = i+1;
								break;
							}
						}

						PutIE(ieType, len, pIedata);

						if ((len < ieLen)
							&& (0 == isSendComplete))
						{ // There is '#' digit.
							char data = 1;
							PutIE(PSG_IE_L3_SNDCMP, 1, &data);
						}
					}
					else
					{
						if (PSG_IE_L3_CLNPRTNUM == ieType)
						{
							int pos;
							SQ931CallingPartyNumber  * pCalling = (SQ931CallingPartyNumber *)pIedata;
							pos = (1 == pCalling->b3ext) ? 1 : 2;
							for (; pos < ieLen; ++pos)
							{
								if ('*' == pIedata[pos])
								{
									pIedata[pos] = 11; // *
								}
								else if ('#' == pIedata[pos])
								{
									pIedata[pos] = 12; // #
								}
								else
								{
									pIedata[pos] -= '0'; // Convert IA5 to numberic digit.
								}
							}
						}
						else if ((PSG_IE_L3_RGN == ieType)
							|| (PSG_IE_L3_RNN == ieType)
							|| (PSG_IE_L3_CONUM == ieType))
						{
							int pos = 0;
							while (! (pIedata[pos] & 0x80))
							{
								pos ++;
							}

							for (pos+=1; pos<ieLen; ++pos)
							{
								if ('*' == pIedata[pos])
								{
									pIedata[pos] = 11; // *
								}
								else if ('#' == pIedata[pos])
								{
									pIedata[pos] = 12; // #
								}
								else
								{
									pIedata[pos] -= '0'; // Convert IA5 to numberic digit.
								}
							}
						}
						
						PutIE(ieType, ieLen, pIedata);
					}
				}
				// else ieLen == 0. It means equal this IE not exist.
			}
		}
	}
	else
	{
		Print("Message too short.");
		// r = -2; // Delete 2005-11-11, by Wujianjin.
	}
	
	return r;
};

char  * CQ931Pdu::ComposeQ931Pdu(UINT16& len)
{ // Add 2005-10-28, by Wujianjin.	
	unsigned char  * pPdu = NULL;
	unsigned char  * pdu = NULL;
	UINT8 pos = 0;
	pdu = new unsigned char[MAX_MSGLEN];
	// int i;
	UINT16 l; 
	// UINT8 noIe = NoIe();
    UINT16 mt = GetMessageType( );
	
	if (pdu != NULL)
	{
		memset(pdu, 0, MAX_MSGLEN); // Initialize all pdu data to zero.

		// Make up Q931 header.
		memcpy(pdu, Header, sizeof(SQ931MsgHead));
		// memcpy(pdu, Header, LengthOfHeader);
		pos += sizeof(SQ931MsgHead);
		mt = CQ931Pdu::ToQ931Msg(mt);
	
		// Make up all IEs.
		// #### Fot testing.
		unsigned char q931Ie[MAX_IE];
		unsigned char isRepeat[MAX_IE];
		unsigned char totalIe;
		unsigned char i;

		totalIe = NoIe( );

		memset(q931Ie, 0xFF, MAX_IE*sizeof(unsigned char));
		memset(isRepeat, 0, MAX_IE*sizeof(unsigned char));

		for (i=0; i<totalIe; ++i)
		{
			unsigned char id = ToQ931Ie(IE[i].id);

			if (IE_NOT_EXIST == id)
			{
				// noExistIe[totalNei++] = i; // IE[i].id;
			}
			else
			{
				if (0xFF == q931Ie[id])
				{
					q931Ie[id] = i;
				}
				else
				{ // It is repeat IE.
					isRepeat[id] ++; // Calculate the repeat times.
				}
			}
		}

		for (i=0; i<MAX_IE; ++i)
		{
			if (q931Ie[i] != 0xFF)
			{
				unsigned char index = q931Ie[i];
				pdu[pos] = CQ931Pdu::ToQ931Ie(IE[index].id);
			
				switch ((UINT8)pdu[pos])
				{
					case IE_NOT_EXIST: // Ignore this IE.
						// noIe --;
						break;

					case Q931_IE_SHIFT:
					case Q931_IE_CNGL:
					case Q931_IE_RPTIND: // Modify 2005-10-31, by Wujianjin.
						// pdu[pos] = (pdu[pos] << 4 | IE[i].data);
						pdu[pos] |= (IE[index].data & 0x0F);
						pos++;
						break;

					case Q931_IE_SNDCMP:
					case Q931_IE_MOREDATA:
						pos++;
						break;

					case Q931_IE_CLDPRTNUM: // Convert numberic digit to IA5.
					case Q931_IE_CLNPRTNUM: // Convert numberic digit to IA5.
					case Q931_IE_RGN: // Convert numberic digit to IA5.
					case Q931_IE_RNN:
					case Q931_IE_CONUM:
						if (Q931_IE_CLDPRTNUM == (UINT8)pdu[pos])
						{
							char  * pData = IE[index].GetIeData(l);
							for (int k=1; k<IE[index].len; ++k)
							{
								if (11 == pData[k]) // *
								{
									pData[k] = '*';
								}
								else if (12 == pData[k]) // #
								{
									pData[k] = '#';
								}
								else
								{
									pData[k] += '0';
								}
							}
						}
						else if (Q931_IE_CLNPRTNUM == (UINT8)pdu[pos])
						{
							char  * pData = IE[index].GetIeData(l);
							int k = (pData[0] & 0x80) ? 1 : 2;
							for (; k<IE[index].len; ++k)
							{
								if (11 == pData[k]) // *
								{
									pData[k] = '*';
								}
								else if (12 == pData[k]) // #
								{
									pData[k] = '#';
								}
								else
								{
									pData[k] += '0';
								}
							}
						}
						else if ((Q931_IE_RGN == (UINT8)pdu[pos])
							|| (Q931_IE_RNN == (UINT8)pdu[pos])
							|| (Q931_IE_CONUM == (UINT8)pdu[pos]))
						{ // ?????
							char  * pData = IE[index].GetIeData(l);
							int k=0;
							while (! (pData[k] & 0x80))
							{
								k++;
							}

							for (k+=1; k<IE[index].len; ++k)
							{
								if (11 == pData[k]) // *
								{
									pData[k] = '*';
								}
								else if (12 == pData[k]) // #
								{
									pData[k] = '#';
								}
								else
								{
									pData[k] += '0';
								}
							}
						}

					default:
						pos++;
						pdu[pos++] = IE[index].len;
						memcpy(pdu+pos, IE[index].GetIeData(l), IE[index].len);
						pos += IE[index].len;
				}


				if ((pos + IE[index].len) >= MAX_MSGLEN)
				{ // Message too long.
					printf("Q931 Msg too long. mType:0x%04X\n", mt);
					break;
				}
			// memcpy(&TempIE[tCnt++], &IE[q931Ie[i]], sizeof(CIeBase));

			// Copy the repeat IE.
			// for (char k=0; k<isRepeat[i]; ++k)
			for (char k=1; k<=isRepeat[i]; ++k) // Modify 2006-01-23, by Wu jianjin.
			{
				index = GetIEindex(IE[q931Ie[i]].id, k);
				if (index != IE_NOT_EXIST)
				{
					// unsigned char index = q931Ie[i];
					pdu[pos] = CQ931Pdu::ToQ931Ie(IE[index].id);
				
					switch ((UINT8)pdu[pos])
					{
						case IE_NOT_EXIST: // Ignore this IE.
							// noIe --;
							break;

						case Q931_IE_SHIFT:
						case Q931_IE_CNGL:
						case Q931_IE_RPTIND: // Modify 2005-10-31, by Wujianjin.
							// pdu[pos] = (pdu[pos] << 4 | IE[i].data);
							pdu[pos] |= (IE[index].data & 0x0F);
							pos++;
							break;

						case Q931_IE_SNDCMP:
						case Q931_IE_MOREDATA:
							pos++;
							break;

						case Q931_IE_CLDPRTNUM: // Convert numberic digit to IA5.
						case Q931_IE_CLNPRTNUM: // Convert numberic digit to IA5.
						case Q931_IE_RGN: // Convert numberic digit to IA5.
						case Q931_IE_RNN:
						case Q931_IE_CONUM:
							if (Q931_IE_CLDPRTNUM == (UINT8)pdu[pos])
							{
								char  * pData = IE[index].GetIeData(l);
								for (int k=1; k<IE[index].len; ++k)
								{
									if (11 == pData[k]) // *
									{
										pData[k] = '*';
									}
									else if (12 == pData[k]) // #
									{
										pData[k] = '#';
									}
									else
									{
										pData[k] += '0';
									}
								}
							}
							else if (Q931_IE_CLNPRTNUM == (UINT8)pdu[pos])
							{
								char  * pData = IE[index].GetIeData(l);
								int k = (pData[0] & 0x80) ? 1 : 2;
								for (; k<IE[index].len; ++k)
								{
									if (11 == pData[k]) // *
									{
										pData[k] = '*';
									}
									else if (12 == pData[k]) // #
									{
										pData[k] = '#';
									}
									else
									{
										pData[k] += '0';
									}
								}
							}
							else if ((Q931_IE_RGN == (UINT8)pdu[pos])
								|| (Q931_IE_RNN == (UINT8)pdu[pos])
								|| (Q931_IE_CONUM == (UINT8)pdu[pos]))
							{ // ?????
								char  * pData = IE[index].GetIeData(l);
								int k=0;
								while (! (pData[k] & 0x80))
								{
									k++;
								}

								for (k+=1; k<IE[index].len; ++k)
								{
									if (11 == pData[k]) // *
									{
										pData[k] = '*';
									}
									else if (12 == pData[k]) // #
									{
										pData[k] = '#';
									}
									else
									{
										pData[k] += '0';
									}
								}
							}

						default:
							pos++;
							pdu[pos++] = IE[index].len;
							memcpy(pdu+pos, IE[index].GetIeData(l), IE[index].len);
							pos += IE[index].len;
					}


					if ((pos + IE[index].len) >= MAX_MSGLEN)
					{ // Message too long.
						printf("Q931 Msg too long. mType:0x%04X\n", mt);
						break;
					}
						// memcpy(&TempIE[tCnt++], &IE[index], sizeof(CIeBase));
				}
			}
		}
	}
	// #### End of testing.
		/*for (i=0; i<NoIe( ); ++i)
		{
			pdu[pos] = CQ931Pdu::ToQ931Ie(IE[i].id);
			
			switch ((UINT8)pdu[pos])
			{
				case IE_NOT_EXIST: // Ignore this IE.
					// noIe --;
					break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?