|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
call.h
Abstract:
Definitions for H.323 TAPI Service Provider call objects.
Author: Nikhil Bobde (NikhilB)
Revision History:
--*/
#ifndef _INC_CALL
#define _INC_CALL
//
// Header files
//
#include "q931pdu.h"
#include "q931obj.h"
#define H323_CALL_FEATURES (LINECALLFEATURE_DROP | \
LINECALLFEATURE_SETUPTRANSFER | \ LINECALLFEATURE_COMPLETETRANSF | \ LINECALLFEATURE_DIAL | \ LINECALLFEATURE_HOLD | \ LINECALLFEATURE_ANSWER | \ LINECALLFEATURE_REDIRECT | \ LINECALLFEATURE_RELEASEUSERUSERINFO | \ LINECALLFEATURE_SENDUSERUSER | \ LINECALLFEATURE_UNHOLD | \ LINECALLFEATURE_GENERATEDIGITS | \ LINECALLFEATURE_MONITORDIGITS)
#define IsValidDTMFDigit(wDigit) ( \
((wDigit >= L'0') && (wDigit <= L'9')) || \ ((wDigit >= L'A') && (wDigit <= L'D')) || \ (wDigit == L'*') || \ (wDigit == L'#') || \ (wDigit == L'!') || \ (wDigit == L',') \ )
//
// Type definitions
//
struct EXPIRE_CONTEXT;
#define CHECKRESTRICTION_EXPIRE_TIME 15000
#define CALLREROUTING_EXPIRE_TIME 10000
#define CTIDENTIFY_SENT_TIMEOUT 30000
#define CTIDENTIFYRR_SENT_TIMEOUT 45000
#define CTINITIATE_SENT_TIMEOUT 60000
enum U2U_DIRECTION { U2U_OUTBOUND = 0x00000001, U2U_INBOUND = 0x00000002,
};
enum CALLOBJECT_STATE { CALLOBJECT_INITIALIZED = 0x00000001, CALLOBJECT_SHUTDOWN = 0x00000002, H245_START_MSG_SENT = 0x00000004, TSPI_CALL_LOCAL_HOLD = 0x00000008,
};
enum FAST_START_STATE {
FAST_START_UNDECIDED = 0x00000001, FAST_START_NOTAVAIL = 0x00000002, FAST_START_AVAIL = 0x00000004, FAST_START_SELF_AVAIL = 0x00000008, FAST_START_PEER_AVAIL = 0x000000010,
};
enum RASCALL_STATE {
RASCALL_STATE_IDLE = 0x00000001, RASCALL_STATE_ARQSENT = 0x00000002, RASCALL_STATE_ARQEXPIRED = 0x00000004, RASCALL_STATE_DRQSENT = 0x00000008, RASCALL_STATE_DRQEXPIRED = 0x000000010, RASCALL_STATE_REGISTERED = 0x000000020, RASCALL_STATE_UNREGISTERED = 0x000000040, RASCALL_STATE_ARJRECVD = 0x000000080,
};
enum H323_CALLTYPE { CALLTYPE_NORMAL = 0x00000000,
CALLTYPE_FORWARDCONSULT = 0x00000001, CALLTYPE_DIVERTEDDEST = 0x00000002, CALLTYPE_DIVERTEDSRC = 0x00000004, CALLTYPE_DIVERTEDSRC_NOROUTING = 0x00000008, CALLTYPE_DIVERTED_SERVED = 0x00000010,
CALLTYPE_TRANSFEREDSRC = 0x00000020, CALLTYPE_TRANSFERING_PRIMARY = 0x00000040, CALLTYPE_TRANSFERING_CONSULT = 0x00000080, CALLTYPE_TRANSFEREDDEST = 0x00000100, CALLTYPE_TRANSFERED_PRIMARY = 0x00000200, CALLTYPE_TRANSFERED2_CONSULT = 0x00000400, CALLTYPE_DIVERTEDTRANSFERED = 0x00000800,
};
enum SUPP_CALLSTATE { H4503_CALLSTATE_IDLE = 0x00000000, H4503_CHECKRESTRICTION_SENT = 0x00000001, H4503_DIVERSIONLEG1_SENT = 0x00000002, H4503_DIVERSIONLEG2_SENT = 0x00000004, H4503_DIVERSIONLEG3_SENT = 0x00000008, H4503_DIVERSIONLEG1_RECVD = 0x00000010, H4503_DIVERSIONLEG2_RECVD = 0x00000020, H4503_DIVERSIONLEG3_RECVD = 0x00000040, H4503_CALLREROUTING_SENT = 0x00000080, H4503_CALLREROUTING_RECVD = 0x00000100, H4503_CHECKRESTRICTION_RECV = 0x00000200, H4503_CHECKRESTRICTION_SUCC = 0x00000400, H4503_CALLREROUTING_RRSUCC = 0x00000800, H4502_CTINITIATE_SENT = 0x00001000, H4502_CTINITIATE_RECV = 0x00002000, H4502_CTSETUP_SENT = 0x00004000, H4502_CTSETUP_RECV = 0x00008000, H4502_CTIDENTIFY_SENT = 0x00010000, H4502_CTIDENTIFY_RECV = 0x00020000, H4502_CIIDENTIFY_RRSUCC = 0x00040000, H4502_CONSULTCALL_INITIATED = 0x00080000,
};
// CH323Call::m_dwQ931Flags
enum Q931_STATE { Q931_CALL_CONNECTING = 0x00010000, //connect has been issued on the socket
Q931_CALL_CONNECTED = 0x00100000, //FD_CONNECT received
Q931_CALL_DISCONNECTED = 0x01000000, //FD_CLOSE received from peer
};
enum TunnelingCap { REMOTE_H245_TUNNELING =0x01, LOCAL_H245_TUNNELING =0x10, };
// CH323Call::m_dwStateMachine
//Q931 state machine
enum Q931_CALL_STATE { Q931_CALL_STATE_NONE = 0,
//outbound
Q931_ORIGINATE_ADMISSION_PENDING, Q931_SETUP_SENT, Q931_ALERT_RECVD, Q931_PROCEED_RECVD, Q931_CONNECT_RECVD, Q931_RELEASE_RECVD,
//inbound
Q931_ANSWER_ADMISSION_PENDING, Q931_SETUP_RECVD, Q931_ALERT_SENT, Q931_PROCEED_SENT, Q931_CONNECT_SENT, Q931_RELEASE_SENT
};
typedef struct _TAPI_CALLREQUEST_DATA { DWORD EventID; PH323_CALL pCall; union { PVOID pCallforwardParams; PBUFFERDESCR pBuf; };
}TAPI_CALLREQUEST_DATA;
typedef struct _SUPP_REQUEST_DATA { DWORD EventID; HDRVCALL hdCall; union{ PH323_ALIASNAMES pAliasNames; HDRVCALL hdReplacementCall; CTIdentifyRes* pCTIdentifyRes; ULONG_PTR dwParam1; };
} SUPP_REQUEST_DATA;
typedef struct _MSPMessageData { HDRVCALL hdCall; TspMspMessageType messageType; BYTE* pbEncodedBuf; WORD wLength; HDRVCALL hReplacementCall;
}MSPMessageData;
enum { TSPI_NO_EVENT = 0,
TSPI_MAKE_CALL, TSPI_ANSWER_CALL, TSPI_DROP_CALL, TSPI_CLOSE_CALL, TSPI_RELEASE_U2U, TSPI_SEND_U2U, TSPI_COMPLETE_TRANSFER, TSPI_LINEFORWARD_SPECIFIC, TSPI_LINEFORWARD_NOSPECIFIC, TSPI_DIAL_TRNASFEREDCALL, TSPI_CALL_UNHOLD, TSPI_CALL_HOLD,
TSPI_DELETE_CALL, TSPI_CALL_DIVERT, H450_PLACE_DIVERTEDCALL, SWAP_REPLACEMENT_CALL, DROP_PRIMARY_CALL, STOP_CTIDENTIFYRR_TIMER, SEND_CTINITIATE_MESSAGE,
};
BOOL AddAliasItem( PH323_ALIASNAMES pAliasNames, BYTE* pbAliasName, DWORD dwAliasSize, WORD wType );
static __inline BOOL AddAliasItem ( IN H323_ALIASNAMES * AliasNames, IN LPWSTR AliasValue, IN WORD Type) { return AddAliasItem( AliasNames, (LPBYTE) AliasValue, (wcslen (AliasValue) + 1) * sizeof (TCHAR), Type ); }
typedef struct _UserToUserLE { LIST_ENTRY Link; DWORD dwU2USize; PBYTE pU2U;
} UserToUserLE, *PUserToUserLE;
typedef enum _FORWARDING_TYPE { CALLFORWARD_UNCOND = 1, CALLFORWARD_BUSY, CALLFORWARD_NA } FORWARDING_TYPE;
typedef struct _ForwardAddress { DWORD dwForwardType; H323_ALIASITEM callerAlias; SOCKADDR_IN saCallerAddr; H323_ALIASITEM divertedToAlias; //SOCKADDR_IN saDivertedToAddr;
struct _ForwardAddress* next;
} FORWARDADDRESS, *LPFORWARDADDRESS;
typedef struct _CallForwardParams { BOOLEAN fForwardingEnabled; //specifeis if forwarding is enabled for all calls irrespective of their origin
BOOLEAN fForwardForAllOrigins; DWORD dwForwardTypeForAllOrigins; //address to which all the calls are diverted
H323_ALIASITEM divertedToAlias; //SOCKADDR_IN saDivertedToAddr;
//this filed is NULL if fForwardForAllOrigins is TRUE
//list of addresses forwarded selectively
LPFORWARDADDRESS pForwardedAddresses;
}CALLFORWARDPARAMS, *PCALLFORWARDPARAMS;
struct CALLREROUTINGINFO { int diversionCounter; DiversionReason diversionReason; DiversionReason originalDiversionReason;
PH323_ALIASNAMES divertingNrAlias; PH323_ALIASNAMES originalCalledNr; PH323_ALIASNAMES divertedToNrAlias; PH323_ALIASNAMES diversionNrAlias; BOOLEAN fPresentAllow;
};
typedef struct tag_TspMspMessageWithEncodedBuf { TspMspMessage message; BYTE pEncodedASN[4095]; } TspMspMessageEx;
static __inline int MakeCallIndex ( IN HDRVCALL DriverHandleCall) { return (int) LOWORD (HandleToUlong (DriverHandleCall)); }
//
// Call capabilites
//
#define H323_CALL_INBOUNDSTATES (LINECALLSTATE_ACCEPTED | \
LINECALLSTATE_CONNECTED | \ LINECALLSTATE_DISCONNECTED | \ LINECALLSTATE_IDLE | \ LINECALLSTATE_OFFERING | \ LINECALLSTATE_RINGBACK | \ LINECALLSTATE_ONHOLD )
#define H323_CALL_OUTBOUNDSTATES (LINECALLSTATE_CONNECTED | \
LINECALLSTATE_DIALING | \ LINECALLSTATE_DISCONNECTED | \ LINECALLSTATE_IDLE | \ LINECALLSTATE_RINGBACK | \ LINECALLSTATE_ONHOLD )
//
// CH323Call class.
//
class CH323Call {
private:
HDRVCALL m_hdCall; // tspi call handle
DWORD m_dwFlags; CRITICAL_SECTION m_CriticalSection; H323_CONFERENCE* m_hdConf; // conf handle
DWORD m_dwCallState; // tspi call state
DWORD m_dwCallStateMode; // tspi call state mode
DWORD m_dwOrigin; // inbound or outbound
H323_OCTETSTRING m_CallData; // call data stored by the app for this call.
DWORD m_dwAddressType; // type of dst address
DWORD m_dwAppSpecific; DWORD m_dwIncomingModes; // available media modes
DWORD m_dwOutgoingModes; // available media modes
DWORD m_dwRequestedModes; // requested media modes
HDRVMSPLINE m_hdMSPLine; HTAPIMSPLINE m_htMSPLine;
LIST_ENTRY m_IncomingU2U; // incoming user user messages
LIST_ENTRY m_OutgoingU2U; // outgoing user user messages
GUID m_callIdentifier;
H323_ADDR m_CalleeAddr; // src address
H323_ADDR m_CallerAddr; // dst address
SOCKADDR_IN m_LocalAddr; // THIS END of the Q.931 connection
PH323_ALIASNAMES m_pCalleeAliasNames; // src alias
PH323_ALIASNAMES m_pCallerAliasNames; // dst alias
H323NonStandardData m_NonStandardData; GUID m_ConferenceID; PWSTR m_pwszDisplay; BOOLEAN m_fReadyToAnswer; BOOLEAN m_fCallAccepted;
//peer information
H323_ADDR m_peerH245Addr; H323_ADDR m_selfH245Addr; PWSTR m_pPeerDisplay; H323NonStandardData m_peerNonStandardData; PH323_ALIASNAMES m_pPeerExtraAliasNames; H323_VENDORINFO m_peerVendorInfo; H323_ENDPOINTTYPE m_peerEndPointType; PH323_FASTSTART m_pFastStart; PH323_FASTSTART m_pPeerFastStart; FAST_START_STATE m_dwFastStart;
//CQ931Call data objects
HANDLE m_hTransport;//event signalled by winsock for
//CONNECT| CLOSE event for incoming connections and
//CLOSE event for outgoing connections
SOCKET m_callSocket; HANDLE m_hTransportWait;//the event to unregister from thread pool
BOOLEAN m_bStartOfPDU; HANDLE m_hSetupSentTimer; Q931_CALL_STATE m_dwStateMachine; DWORD m_dwQ931Flags; BOOLEAN m_fActiveMC; ASN1_CODER_INFO m_ASNCoderInfo; WORD m_wCallReference; WORD m_wQ931CallRef; LIST_ENTRY m_sendBufList; DWORD m_IoRefCount; HANDLE m_hCallEstablishmentTimer; BOOLEAN m_fh245Tunneling;
//RAS call data
RASCALL_STATE m_dwRASCallState; WORD m_wARQSeqNum; WORD m_wDRQSeqNum; HANDLE m_hARQTimer; HANDLE m_hDRQTimer; DWORD m_dwDRQRetryCount; DWORD m_dwARQRetryCount; BUFFERDESCR m_prepareToAnswerMsgData; EXPIRE_CONTEXT* m_pARQExpireContext; EXPIRE_CONTEXT* m_pDRQExpireContext;
//data related to supplementary services
DWORD m_dwCallType; SUPP_CALLSTATE m_dwCallDiversionState; ASN1_CODER_INFO m_H450ASNCoderInfo; DWORD m_dwInvokeID; BOOLEAN m_fCallInTrnasition;
//data related to call forwarding
CALLREROUTINGINFO* m_pCallReroutingInfo; HANDLE m_hCheckRestrictionTimer; HANDLE m_hCallReroutingTimer; HANDLE m_hCallDivertOnNATimer;
//forwardconsult params
CALLFORWARDPARAMS* m_pCallForwardParams; LPFORWARDADDRESS m_pForwardAddress;
//data related to call transfer
HANDLE m_hCTIdentifyTimer; HANDLE m_hCTIdentifyRRTimer; HANDLE m_hCTInitiateTimer; BYTE m_pCTCallIdentity[5]; PH323_ALIASNAMES m_pTransferedToAlias; HDRVCALL m_hdRelatedCall;
//data related to call Hold/Unhold
BOOLEAN m_fRemoteHoldInitiated; BOOLEAN m_fRemoteRetrieveInitiated;
//Call Object functionality
BOOL SendProceeding(void); void CopyU2UAsNonStandard( DWORD dwDirection ); BOOL AddU2UNoAlloc( IN DWORD dwDirection, IN DWORD dwDataSize, IN PBYTE pData ); BOOL RemoveU2U( DWORD dwDirection, PUserToUserLE * ppU2ULE ); BOOL FreeU2U( DWORD dwDirection ); BOOL ResolveCallerAddress(); BOOL ResolveE164Address( LPCWSTR pwszDialableAddr ); BOOL ResolveIPAddress( LPSTR pszDialableAddr ); BOOL ResolveEmailAddress( LPCWSTR pwszDialableAddr, PSTR pszUser, LPSTR pszDomain); BOOL PlaceCall(); BOOL HandleConnectMessage( Q931_CONNECT_ASN *pConnectASN ); void HandleAlertingMessage( Q931_ALERTING_ASN * pAlertingASN ); void HandleProceedingMessage( Q931_ALERTING_ASN * pProceedingAS ); BOOL HandleReleaseMessage( Q931_RELEASE_COMPLETE_ASN *pReleaseASN ); BOOL InitializeIncomingCall( IN Q931_SETUP_ASN* pSetupASN, IN DWORD dwCallType, IN WORD wCallRef ); BOOL SetupCall(); void SetNonStandardData( H323_UserInformation & UserInfo ); BOOL SendQ931Message( DWORD dwInvokeID, ULONG_PTR dwParam1, ULONG_PTR dwParam2, DWORD dwMessageType, DWORD APDUType ); BOOL OnReceiveAlerting( Q931MESSAGE* pMessage ); BOOL OnReceiveProceeding( Q931MESSAGE* pMessage ); BOOL OnReceiveFacility( Q931MESSAGE* pMessage ); BOOL OnReceiveRelease( Q931MESSAGE* pMessage ); BOOL OnReceiveConnect( Q931MESSAGE* pMessage ); BOOL OnReceiveSetup( Q931MESSAGE* pMessage ); BOOL EncodeConnectMessage( DWORD dwInvokeID, BYTE **ppEncodedBuf, WORD *pdwEncodedLength, DWORD dwAPDUType ); BOOL EncodeReleaseCompleteMessage( DWORD dwInvokeID, BYTE *pbReason, BYTE **ppEncodedBuf, WORD *pdwEncodedLength, DWORD dwAPDUType ); BOOL EncodeProceedingMessage( DWORD dwInvokeID, BYTE **ppEncodedBuf, WORD *pdwEncodedLength, IN DWORD dwAPDUType ); BOOL EncodeAlertMessage( DWORD dwInvokeID, BYTE **ppEncodedBuf, WORD *pdwEncodedLength, IN DWORD dwAPDUType ); BOOL EncodeFacilityMessage( IN DWORD dwInvokeID, IN BYTE bReason, IN ASN1octetstring_t* pH245PDU, OUT BYTE **ppEncodedBuf, OUT WORD *pdwEncodedLength, IN DWORD dwAPDUType ); BOOL EncodeSetupMessage( DWORD dwInvokeID, WORD wGoal, WORD wCallType, BYTE **ppEncodedBuf, WORD *pdwEncodedLength, IN DWORD dwAPDUType ); BOOL EncodeMessage( PQ931MESSAGE pMessage, BYTE **pbCodedBuffer, DWORD *pdwCodedBufferLength, DWORD dwMessageLength); void WriteQ931Fields( PBUFFERDESCR pBuf, PQ931MESSAGE pMessage, DWORD * pdwPDULength ); BOOL EncodeH450APDU( DWORD dwInvokeID, IN DWORD dwAPDUType, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); void RecvBuffer( BOOL *fDelete ); void ReadEvent( DWORD cbTransfer ); BOOL ProcessQ931PDU( CALL_RECV_CONTEXT* pRecvBuf ); void OnConnectComplete(); BOOL SendBuffer( BYTE* pbBuffer, DWORD dwLength ); BOOL AcceptH323Call(); BOOL GetPeerAddress( H323_ADDR *pAddr); BOOL GetHostAddress( H323_ADDR *pAddr ); BOOL EncodePDU( BINARY_STRING *pUserUserData, BYTE ** ppbCodedBuffer, DWORD * pdwCodedBufferLength, DWORD dwMessageType, WCHAR* pszCalledPartyNumber ); int EncodeASN( void *pStruct, int nPDU, BYTE **ppEncoded, WORD *pcbEncodedSize ); int EncodeH450ASN( void *pStruct, int nPDU, BYTE **ppEncoded, WORD *pcbEncodedSize ); BOOL ParseSetupASN( BYTE *pEncodedBuf, DWORD dwEncodedLength, Q931_SETUP_ASN *pSetupASN, OUT DWORD* pdwH450APDUType ); BOOL ParseReleaseCompleteASN( BYTE *pEncodedBuf, DWORD dwEncodedLength, Q931_RELEASE_COMPLETE_ASN *pReleaseASN, DWORD* pdwH450APDUType ); BOOL ParseConnectASN( BYTE *pEncodedBuf, DWORD dwEncodedLength, Q931_CONNECT_ASN *pConnectASN, DWORD* pdwH450APDUType ); BOOL ParseAlertingASN( BYTE *pEncodedBuf, DWORD dwEncodedLength, Q931_ALERTING_ASN *pAlertingASN, DWORD* pdwH450APDUType ); BOOL ParseProceedingASN( BYTE *pEncodedBuf, DWORD dwEncodedLength, Q931_CALL_PROCEEDING_ASN *pProceedingASN, DWORD* pdwH450APDUType ); BOOL ParseFacilityASN( IN BYTE * pEncodedBuf, IN DWORD dwEncodedLength, OUT Q931_FACILITY_ASN * pFacilityASN ); int DecodeASN( void **ppStruct, int nPDU, BYTE *pEncoded, DWORD cbEncodedSize ); int InitASNCoder(); int TermASNCoder(); int InitH450ASNCoder(); int TermH450ASNCoder(); BOOL SendSetupMessage(); HRESULT Q931ParseMessage( BYTE *CodedBufferPtr, DWORD CodedBufferLength, PQ931MESSAGE Message ); BOOL HandleSetupMessage( IN Q931MESSAGE* pMessage );
//GK RAS functions
BOOL SendDCF( WORD seqNumber ); BOOL SendARQ( long seqNumber ); BOOL SendDRQ( IN USHORT usDisengageReason, long seqNumber, BOOL fResendOnExpire );
//supplementary services functions
void FreeCallForwardData(); void HandleFacilityMessage( IN DWORD dwInvokeID, IN Q931_FACILITY_ASN * pFacilityASN ); void FreeCallReroutingInfo(void); BOOL InitiateCallDiversion( IN PH323_ALIASITEM pwszDivertedToAlias, IN DiversionReason eDiversionMode ); BOOL EncodeDivertingLeg3APDU( OUT H4501SupplementaryService *pSupplementaryServiceAPDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeCallReroutingAPDU( OUT H4501SupplementaryService *pSupplementaryServiceAPDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeDivertingLeg2APDU( OUT H4501SupplementaryService *pSupplementaryServiceAPDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeCheckRestrictionAPDU( OUT H4501SupplementaryService *pSupplementaryServiceAPDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeDummyReturnResultAPDU( IN DWORD dwInvokeID, IN DWORD dwOpCode, IN H4501SupplementaryService *pH450APDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeReturnErrorAPDU( IN DWORD dwInvokeID, IN DWORD dwErrorCode,IN H4501SupplementaryService *pH450APDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeRejectAPDU( IN H4501SupplementaryService* SupplementaryServiceAPDU, IN DWORD dwInvokeID, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL HandleCallRerouting( IN BYTE * pEncodeArg,IN DWORD dwEncodedArgLen ); BOOL HandleDiversionLegInfo3( IN BYTE * pEncodeArg,IN DWORD dwEncodedArgLen ); BOOL HandleDiversionLegInfo2(IN BYTE * pEncodeArg,IN DWORD dwEncodedArgLen ); BOOL HandleDiversionLegInfo1(IN BYTE * pEncodeArg,IN DWORD dwEncodedArgLen ); BOOL HandleCheckRestriction( IN BYTE * pEncodeArg,IN DWORD dwEncodedArgLen, IN Q931_SETUP_ASN* pSetupASN ); BOOL HandleReturnResultDummyType( H4501SupplementaryService * pH450APDUStruct ); BOOL HandleReject( IN H4501SupplementaryService * pH450APDUStruct ); BOOL HandleReturnError( IN H4501SupplementaryService * pH450APDUStruct ); BOOL HandleH450APDU( IN PH323_UU_PDU_h4501SupplementaryService pH450APDU, IN DWORD* pdwH450APDUType, DWORD* pdwInvokeID, IN Q931_SETUP_ASN* pSetupASN ); int DecodeH450ASN( OUT void ** ppStruct, IN int nPDU, IN BYTE * pEncoded, IN DWORD cbEncodedSize ); BOOL ResolveToIPAddress( IN WCHAR* pwszAddr, IN SOCKADDR_IN* psaAddr ); void DropSupplementaryServicesCalls(); BOOL IsValidInvokeID( DWORD dwInvokeId ); void OnCallReroutingReceive( IN DWORD dwInvokeID ); BOOL StartTimerForCallDiversionOnNA( IN PH323_ALIASITEM pwszDivertedToAlias ); BOOL HandleCTIdentifyReturnResult( IN BYTE * pEncodeArg, IN DWORD dwEncodedArgLen ); BOOL HandleCTInitiate( IN BYTE * pEncodeArg, IN DWORD dwEncodedArgLen ); BOOL HandleCTSetup( IN BYTE * pEncodeArg, IN DWORD dwEncodedArgLen ); BOOL EncodeH450APDUNoArgument( IN DWORD dwOpcode, OUT H4501SupplementaryService *pSupplementaryServiceAPDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeCTInitiateAPDU( OUT H4501SupplementaryService *pSupplementaryServiceAPDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeCTSetupAPDU( OUT H4501SupplementaryService *pSupplementaryServiceAPDU, OUT BYTE** ppEncodedAPDU, OUT DWORD* pdwAPDULen ); BOOL EncodeCTIdentifyReturnResult( ServiceApdus_rosApdus *pROSAPDU ); BOOL HandleCTIdentify( IN DWORD dwInvokeID ); BOOL EncodeFastStartProposal( PH323_FASTSTART pFastStart, BYTE** ppEncodedBuf, WORD* pwEncodedLength ); BOOL EnableCallForwarding(); BOOL EncodeDummyResult( OUT ServiceApdus_rosApdus *pROSAPDU ); void FreeCallReroutingArg( CallReroutingArgument* pCallReroutingArg ); BOOL HandleCallDiversionFacility( PH323_ADDR pAlternateAddress ); BOOL HandleCallDiversionFacility( PH323_ALIASNAMES pAliasList ); BOOL HandleTransferFacility( PH323_ADDR pAlternateAddress ); BOOL HandleTransferFacility( PH323_ALIASNAMES pAliasList );
public:
BOOLEAN m_fMonitoringDigits; // listening for dtmf flag
HTAPICALL m_htCall; // tapi call handle
CALL_RECV_CONTEXT m_RecvBuf;
BOOL IsEqualConferenceID( GUID* pConferenceID ) { return IsEqualGUID (m_ConferenceID, *pConferenceID); }
INT GetCallIndex (void) const { return MakeCallIndex (m_hdCall); }
void SetAppSpecific( DWORD dwAppSpecific ) { m_dwAppSpecific = dwAppSpecific; PostLineEvent( LINE_CALLINFO, LINECALLINFOSTATE_APPSPECIFIC, 0, 0 ); }
BOOL SetCallData( LPVOID lpCallData, DWORD dwSize );
void SetCallDiversionState( IN SUPP_CALLSTATE dwCallDiversionState ) { m_dwCallDiversionState = dwCallDiversionState; }
SUPP_CALLSTATE GetCallDiversionState(void) { return m_dwCallDiversionState; }
void SetAddressType( DWORD dwAddressType ) { m_dwAddressType = dwAddressType; } inline BOOL IsCallOnHold() { return ( m_dwCallState == LINECALLSTATE_ONHOLD ); }
inline BOOL IsCallOnLocalHold() { return ((m_dwCallState == LINECALLSTATE_ONHOLD) && (m_dwFlags & TSPI_CALL_LOCAL_HOLD) ); }
void SetCallState( DWORD dwCallState ) { m_dwCallState = dwCallState; }
void Lock() { H323DBG(( DEBUG_LEVEL_VERBOSE, "H323 call:%p waiting on lock.", this )); EnterCriticalSection( &m_CriticalSection ); H323DBG(( DEBUG_LEVEL_VERBOSE, "H323 call:%p locked.", this )); }
PWSTR GetDialableAddress() { _ASSERTE( m_dwOrigin == LINECALLORIGIN_OUTBOUND ); _ASSERTE( m_pCalleeAliasNames ); return m_pCalleeAliasNames->pItems[0].pData; }
PH323_ADDR GetPeerH245Addr() { return &m_peerH245Addr; }
PH323_FASTSTART GetPeerFastStart() { return m_pPeerFastStart; }
WCHAR* GetTransferedToAddress() { return m_pTransferedToAlias->pItems[0].pData; } void Unlock() { LeaveCriticalSection(&m_CriticalSection ); H323DBG(( DEBUG_LEVEL_VERBOSE, "H323 call:%p unlocked.", this )); } //!!must be always called in a lock
BOOL IsCallShutdown() { return (m_dwFlags & CALLOBJECT_SHUTDOWN); }
HDRVCALL GetCallHandle() { return m_hdCall; }
WORD GetARQSeqNumber() { return m_wARQSeqNum; }
WORD GetDRQSeqNumber() { return m_wDRQSeqNum; }
WORD GetCallRef() { return m_wCallReference; }
DWORD GetCallState() { return m_dwCallState; }
DWORD GetStateMachine() { return m_dwStateMachine; }
//!!must be always called in a lock
void SetCallType( DWORD dwCallType ) { m_dwCallType |= dwCallType; }
//!!must be always called in a lock
BOOL SetCalleeAlias( IN WCHAR* pwszDialableAddr, IN WORD wType ) { return AddAliasItem( m_pCalleeAliasNames, pwszDialableAddr, wType ); }
BOOL SetCallerAlias( IN WCHAR* pwszDialableAddr, IN WORD wType ) { H323DBG(( DEBUG_LEVEL_ERROR, "Caller alias count:%d : %p", m_pCallerAliasNames->wCount, this ));
BOOL retVal = AddAliasItem( m_pCallerAliasNames, pwszDialableAddr, wType );
H323DBG(( DEBUG_LEVEL_ERROR, "Caller alias count:%d : %p", m_pCallerAliasNames->wCount, this ));
return retVal; }
void InitializeRecvBuf(); CH323Call(); ~CH323Call();
BOOL HandleProceedWithAnswer( IN PTspMspMessage pMessage ); void CompleteTransfer( PH323_CALL pConsultCall ); BOOL AddU2U( DWORD dwDirection, DWORD dwDataSize, PBYTE pData ); LONG SetDivertedToAlias( WCHAR* pwszDivertedToAddr, WORD wAliasType ); BOOL ResolveAddress( LPCWSTR pwszDialableAddr ); PH323_CONFERENCE CreateConference( GUID* pConferenceId ); BOOL DropCall( DWORD dwDisconnectMode ); LONG CopyCallInfo( LPLINECALLINFO pCallInfo ); void CopyCallStatus( LPLINECALLSTATUS pCallStatus ); BOOL ChangeCallState( DWORD dwCallState, DWORD dwCallStateMode ); void AcceptCall(); BOOL HandleMSPMessage( PTspMspMessage pMessage, HDRVMSPLINE hdMSPLine, HTAPIMSPLINE htMSPLine ); void SendMSPMessage( IN TspMspMessageType messageType, IN BYTE* pbEncodedBuf, IN DWORD dwLength, IN HDRVCALL hReplacementCall ); void SendMSPStartH245( PH323_ADDR pPeerH245Addr, PH323_FASTSTART pPeerFastStart ); BOOL HandleReadyToInitiate( PTspMspMessage pMessage ); void WriteComplete( BOOL* fDelete ); BOOL HandleReadyToAnswer( PTspMspMessage pMessage ); void ReleaseU2U(); void SendU2U( BYTE* pUserUserInfo, DWORD dwSize ); void OnRequestInProgress( IN RequestInProgress* RIP ); BOOL QueueTAPICallRequest( IN DWORD EventID, IN PVOID pBuf ); void SetNewCallInfo( HANDLE hConnWait, HANDLE hWSAEvent, DWORD dwState ); void SetQ931CallState( DWORD dwState ); BOOL InitializeQ931( SOCKET callSocket ); void HandleTransportEvent(); void SetupSentTimerExpired(); BOOL PostReadBuffer(); void CloseCall( IN DWORD dwDisconnectMOde ); BOOL ValidateCallParams( LPLINECALLPARAMS pCallParams, LPCWSTR pwszDialableAddr, PDWORD pdwStatus ); BOOL Initialize( HTAPICALL htCall, DWORD dwOrigin, DWORD dwCallType ); void Shutdown( BOOL* fDelete ); static void NTAPI SetupSentTimerCallback( PVOID dwParam1, BOOLEAN bTimer );
//GK RAS functions
void OnDisengageReject(IN DisengageReject* DRJ); void OnDisengageConfirm(IN DisengageConfirm* DCF); void OnAdmissionConfirm( IN AdmissionConfirm * ACF ); void OnAdmissionReject( IN AdmissionReject *ARJ ); static void NTAPI DRQExpiredCallback( PVOID dwParam1, BOOLEAN bTimer ); static void NTAPI ARQExpiredCallback( PVOID dwParam1, BOOLEAN bTimer ); static void NTAPI CallEstablishmentExpiredCallback( PVOID dwParam1, BOOLEAN bTimer ); void ARQExpired( WORD seqNumber ); void DRQExpired( WORD seqNumber ); void OnDisengageRequest( DisengageRequest * DRQ );
//supplementary services functions
void Forward( DWORD event, PVOID dwParam1 ); LONG ValidateForwardParams( IN LPLINEFORWARDLIST lpLineForwardList, OUT PVOID* ppForwardParams, OUT DWORD* pEvent );
static void NTAPI CheckRestrictionTimerCallback( IN PVOID dwParam1, IN BOOLEAN bTimer ); static void NTAPI CallReroutingTimerCallback( IN PVOID dwParam1, IN BOOLEAN bTimer ); static void NTAPI CTIdentifyExpiredCallback( IN PVOID dwParam1, IN BOOLEAN bTimer ); static void NTAPI CTInitiateExpiredCallback( IN PVOID dwParam1, IN BOOLEAN bTimer ); void SetDivertedCallInfo( HDRVCALL hdCall, CALLREROUTINGINFO* pCallReroutingInfo, SUPP_CALLSTATE dwCallDiversionState, HDRVMSPLINE hdMSPLine, PH323_ALIASNAMES pCallerAliasNames, HTAPIMSPLINE htMSPLine, PH323_FASTSTART pFastStart, HDRVCALL hdRelatedCall, DWORD dwCallType, DWORD dwAppSpecific, PH323_OCTETSTRING pCallData );
PH323_CALL CreateNewDivertedCall( IN PH323_ALIASNAMES pwszCalleeAddr ); void TransferInfoToDivertedCall( IN PH323_CALL pDivertedCall ); BOOL TransferInfoToTransferedCall( IN PH323_CALL pTransferedCall ); BOOL SetTransferedCallInfo( HDRVCALL hdCall, PH323_ALIASNAMES pCallerAliasNames, BYTE * pCTCallIdentity ); void TransferInfoToReplacementCall( PH323_CALL pReplacementCall ); void DialCall(); void MakeCall(); void DropUserInitiated( IN DWORD dwDisconnectMode );
void CallDivertOnNoAnswer(); static void NTAPI CallDivertOnNACallback( IN PVOID dwParam1, IN BOOLEAN bTimer );
void SetReplacementCallInfo( HDRVCALL hdCall, HDRVMSPLINE hdMSPLine, HTAPICALL htCall, HTAPIMSPLINE htMSPLine, DWORD dwAppSpecific, PH323_OCTETSTRING pCallData );
BOOL SendCTInitiateMessagee( IN CTIdentifyRes * pCTIdentifyRes ); LONG InitiateBlindTransfer( IN LPCWSTR lpszDestAddress ); void CTIdentifyExpired(); void CTIdentifyRRExpired(); static void NTAPI CTIdentifyRRExpiredCallback( IN PVOID dwParam1, IN BOOLEAN bTimer ); void CTInitiateExpired(); BOOL InitiateCallReplacement( PH323_FASTSTART pFastStart, PH323_ADDR pH245Addr ); void Hold(); void UnHold(); HRESULT GetCallInfo( OUT GUID* ReturnCallID, OUT GUID *ReturnConferenceID );
void DecrementIoRefCount( BOOL * pfDelete ); void StopCTIdentifyRRTimer( HDRVCALL hdRelatedCall ); void PostLineEvent( IN DWORD MessageID, IN DWORD_PTR Parameter1, IN DWORD_PTR Parameter2, IN DWORD_PTR Parameter3 );
void OnReadComplete( IN DWORD dwStatus, IN CALL_RECV_CONTEXT *pRecvContext ); void OnWriteComplete( IN DWORD dwStatus, IN CALL_SEND_CONTEXT * pSendContext ); static void NTAPI IoCompletionCallback( IN DWORD dwStatus, IN DWORD dwBytesTransferred, IN OVERLAPPED * pOverlapped );
};
class H323_CONFERENCE { private: ULONG_PTR m_hdConference; PH323_CALL m_pCall;
public:
H323_CONFERENCE( PH323_CALL pCall ) { m_hdConference = (ULONG_PTR) this; m_pCall = pCall; } };
void FreeCallForwardParams( IN PCALLFORWARDPARAMS pCallForwardParams ); void FreeForwardAddress( IN LPFORWARDADDRESS pForwardAddress );
typedef TSPTable<PH323_CALL> H323_CALL_TABLE; typedef CTSPArray<H323_CONFERENCE*> H323_CONF_TABLE;
#define IsTransferredCall( dwCallType ) ( (dwCallType & CALLTYPE_TRANSFEREDSRC) || (dwCallType & CALLTYPE_TRANSFERED_PRIMARY) )
//
// TSPI procedures
//
LONG TSPIAPI TSPI_lineAnswer( DRV_REQUESTID dwRequestID, HDRVCALL hdCall, LPCSTR pUserUserInfo, DWORD dwSize ); LONG TSPIAPI TSPI_lineCloseCall( HDRVCALL hdCall ); LONG TSPIAPI TSPI_lineDrop( DRV_REQUESTID dwRequestID, HDRVCALL hdCall, LPCSTR pUserUserInfo, DWORD dwSize ); LONG TSPIAPI TSPI_lineGetCallAddressID( HDRVCALL hdCall, LPDWORD pdwAddressID );
LONG TSPIAPI TSPI_lineGetCallInfo( HDRVCALL hdCall, LPLINECALLINFO pCallInfo );
LONG TSPIAPI TSPI_lineGetCallStatus( HDRVCALL hdCall, LPLINECALLSTATUS pCallStatus );
LONG TSPIAPI TSPI_lineMakeCall( DRV_REQUESTID dwRequestID, HDRVLINE hdLine, HTAPICALL htCall, LPHDRVCALL phdCall, LPCWSTR pwszDialableAddr, DWORD dwCountryCode, LPLINECALLPARAMS const pCallParams ); LONG TSPIAPI TSPI_lineReleaseUserUserInfo( DRV_REQUESTID dwRequestID, HDRVCALL hdCall );
LONG TSPIAPI TSPI_lineSendUserUserInfo( DRV_REQUESTID dwRequestID, HDRVCALL hdCall, LPCSTR pUserUserInfo, DWORD dwSize ); LONG TSPIAPI TSPI_lineMonitorDigits( HDRVCALL hdCall, DWORD dwDigitModes );
LONG TSPIAPI TSPI_lineGenerateDigits( HDRVCALL hdCall, DWORD dwEndToEndID, DWORD dwDigitMode, LPCWSTR pwszDigits, DWORD dwDuration );
BOOL IsPhoneNumber( char * szAddr );
// called by Q.931 listener when a new connection is received
void CallProcessIncomingCall ( IN SOCKET Socket, IN SOCKADDR_IN * LocalAddress, IN SOCKADDR_IN * RemoteAddress);
void NTAPI Q931TransportEventHandler ( IN PVOID Parameter, IN BOOLEAN TimerFired);
BOOL IsValidE164String( IN WCHAR* wszDigits );
DWORD ValidateE164Address( LPCWSTR pwszDialableAddr, WCHAR* wszAddr );
BOOL QueueSuppServiceWorkItem( IN DWORD EventID, IN HDRVCALL hdCall, IN ULONG_PTR dwParam1 ); #if 0
BOOL CH323Call::QueueTAPICallRequest( IN DWORD EventID, IN PVOID pBuf ); #endif
DWORD ProcessSuppServiceWorkItemFre( IN PVOID ContextParameter );
DWORD SendMSPMessageOnRelatedCallFre( IN PVOID ContextParameter );
DWORD ProcessTAPICallRequestFre( IN PVOID ContextParameter );
#endif // _INC_CALL
|