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 + -
显示快捷键?