q931ptl.cpp
来自「ABis无线接口全套资料」· C++ 代码 · 共 1,320 行 · 第 1/3 页
CPP
1,320 行
/* ======================================================================== *\
|
|
| JOYIT Communication Technology
| Copyright (C) 2005, All Right Reserved.
|
| System: PSC
| Sub-system:
| Filename: q931.cpp
| Environment: Red Hat Linux 7.2 & GNU C/C++ Compiler 2.96
| Function description: Q931 Protocol class
|
\* ======================================================================== */
#ifndef _Q931PTL_HPP
#include "q931ptl.hpp"
#endif
#ifndef _JOYITIEFMT_HPP
#include "joyitiefmt.hpp"
#endif
#ifndef _Q931IEFMT_HPP
#include "q931iefmt.hpp"
#endif
#ifndef _Q931FMT_HPP
#include "q931fmt.hpp"
#endif
#ifndef _UTIL_HPP
#include "util.hpp"
#endif
UINT8 CQ931Pdu::Q931Ie2JoyitIe[MAX_IE];
UINT8 CQ931Pdu::JoyitIe2Q931Ie[MAX_IE];
UINT16 CQ931Pdu::Q931Msg2JoyitMsg[MAX_MSG];
UINT8 CQ931Pdu::JoyitMsg2Q931Msg[MAX_MSG];
CQ931Pdu::CQ931Pdu( ) : CPduBase(0, ISUP_VAR_CHINA, 24, 0)
{
ownedPcmId = 0xFFFF; // PRI_NOT_EXIST; // Add 2005-10-27, by Wujianjin.
ownedTsId = 0; // Add 2005-10-27, by Wujianjin.
linkId = 0; // Add 2005-10-29, by Wujianjin.
lengthOfCallReference = 2; // Default.
LengthOfHeader = lengthOfCallReference+3;
}
CQ931Pdu::CQ931Pdu(CQ931Pdu& s) : CPduBase(s) // Copy construction function. Add 2005-11-04, by Wujianjin.
{
ownedPcmId = s.ownedPcmId;
ownedTsId = s.ownedTsId;
linkId = s.linkId;
lengthOfCallReference = s.lengthOfCallReference;
}
CQ931Pdu::CQ931Pdu(UINT8 pt, UINT8 pv, UINT8 pcf, UINT16 mt) : CPduBase(pt, pv, pcf, mt)
{
ownedPcmId = 0xFFFF; // PRI_NOT_EXIST; // Add 2005-10-27, by Wujianjin.
ownedTsId = 0; // Add 2005-10-27, by Wujianjin.
linkId = 0; // Add 2005-10-29, by Wujianjin.
lengthOfCallReference = 2; // Default.
LengthOfHeader = lengthOfCallReference+3;
}
CQ931Pdu::~CQ931Pdu( )
{
}
void CQ931Pdu::InitStaticData( ) // Initialize static data member.
{
InitQ931Ie( );
InitJoyitIe( );
InitQ931Msg( );
InitJoyitMsg( );
}
void CQ931Pdu::InitQ931Ie( ) // Initialize Q931Ie2JoyitIe array.
{
memset(Q931Ie2JoyitIe, 0xff, MAX_IE);
Q931Ie2JoyitIe[Q931_IE_SGM] = PSG_IE_L3_SGM; // Segmented message
Q931Ie2JoyitIe[Q931_IE_BC] = PSG_IE_L3_BC; // Bearer capability
Q931Ie2JoyitIe[Q931_IE_CAUSE] = PSG_IE_L3_CAUSE; // Cause
Q931Ie2JoyitIe[Q932_IE_EXTFAC] = PSG_IE_L3_EXTFAC; // Extended facility
Q931Ie2JoyitIe[Q931_IE_CALLID] = PSG_IE_L3_CALLID; // Call identity
Q931Ie2JoyitIe[Q932_IE_CALLSTATE] = PSG_IE_L3_CALLSTATE; // Call state
Q931Ie2JoyitIe[Q931_IE_CHNID] = PSG_IE_L3_CHNID; // Channel identification
Q931Ie2JoyitIe[Q932_IE_FAC] = PSG_IE_L3_FAC; // Facility
Q931Ie2JoyitIe[Q931_IE_PI] = PSG_IE_L3_PI; // Progress Indicator
Q931Ie2JoyitIe[Q931_IE_NWSF] = PSG_IE_L3_NWSF; // Network Specific Facilities
Q931Ie2JoyitIe[Q931_IE_NTFIND] = PSG_IE_L3_NTFIND; // Notification Indicator
Q931Ie2JoyitIe[Q931_IE_DISPLAY] = PSG_IE_L3_DISPLAY; // Display
Q931Ie2JoyitIe[Q931_IE_DATETIME] = PSG_IE_L3_DATETIME; // Date/time
Q931Ie2JoyitIe[Q931_IE_KB] = PSG_IE_L3_KB; // Keypad facility
Q931Ie2JoyitIe[Q932_IE_INFOREQ] = PSG_IE_L3_INFOREQ; // Information request
Q931Ie2JoyitIe[Q931_IE_SIGNAL] = PSG_IE_L3_SIGNAL; // Signal
Q931Ie2JoyitIe[Q932_IE_FTACT] = PSG_IE_L3_FTACT; // Feature activation
Q931Ie2JoyitIe[Q932_IE_FTIND] = PSG_IE_L3_FTIND; // Feature indication
Q931Ie2JoyitIe[Q932_IE_SPIND] = PSG_IE_L3_SPIND; // Service profile identification
Q931Ie2JoyitIe[Q932_IE_ENDID] = PSG_IE_L3_ENDID; // Endpoint identifier
Q931Ie2JoyitIe[Q931_IE_INFRATE] = PSG_IE_L3_INFRATE; // Information rate
Q931Ie2JoyitIe[Q931_IE_E2ETD] = PSG_IE_L3_E2ETD; // End-to-end transit delay
Q931Ie2JoyitIe[Q931_IE_TDSAI] = PSG_IE_L3_TDSAI; // Transit delay selection and indication
Q931Ie2JoyitIe[Q931_IE_PLBP] = PSG_IE_L3_PLBP; // Packet layer binary parameters
Q931Ie2JoyitIe[Q931_IE_PLWS] = PSG_IE_L3_PLWS; // Packet layer window size
Q931Ie2JoyitIe[Q931_IE_PKTSIZE] = PSG_IE_L3_PKTSIZE; // Packet size
Q931Ie2JoyitIe[Q931_IE_CUG] = PSG_IE_L3_CUG; // Closed User Group
Q931Ie2JoyitIe[Q931_IE_RCI] = PSG_IE_L3_RCI; // Reverse charge indication
Q931Ie2JoyitIe[Q931_IE_CONUM] = PSG_IE_L3_CONUM; // Connected number
Q931Ie2JoyitIe[Q931_IE_CONSUB] = PSG_IE_L3_CONSUB; // Connected subaddress
Q931Ie2JoyitIe[Q931_IE_CLNPRTNUM] = PSG_IE_L3_CLNPRTNUM; // Calling Party Number
Q931Ie2JoyitIe[Q931_IE_CLNPRTSUB] = PSG_IE_L3_CLNPRTSUB; // Calling Party subaddress
Q931Ie2JoyitIe[Q931_IE_CLDPRTNUM] = PSG_IE_L3_CLDPRTNUM; // Called Party Number
Q931Ie2JoyitIe[Q931_IE_CLDPRTSUB] = PSG_IE_L3_CLDPRTSUB; // Called Party subaddress
Q931Ie2JoyitIe[Q931_IE_RGN] = PSG_IE_L3_RGN; // Redirecting Number
Q931Ie2JoyitIe[Q931_IE_RNN] = PSG_IE_L3_RNN; // Redirection Number
Q931Ie2JoyitIe[Q931_IE_TNWS] = PSG_IE_L3_TNWS; // Transit Network Selection
Q931Ie2JoyitIe[Q931_IE_RSTIND] = PSG_IE_L3_RSTIND; // Restart indicator
Q931Ie2JoyitIe[Q931_IE_LLC] = PSG_IE_L3_LLC; // Low layer compatibility
Q931Ie2JoyitIe[Q931_IE_HLC] = PSG_IE_L3_HLC; // High layer compatibility
Q931Ie2JoyitIe[Q931_IE_U2U] = PSG_IE_L3_U2U; // User-to-user
// Single octet IE. Specifical process.
// Q931Ie2JoyitIe[Q931_IE_RESERVED] // Reserved.
Q931Ie2JoyitIe[Q931_IE_SHIFT] = PSG_IE_L3_SHIFT; // Shift
Q931Ie2JoyitIe[Q931_IE_MOREDATA] = PSG_IE_L3_MOREDATA; // More data
Q931Ie2JoyitIe[Q931_IE_SNDCMP] = PSG_IE_L3_SNDCMP; // Sending complete
Q931Ie2JoyitIe[Q931_IE_CNGL] = PSG_IE_L3_CNGL; // Congestion level
Q931Ie2JoyitIe[Q931_IE_RPTIND] = PSG_IE_L3_RPTIND; // Repeat indicator
};
void CQ931Pdu::InitJoyitIe( ) // Initialize JoyitIe2Q931Ie array.
{
memset(JoyitIe2Q931Ie, 0xff, MAX_IE);
JoyitIe2Q931Ie[PSG_IE_L3_BC] = Q931_IE_BC; // Bearer Capability
JoyitIe2Q931Ie[PSG_IE_L3_CALLID] = Q931_IE_CALLID; // Call Identity
// JoyitIe2Q931Ie[PSG_IE_L3_CR] = Q931_IE_CR; // Call reference
JoyitIe2Q931Ie[PSG_IE_L3_CALLSTATE] = Q932_IE_CALLSTATE; // Call State
JoyitIe2Q931Ie[PSG_IE_L3_CLDPRTNUM] = Q931_IE_CLDPRTNUM; // Called party number
JoyitIe2Q931Ie[PSG_IE_L3_CLNPRTNUM] = Q931_IE_CLNPRTNUM; // Calling party number
JoyitIe2Q931Ie[PSG_IE_L3_CAUSE] = Q931_IE_CAUSE; // Cause
JoyitIe2Q931Ie[PSG_IE_L3_CLDPRTSUB] = Q931_IE_CLDPRTSUB; // Called Party Sub_Number
JoyitIe2Q931Ie[PSG_IE_L3_CLNPRTSUB] = Q931_IE_CLNPRTSUB; // Calling Party Sub_Number
JoyitIe2Q931Ie[PSG_IE_L3_CHNID] = Q931_IE_CHNID; // Channel Idication
JoyitIe2Q931Ie[PSG_IE_L3_CUG] = Q931_IE_CUG; // Closed user group
JoyitIe2Q931Ie[PSG_IE_L3_CNGL] = Q931_IE_CNGL; // Congestion level
JoyitIe2Q931Ie[PSG_IE_L3_CONUM] = Q931_IE_CONUM; // Connected number
JoyitIe2Q931Ie[PSG_IE_L3_CONSUB] = Q931_IE_CONSUB; // Connected subaddress
JoyitIe2Q931Ie[PSG_IE_L3_DATETIME] = Q931_IE_DATETIME; // Date and time
JoyitIe2Q931Ie[PSG_IE_L3_DISPLAY] = Q931_IE_DISPLAY; // Display
JoyitIe2Q931Ie[PSG_IE_L3_E2ETD] = Q931_IE_E2ETD; // End-to-end transit delay
JoyitIe2Q931Ie[PSG_IE_L3_ENDID] = Q932_IE_ENDID; // Endpoint identifier
JoyitIe2Q931Ie[PSG_IE_L3_EXTFAC] = Q932_IE_EXTFAC; // Extended facility
JoyitIe2Q931Ie[PSG_IE_L3_FAC] = Q932_IE_FAC; // Facility
JoyitIe2Q931Ie[PSG_IE_L3_FTACT] = Q932_IE_FTACT; // Feature activation
JoyitIe2Q931Ie[PSG_IE_L3_FTIND] = Q932_IE_FTIND; // Feature indication
JoyitIe2Q931Ie[PSG_IE_L3_HLC] = Q931_IE_HLC; // High Level compatability
JoyitIe2Q931Ie[PSG_IE_L3_INFRATE] = Q931_IE_INFRATE; // Information rate
JoyitIe2Q931Ie[PSG_IE_L3_INFOREQ] = Q932_IE_INFOREQ; // Information request
JoyitIe2Q931Ie[PSG_IE_L3_KB] = Q931_IE_KB; // Keyboard
JoyitIe2Q931Ie[PSG_IE_L3_LLC] = Q931_IE_LLC; // Low Level Compatability
// JoyitIe2Q931Ie[PSG_IE_L3_MSGTYPE] = Q931_IE_MSGTYPE; // 0x9c // Message type
JoyitIe2Q931Ie[PSG_IE_L3_MOREDATA] = Q931_IE_MOREDATA; // More data
JoyitIe2Q931Ie[PSG_IE_L3_NTFIND] = Q931_IE_NTFIND; // Notification indicator
JoyitIe2Q931Ie[PSG_IE_L3_NWSF] = Q931_IE_NWSF; // Network Specific facilities
JoyitIe2Q931Ie[PSG_IE_L3_PLBP] = Q931_IE_PLBP; // Packet layer binary parameters
JoyitIe2Q931Ie[PSG_IE_L3_PLWS] = Q931_IE_PLWS; // Packet layer window size
JoyitIe2Q931Ie[PSG_IE_L3_PKTSIZE] = Q931_IE_PKTSIZE; // Packet size
JoyitIe2Q931Ie[PSG_IE_L3_PI] = Q931_IE_PI; // Procsess Indicator
// JoyitIe2Q931Ie[PSG_IE_L3_PTLDCM] = Q931_IE_PTLDCM; // Protocol discriminator
JoyitIe2Q931Ie[PSG_IE_L3_RGN] = Q931_IE_RGN; // Redirecting number
JoyitIe2Q931Ie[PSG_IE_L3_RNN] = Q931_IE_RNN; // Redirection number
JoyitIe2Q931Ie[PSG_IE_L3_RPTIND] = Q931_IE_RPTIND; // Repeat Indication
JoyitIe2Q931Ie[PSG_IE_L3_RSTIND] = Q931_IE_RSTIND; // Restart Indicator
JoyitIe2Q931Ie[PSG_IE_L3_RCI] = Q931_IE_RCI; // Reverse charge indication
JoyitIe2Q931Ie[PSG_IE_L3_SGM] = Q931_IE_SGM; // Segmented message
JoyitIe2Q931Ie[PSG_IE_L3_SNDCMP] = Q931_IE_SNDCMP; // Send Conplete
JoyitIe2Q931Ie[PSG_IE_L3_SPIND] = Q932_IE_SPIND; // Service profile identification
JoyitIe2Q931Ie[PSG_IE_L3_SHIFT] = Q931_IE_SHIFT; // Shift
JoyitIe2Q931Ie[PSG_IE_L3_SIGNAL] = Q931_IE_SIGNAL; // Signal
JoyitIe2Q931Ie[PSG_IE_L3_TDSAI] = Q931_IE_TDSAI; // Transit delay selection and indication
JoyitIe2Q931Ie[PSG_IE_L3_TNWS] = Q931_IE_TNWS; // Transit Network Selection
JoyitIe2Q931Ie[PSG_IE_L3_U2U] = Q931_IE_U2U; // User-to-user
}
void CQ931Pdu::InitQ931Msg( ) // Initialize Q931Msg2JoyitMsg array.
{
memset(Q931Msg2JoyitMsg, 0xff, sizeof(UINT16)*MAX_MSG);
Q931Msg2JoyitMsg[Q931_MSG_CALL_PROC] = PSG_MSG_Q931_CALL_PROC;
Q931Msg2JoyitMsg[Q931_MSG_CONNECT] = PSG_MSG_Q931_CONNECT;
Q931Msg2JoyitMsg[Q931_MSG_CONNECT_ACK] = PSG_MSG_Q931_CONNECT_ACK;
Q931Msg2JoyitMsg[Q931_MSG_INFORMATION] = PSG_MSG_Q931_INFORMATION;
Q931Msg2JoyitMsg[Q931_MSG_NOTIFY] = PSG_MSG_Q931_NOTIFY;
Q931Msg2JoyitMsg[Q931_MSG_PROGRESS] = PSG_MSG_Q931_PROGRESS;
Q931Msg2JoyitMsg[Q931_MSG_RELEASE] = PSG_MSG_Q931_RELEASE;
Q931Msg2JoyitMsg[Q931_MSG_RELEASE_COM] = PSG_MSG_Q931_RELEASE_COM;
Q931Msg2JoyitMsg[Q931_MSG_RESTART] = PSG_MSG_Q931_RESTART;
Q931Msg2JoyitMsg[Q931_MSG_RESTART_ACK] = PSG_MSG_Q931_RESTART_ACK;
Q931Msg2JoyitMsg[Q931_MSG_SEGMENT] = PSG_MSG_Q931_SEGMENT;
Q931Msg2JoyitMsg[Q931_MSG_SUSPEND] = PSG_MSG_Q931_SUSPEND;
Q931Msg2JoyitMsg[Q931_MSG_USER_INF] = PSG_MSG_Q931_USER_INF;
Q931Msg2JoyitMsg[Q931_MSG_CONGESTION_CTRL] = PSG_MSG_Q931_CONGESTION_CTRL;
Q931Msg2JoyitMsg[Q931_MSG_ALERTING] = PSG_MSG_Q931_ALERTING;
Q931Msg2JoyitMsg[Q931_MSG_SETUP] = PSG_MSG_Q931_SETUP;
Q931Msg2JoyitMsg[Q931_MSG_SETUP_ACK] = PSG_MSG_Q931_SETUP_ACK;
Q931Msg2JoyitMsg[Q931_MSG_RESUME] = PSG_MSG_Q931_RESUME;
Q931Msg2JoyitMsg[Q931_MSG_RESUME_ACK] = PSG_MSG_Q931_RESUME_ACK;
Q931Msg2JoyitMsg[Q931_MSG_RESUME_REJ] = PSG_MSG_Q931_RESUME_REJ;
Q931Msg2JoyitMsg[Q931_MSG_SUSPEND_ACK] = PSG_MSG_Q931_SUSPEND_ACK;
Q931Msg2JoyitMsg[Q931_MSG_SUSPEND_REJ] = PSG_MSG_Q931_SUSPEND_REJ;
Q931Msg2JoyitMsg[Q931_MSG_DISCONNECT] = PSG_MSG_Q931_DISCONNECT;
Q931Msg2JoyitMsg[Q931_MSG_STATUS] = PSG_MSG_Q931_STATUS;
Q931Msg2JoyitMsg[Q931_MSG_STATUS_ENQUIRY] = PSG_MSG_Q931_STATUS_ENQUIRY;
Q931Msg2JoyitMsg[Q931_MSG_HOLD] = PSG_MSG_Q931_HOLD;
Q931Msg2JoyitMsg[Q931_MSG_HOLD_ACK] = PSG_MSG_Q931_HOLD_ACK;
Q931Msg2JoyitMsg[Q931_MSG_HOLD_REJ] = PSG_MSG_Q931_HOLD_REJ;
Q931Msg2JoyitMsg[Q931_MSG_RETRIEVE] = PSG_MSG_Q931_RETRIEVE;
Q931Msg2JoyitMsg[Q931_MSG_RETRIEVE_ACK] = PSG_MSG_Q931_RETRIEVE_ACK;
Q931Msg2JoyitMsg[Q931_MSG_RETRIEVE_REJ] = PSG_MSG_Q931_RETRIEVE_REJ;
Q931Msg2JoyitMsg[Q931_MSG_FACILITY] = PSG_MSG_Q931_FACILITY;
Q931Msg2JoyitMsg[Q931_MSG_REGISTER] = PSG_MSG_Q931_REGISTER;
}
void CQ931Pdu::InitJoyitMsg( ) // Initialize JoyitMsg2Q931Msg array.
{
memset(JoyitMsg2Q931Msg, 0xff, MAX_MSG);
JoyitMsg2Q931Msg[PSG_MSG_Q931_CALL_PROC-0x0100] = Q931_MSG_CALL_PROC;
JoyitMsg2Q931Msg[PSG_MSG_Q931_CONNECT-0x0100] = Q931_MSG_CONNECT;
JoyitMsg2Q931Msg[PSG_MSG_Q931_CONNECT_ACK-0x0100] = Q931_MSG_CONNECT_ACK;
JoyitMsg2Q931Msg[PSG_MSG_Q931_INFORMATION-0x0100] = Q931_MSG_INFORMATION;
JoyitMsg2Q931Msg[PSG_MSG_Q931_NOTIFY-0x0100] = Q931_MSG_NOTIFY;
JoyitMsg2Q931Msg[PSG_MSG_Q931_PROGRESS-0x0100] = Q931_MSG_PROGRESS;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RELEASE-0x0100] = Q931_MSG_RELEASE;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RELEASE_COM-0x0100] = Q931_MSG_RELEASE_COM;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RESTART-0x0100] = Q931_MSG_RESTART;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RESTART_ACK-0x0100] = Q931_MSG_RESTART_ACK;
JoyitMsg2Q931Msg[PSG_MSG_Q931_SEGMENT-0x0100] = Q931_MSG_SEGMENT;
JoyitMsg2Q931Msg[PSG_MSG_Q931_SUSPEND-0x0100] = Q931_MSG_SUSPEND;
JoyitMsg2Q931Msg[PSG_MSG_Q931_USER_INF-0x0100] = Q931_MSG_USER_INF;
JoyitMsg2Q931Msg[PSG_MSG_Q931_CONGESTION_CTRL-0x0100] = Q931_MSG_CONGESTION_CTRL;
JoyitMsg2Q931Msg[PSG_MSG_Q931_ALERTING-0x0100] = Q931_MSG_ALERTING;
JoyitMsg2Q931Msg[PSG_MSG_Q931_SETUP-0x0100] = Q931_MSG_SETUP;
JoyitMsg2Q931Msg[PSG_MSG_Q931_SETUP_ACK-0x0100] = Q931_MSG_SETUP_ACK;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RESUME-0x0100] = Q931_MSG_RESUME;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RESUME_ACK-0x0100] = Q931_MSG_RESUME_ACK;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RESUME_REJ-0x0100] = Q931_MSG_RESUME_REJ;
JoyitMsg2Q931Msg[PSG_MSG_Q931_SUSPEND_ACK-0x0100] = Q931_MSG_SUSPEND_ACK;
JoyitMsg2Q931Msg[PSG_MSG_Q931_SUSPEND_REJ-0x0100] = Q931_MSG_SUSPEND_REJ;
JoyitMsg2Q931Msg[PSG_MSG_Q931_DISCONNECT-0x0100] = Q931_MSG_DISCONNECT;
JoyitMsg2Q931Msg[PSG_MSG_Q931_STATUS-0x0100] = Q931_MSG_STATUS;
JoyitMsg2Q931Msg[PSG_MSG_Q931_STATUS_ENQUIRY-0x0100] = Q931_MSG_STATUS_ENQUIRY;
JoyitMsg2Q931Msg[PSG_MSG_Q931_HOLD-0x0100] = Q931_MSG_HOLD;
JoyitMsg2Q931Msg[PSG_MSG_Q931_HOLD_ACK-0x0100] = Q931_MSG_HOLD_ACK;
JoyitMsg2Q931Msg[PSG_MSG_Q931_HOLD_REJ-0x0100] = Q931_MSG_HOLD_REJ;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RETRIEVE-0x0100] = Q931_MSG_RETRIEVE;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RETRIEVE_ACK-0x0100] = Q931_MSG_RETRIEVE_ACK;
JoyitMsg2Q931Msg[PSG_MSG_Q931_RETRIEVE_REJ-0x0100] = Q931_MSG_RETRIEVE_REJ;
JoyitMsg2Q931Msg[PSG_MSG_Q931_FACILITY-0x0100] = Q931_MSG_FACILITY;
JoyitMsg2Q931Msg[PSG_MSG_Q931_REGISTER-0x0100] = Q931_MSG_REGISTER;
}
// uchar CQ931Pdu::SetJoyitIeType (UINT8 id) // Q931's IE to Q931 API's IE index.
uchar CQ931Pdu::ToJoyitIe(UINT8 id) // Q931's IE to Q931 API's IE index.
{
return (id < MAX_IE) ? Q931Ie2JoyitIe[id] : 0xff;
}
// uchar CQ931Pdu:: ChangeToQ931IeType(UINT8 id) // Q931 API's IE index to Q931's IE.
uchar CQ931Pdu:: ToQ931Ie(UINT8 id) // Q931 API's IE index to Q931's IE.
{
return (id < MAX_IE) ? JoyitIe2Q931Ie[id] : 0xff;
}
UINT16 CQ931Pdu::ToJoyitMsg(UINT8 id) // Q931 message type to Q931 API message index.
{
return (id < MAX_MSG) ? Q931Msg2JoyitMsg[id] : 0xFFFF;
}
uchar CQ931Pdu::ToQ931Msg(UINT16 id) // Q931 API message index to Q931 message type.
{
UINT8 msgindex = id - 0x0100 ;
return (msgindex < MAX_MSG) ? JoyitMsg2Q931Msg[msgindex] : 0xFF;
}
int CQ931Pdu::Unpacked(char * ptr, UINT16 len)
{
int r = 0;
switch (GetProtocolType( ))
{
case MOD_JOYIT:
case MOD_TUPAPI:
case MOD_ISUPAPI:
case MOD_Q931API:
r = DecomposeJoyitApi(ptr, len);
break;
/*
case MOD_INTER: // Add 2005-10-26, by Wujianjin.
r = DecomposeInterApi(ptr, len);
break;
*/
case MOD_Q931:
r = DecomposeQ931Pdu(ptr, len);
break;
default:
break;
} // End of switch(mod)
return r;
}
char * CQ931Pdu::Output(UINT16& len)
{
char * pPdu = NULL;
len = 0;
switch (GetProtocolType( ))
{
case MOD_JOYIT:
case MOD_TUPAPI:
case MOD_ISUPAPI:
case MOD_Q931API:
pPdu = ComposeJoyitApi(len);
break;
/*
case MOD_INTER: // Add 2005-10-26, by Wujianjin.
pPdu = ComposeInterApi(len);
break;
*/
case MOD_Q931:
pPdu = ComposeQ931Pdu(len);
break;
default:
break;
} // End of switch(mod)
return pPdu;
}
// Return:
// >= 0 Success.
// -1 Protocol discriminator error, not equal 0x08.
// -2 Q931 message too short.
// -3 Invalid call reference, call reference high 4 bits not equal to zero.
// -4 Invalid call reference, length of call reference greater than two.
// -5 Invalid call reference, length of call reference not equel two.
// -6 Unrecognized message type.
// -7 Mandatory information element missing.
int CQ931Pdu::DecomposeQ931Pdu(char * ptr, UINT16 len)
{ // Modify 2005-10-28, by Wujianjin.
int r = 0;
char *pPdu = ptr;
UINT16 pos = 0; // Calculate the length of PDU.
SQ931MsgHead * qh = (SQ931MsgHead *)pPdu;
if (qh->ptlid != 0x08)
{ // PDU exeption.
Print("Not Q.931/I.451 user-network call control messages. (%d)", qh->ptlid);
return -1;
}
if (qh->spare1 != 0x00)
{ // PDU exeption.
Print("Call reference, bits 5 through 8 do not equal zero. (%d)", qh->spare1);
return -3;
}
// Determince length of call reference.
lengthOfCallReference = qh->len; // (pPdu[1] & 0x0F);
LengthOfHeader = lengthOfCallReference+3;
if (lengthOfCallReference > 2)
{
Print("The length of call reference greater than 2. (%d)", qh->len);
return -4;
}
else if (lengthOfCallReference != 2)
{
Print("The length of call reference do not equal two. (%d)", qh->len);
return -5;
}
// if (len >= sizeof(SQ931MsgHead))
if (len >= LengthOfHeader)
{
// Store the q931 message header.
// LengthOfHeader = sizeof(SQ931MsgHead);
// memcpy(Header, pPdu, sizeof(SQ931MsgHead));
memcpy(Header, pPdu, LengthOfHeader);
pPdu += LengthOfHeader;
pos += LengthOfHeader;
// Gain Q931 message type.
UINT16 mt = Header[LengthOfHeader-1];
SetMessageType(CQ931Pdu::ToJoyitMsg(mt));
if (0xFFFF == GetMessageType( ))
{
Print("Unrecognized message type.");
return -6;
}
// Get all IEs.
char isSendComplete = 0; // Are there '#' digit ? 0: Not exist; 1: Exist.
while (pos < len)
{
UINT8 ieId, ieLen, ieType;
char * pIedata;
ieId = *pPdu++;
if ((ieId & 0x80) == 0x80) // Modify 2005-10-31, by Wujianjin.
{ // Single octet IE.
char data;
UINT8 t = ieId;
switch (t)
{
case Q931_IE_MOREDATA:
case Q931_IE_SNDCMP:
ieType = CQ931Pdu::ToJoyitIe(t);
if (Q931_IE_SNDCMP == t)
{
isSendComplete = 1; // Got send complete IE.
}
data = 0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?