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