cq931ie.cpp

来自「ABis无线接口全套资料」· C++ 代码 · 共 379 行

CPP
379
字号
//
// cq931ie.cpp
// Q931 information element unpacked and packed class.
// 2005-10-29
//

#ifndef _CQ931IE_HPP
#include "cq931ie.hpp"
#endif

extern "C"
{
#ifndef _STRING_H
#include <string.h>
#endif
};

CChannelIdentification::CChannelIdentification( )
{
	content = NULL;
}

CChannelIdentification::CChannelIdentification(char len, char  * ptr)
{
	content = NULL;
	Unpacked(len, ptr);
}

CChannelIdentification::~CChannelIdentification( )
{
	if (content != NULL)
	{
		delete content;
		content = NULL;
	}
}

void CChannelIdentification::Unpacked(char len, char  * ptr)
{
	char  * pData = ptr;
	memcpy(&b3, pData, sizeof(SQ931CiB3));
	pData += sizeof(SQ931CiB3);

	if (0 == b3.intType)
	{ // Basic interface, not 3.1 and 3.2 3.3
		pcmId = 0xFFFF; // Not exist.
		tsId = 0xFF; // Not exist.
		return;
	}
	else if (0 == b3.intPresent)
	{ // Interface identifier implicitly.
		pcmId = 0xFFFF; // Implicitly, no NFAS mode.
		memcpy(&b3_2, pData, sizeof(SQ931CiB3_2));
		pData += sizeof(SQ931CiB3_2);
	}
	else
	{ // Interface identifier explicitly.
		// NFAS mode.
		pcmId = 0;
		int ext = 0;
		int bc = 0; // byte counter.
		do
		{
			SQ931CiB3_x  * pB3x = (SQ931CiB3_x *)pData;
			pData ++;
			pcmId += (pB3x->interfaceId << (bc*7));
			bc ++;
			ext = pB3x->ext;
		} while (0 == ext);

		memcpy(&b3_2, pData, sizeof(SQ931CiB3_2)); // Add 2006-06-11, by Wu jianjin.
		pData += sizeof(SQ931CiB3_2); // Add 2006-06-11, by Wu jianjin.
	}

	// Calcualte channel number (time slot).
	if (0 == b3_2.numMap)
	{ // Channel is indicated by the number in the following octet.
		tsId = *pData & 0x7F; // Ommit the bit 8. Not support mulitiple 64k channel.
		noChn = 0;
		memset(channel, 0, 32*sizeof(unsigned char));
		do
		{
			channel[noChn++] = *pData &0x7F;
			pData ++;
		} while ((pData-ptr) < len);
	}
	else // if (0 == b3_2.type)
	{ // Channel is indicated by the slot map (Map) in the following octet(s).
		if ((((unsigned short)(pData - ptr)) + sizeof(unsigned long)) > (UINT8)len)
		{ // The channel identification data imcomplete.
			tsId = 0xFF;
			return;
		}
			
		unsigned long slotMap = *((unsigned long *)pData);
		noChn = 0;
		memset(channel, 0, 32*sizeof(unsigned char));
		
		for (unsigned char c=0; c<32; ++c)
		{
			if (slotMap & 0x1L)
			{
				channel[noChn++] = c;
			}

			slotMap >>= 1;
		}

		tsId = (channel[0] > 0) ? channel[0] : 0xFF;
		/*
		for (tsId=0; tsId<32; ++tsId)
		{
			if (slotMap & 0x1L)
			{ // Got it.
				break;
			}

			slotMap >>= 1;
		}

		if (tsId >= 32)
		{
			tsId = 0xFF; // Not exist. Slot map invalid.
		}
		*/
	}
	// else
	// { // Not support.
	//	tsId = 0xFF;
	// }
}

char  * CChannelIdentification::Packed(SQ931CiB3 byte3, SQ931CiB3_2 byte3_2, unsigned short pcm, unsigned char ts, int& len)
{
	char tmpbuf[MAX_DIGITS];
	len = 0;

	byte3.ext = 1;
	memcpy(tmpbuf, &byte3, sizeof(SQ931CiB3));
	len += sizeof(SQ931CiB3);

	if (0 == byte3.intType)
	{ // Basic interface, not 3.1 and 3.2 3.3
	}
	else
	{
		if ((1 == byte3.intPresent)
			&& (pcm != 0xFFFF))
		{ // Interface identifier explicitly.
			do
			{
				((SQ931CiB3_x *)(tmpbuf+len))->interfaceId = (pcm & 0x7F);
				((SQ931CiB3_x *)(tmpbuf+len))->ext = 0; // May be extend.
				len += sizeof(SQ931CiB3_x);
				pcm >>= 7;
			} while (pcm > 0);

			((SQ931CiB3_x *)(tmpbuf+len-sizeof(SQ931CiB3_x)))->ext = 1; // The last octet of the interface id.
		}

		if (*((unsigned char *)&byte3_2) != 0)
		{
			byte3_2.ext = 1;
			memcpy(tmpbuf+len, &byte3_2, sizeof(SQ931CiB3_2));
			len += sizeof(SQ931CiB3_2);

			// Assign channel number (or time slot).
			if (0 == byte3_2.numMap)
			{ // Channel is indicated by the number in the following octet.
				((SQ931CiB3_x *)(tmpbuf+len))->interfaceId = (ts & 0x7F);
				((SQ931CiB3_x *)(tmpbuf+len))->ext = 1;
				len += sizeof(SQ931CiB3_x);
			}
			else // if (0 == byte3_2.type)
			{ // Channel is indicated by the slot map (Map) in the following octet(s).
				unsigned long  * slotMap = (unsigned long *)(tmpbuf+len);
				*slotMap = (1L << ts);
				len += sizeof(unsigned long);
			}
			// else
			// { // Not support.
			// }
		}
	}

	if (content != NULL)
	{
		delete content;
		content = NULL;
	}
	
	if (len > 0)
	{
		content = new char[len];
		if (content != NULL)
		{
			memcpy(content, tmpbuf, len);
		}
		else
		{ // Exception handle.
			// Out of memory.
			len = 0;
		}
	}

	return content;
}

