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