// ============================================================================
CBearerCapability::CBearerCapability( )
{
	lengthOfB5 = 0;
	isB5Exist = 0;
	isB6Exist = 0;
	isB7Exist = 0;
	content = NULL;
}

CBearerCapability::CBearerCapability(char len, char  * ptr)
{
	lengthOfB5 = 0;
	isB5Exist = 0;
	isB6Exist = 0;
	isB7Exist = 0;
	content = NULL;
	Unpacked(len, ptr);
}

CBearerCapability::~CBearerCapability( )
{
	if (content != NULL)
	{
		delete content;
		content = NULL;
	}
}

void CBearerCapability::Unpacked(char len, char  * ptr)
{
	char  * pData = ptr;
	char pos = 0;

	memcpy(&b3, pData, sizeof(SQ931BcB3));
	pData += sizeof(SQ931BcB3);
	pos += sizeof(SQ931BcB3);

	memcpy(&b4, pData, sizeof(SQ931BcB4));
	pData += sizeof(SQ931BcB4);
	pos += sizeof(SQ931BcB4);

	if (0x18 == b4.itr) // Multirate (64 kbit/s base rate)
	{ // Include byte 4.1
		memcpy(&b4_1, pData, sizeof(SQ931BcB4_1));
		pData += sizeof(SQ931BcB4_1);
		pos += sizeof(SQ931BcB4_1);
	}

	if (pos < len)
	{
		isB5Exist = 1;
	}
	else
	{
		return;
	}
	
	// Calculate the length of byte 5.
	lengthOfB5 = 0;
	while (! (pData[lengthOfB5] & 0x80))
	{
		lengthOfB5 ++;
		pos ++;

		if (pos >= len)
		{
			break;
		}
	}

	memcpy(&b5d, pData, lengthOfB5);
	((char *)&b5d)[lengthOfB5-1] |= 0x80; // Set the extend bit to 1.

	pData += lengthOfB5;

	if (pos < len)
	{
		if (0x01 == ((SQ931BcB6B7 *)pData)->userInfoLxPtl)
		{ // Layer 2 identification
			isB6Exist = 1;
			memcpy(&b6, pData, sizeof(SQ931BcB6B7));
			pData += sizeof(SQ931BcB6B7);
			pos += sizeof(SQ931BcB6B7);

			if (pos < len)
			{ // There is layer3 identification
				isB7Exist = 1;
				memcpy(&b7, pData, sizeof(SQ931BcB6B7));
				pData += sizeof(SQ931BcB6B7);
				pos += sizeof(SQ931BcB6B7);
			}
		}
		else if (0x02 == ((SQ931BcB6B7 *)pData)->userInfoLxPtl)
		{ // Layer 3 identification
			isB7Exist = 1;
			memcpy(&b7, pData, sizeof(SQ931BcB6B7));
			pData += sizeof(SQ931BcB6B7);
			pos += sizeof(SQ931BcB6B7);
		}
	}
}

char  * CBearerCapability::Packed(UINT16& len)
{
	char tmpbuf[MAX_DIGITS];
	len = 0;

	b3.b3ext = 1;
	memcpy(tmpbuf+len, &b3, sizeof(SQ931BcB3));
	len += sizeof(SQ931BcB3);

	b4.b4ext = 1;
	memcpy(tmpbuf+len, &b4, sizeof(SQ931BcB4));
	len += sizeof(SQ931BcB4);

	if (0x18 == b4.itr) // Multirate (64 kbit/s base rate)
	{ // Include byte 4.1
		b4_1.b41ext = 1;
		memcpy(tmpbuf+len, &b4_1, sizeof(SQ931BcB4_1));
		len += sizeof(SQ931BcB4_1);
	}

	if (isB5Exist)
	{
		((char *)&b5d)[lengthOfB5-1] |= 0x80; // Set the extend bit to 1.
		memcpy(tmpbuf+len, &b5d, lengthOfB5);
		len += lengthOfB5;

		if (isB6Exist)
		{
			memcpy(tmpbuf+len, &b6, sizeof(SQ931BcB6B7));
			len += sizeof(SQ931BcB6B7);

			if (isB7Exist)
			{
				memcpy(tmpbuf+len, &b7, sizeof(SQ931BcB6B7));
				len += sizeof(SQ931BcB6B7);
			}
		}
		else if (isB7Exist)
		{
			memcpy(tmpbuf+len, &b7, sizeof(SQ931BcB6B7));
			len += sizeof(SQ931BcB6B7);
		}
	}

	if (content != NULL)
	{ // Release it first.
		delete content;
		content = NULL;
	}
	
	if (len > 0)
	{
		content = new char[len];
		if (content != NULL)
		{
			memcpy(content, tmpbuf, len);
		}
		else
		{ // Exception handle.
			// Out of memory.
			len = 0;
		}
	}

	return content;
}

⌨️ 快捷键说明

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