|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
line.h
Abstract:
Definitions for H.323 TAPI Service Provider line device.
Author: Nikhil Bobde (NikhilB)
Revision History:
--*/
#ifndef _LINE_H_
#define _LINE_H_
//
// Header files
//
#include "call.h"
extern H323_OCTETSTRING g_ProductID; extern H323_OCTETSTRING g_ProductVersion;
enum LINEOBJECT_STATE { LINEOBJECT_INITIALIZED = 0x00000001, LINEOBJECT_SHUTDOWN = 0x00000002,
};
//
// Line device GUID
//
DEFINE_GUID(LINE_H323, 0xe41e1898, 0x7292, 0x11d2, 0xba, 0xd6, 0x00, 0xc0, 0x4f, 0x8e, 0xf6, 0xe3);
//
// Line capabilities
//
#define H323_MAXADDRSPERLINE 1
#define H323_MAXCALLSPERADDR 32768
#define H323_LINE_ADDRESSMODES LINEADDRESSMODE_ADDRESSID
#define H323_LINE_ADDRESSTYPES (LINEADDRESSTYPE_DOMAINNAME | \
LINEADDRESSTYPE_IPADDRESS | \ LINEADDRESSTYPE_PHONENUMBER | \ LINEADDRESSTYPE_EMAILNAME) #define H323_LINE_BEARERMODES (LINEBEARERMODE_DATA | \
LINEBEARERMODE_VOICE) #define H323_LINE_DEFMEDIAMODES LINEMEDIAMODE_AUTOMATEDVOICE
#define H323_LINE_DEVCAPFLAGS (LINEDEVCAPFLAGS_CLOSEDROP | \
LINEDEVCAPFLAGS_MSP | \ LINEDEVCAPFLAGS_LOCAL ) #define H323_LINE_DEVSTATUSFLAGS (LINEDEVSTATUSFLAGS_CONNECTED | \
LINEDEVSTATUSFLAGS_INSERVICE) #define H323_LINE_MAXRATE 1048576 //1 mbps
#define H323_LINE_MEDIAMODES (H323_LINE_DEFMEDIAMODES | \
LINEMEDIAMODE_INTERACTIVEVOICE | \ LINEMEDIAMODE_VIDEO) #define H323_LINE_LINEFEATURES (LINEFEATURE_MAKECALL | \
LINEFEATURE_FORWARD | \ LINEFEATURE_FORWARDFWD )
//
// Type definitions
//
typedef enum _H323_LINESTATE { H323_LINESTATE_NONE = 0, //before call to LineOPen
H323_LINESTATE_OPENED, //after call to lineOpen
H323_LINESTATE_OPENING, H323_LINESTATE_CLOSING, H323_LINESTATE_LISTENING
} H323_LINESTATE, *PH323_LINESTATE;
typedef struct _TAPI_LINEREQUEST_DATA { DWORD EventID; HDRVCALL hdCall1; union { HDRVCALL hdCall2; DWORD dwDisconnectMode; }; WORD wCallReference;
} TAPI_LINEREQUEST_DATA;
typedef struct _CTCALLID_CONTEXT { int iCTCallIdentity; HDRVCALL hdCall;
}CTCALLID_CONTEXT, *PCTCALLID_CONTEXT;
typedef struct _MSPHANDLEENTRY {
struct _MSPHANDLEENTRY* next; HTAPIMSPLINE htMSPLine; HDRVMSPLINE hdMSPLine;
} MSPHANDLEENTRY;
typedef TSPTable<PCTCALLID_CONTEXT> CTCALLID_TABLE;
class CH323Line {
CRITICAL_SECTION m_CriticalSection; // synchronization object
H323_LINESTATE m_nState; // state of line object
DWORD m_dwTSPIVersion; // tapi selected version
DWORD m_dwMediaModes; // tapi selected media modes
H323_CALL_TABLE m_H323CallTable; // table of allocated calls
H323_VENDORINFO m_VendorInfo; DWORD m_dwDeviceID; // tapi line device id
WCHAR m_wszAddr[H323_MAXADDRNAMELEN+1]; // line address
HDRVLINE m_hdLine; // tspi line handle
DWORD m_dwInitState; HDRVMSPLINE m_hdNextMSPHandle; // bogus msp handle count
H323_CONF_TABLE m_H323ConfTable; // table of allocated calls
CALLFORWARDPARAMS* m_pCallForwardParams; DWORD m_dwInvokeID; CTCALLID_TABLE m_CTCallIDTable; MSPHANDLEENTRY* m_MSPHandleList; void ShutdownAllCalls(void); void ShutdownCTCallIDTable(); PH323_CALL CreateNewTransferedCall( IN PH323_ALIASNAMES pwszCalleeAddr );
public:
//public data members
BOOLEAN m_fForwardConsultInProgress; DWORD m_dwNumRingsNoAnswer; HTAPILINE m_htLine; // tapi line handle
//public functions
CH323Line(); BOOL Initialize( DWORD dwLineDeviceIDBase ); ~CH323Line(); void Shutdown(void); void RemoveFromCTCallIdentityTable( HDRVCALL hdCall ); HDRVCALL GetCallFromCTCallIdentity( int iCTCallID ); int GetCTCallIdentity( IN HDRVCALL hdCall ); void SetCallForwardParams( IN CALLFORWARDPARAMS* pCallForwardParams ); BOOL SetCallForwardParams( IN LPFORWARDADDRESS pForwardAddress ); PH323_CALL FindH323CallAndLock( IN HDRVCALL hdCall ); PH323_CALL FindCallByARQSeqNumAndLock( WORD seqNumber ); PH323_CALL FindCallByDRQSeqNumAndLock( WORD seqNumber ); PH323_CALL FindCallByCallRefAndLock( WORD wCallRef ); PH323_CALL Find2H323CallsAndLock( IN HDRVCALL hdCall1, IN HDRVCALL hdCall2, OUT PH323_CALL * ppCall2 ); BOOL AddMSPInstance( HTAPIMSPLINE htMSPLine, HDRVMSPLINE hdMSPLine ); BOOL IsValidMSPHandle( HDRVMSPLINE hdMSPLine, HTAPIMSPLINE* phtMSPLine ); BOOL DeleteMSPInstance( HTAPIMSPLINE* phtMSPLine, HDRVMSPLINE hdMSPLine ); LONG Close(); LONG CopyLineInfo(DWORD dwDeviceID, LPLINEADDRESSCAPS pAddressCaps ); void H323ReleaseCall( HDRVCALL hdCall, IN DWORD dwDisconnectMode, IN WORD wCallReference ); BOOL CallReferenceDuped(WORD wCallReference);
//supplementary services functionality
LONG CopyAddressForwardInfo( IN LPLINEADDRESSSTATUS lpAddressStatus ); PH323_ALIASITEM CallToBeDiverted( IN WCHAR* pwszCallerName, IN DWORD dwCallerNameSize, IN DWORD dwForwardMode ); void PlaceDivertedCall( IN HDRVCALL hdCall, IN PH323_ALIASNAMES pDivertedToAlias ); void PlaceTransferedCall(IN HDRVCALL hdCall, IN PH323_ALIASNAMES pTransferedToAlias); void SwapReplacementCall( HDRVCALL hdReplacementCall, HDRVCALL hdPrimaryCall, BOOL fChangeCallState );
H323_CONF_TABLE* GetH323ConfTable() { return &m_H323ConfTable; }
HDRVMSPLINE GetNextMSPHandle() { return ++m_hdNextMSPHandle; }
HDRVLINE GetHDLine() { return m_hdLine; } DWORD GetDeviceID() { return m_dwDeviceID; }
PH323_CALL GetCallAtIndex( int iIndex ) { return m_H323CallTable[iIndex]; } CALLFORWARDPARAMS* GetCallForwardParams() { return m_pCallForwardParams; } BOOL ForwardEnabledForAllOrigins(void) { return ( m_pCallForwardParams && (m_pCallForwardParams ->fForwardForAllOrigins == TRUE) && (m_pCallForwardParams ->fForwardingEnabled = TRUE) ); }
H323_VENDORINFO *GetVendorInfo() { return &m_VendorInfo; }
WCHAR * GetMachineName() { return m_wszAddr; }
//!!must be always called in a lock
WORD GetNextInvokeID() { return (WORD)InterlockedIncrement( (LONG*)&m_dwInvokeID ); }
BOOL IsValidAddressID( DWORD dwID ) { return (dwID == 0); } void Lock() { H323DBG(( DEBUG_LEVEL_VERBOSE, "H323 line waiting on lock." )); EnterCriticalSection( &m_CriticalSection ); H323DBG(( DEBUG_LEVEL_VERBOSE, "H323 line locked." )); }
void Unlock() { LeaveCriticalSection( &m_CriticalSection ); H323DBG(( DEBUG_LEVEL_VERBOSE, "H323 line unlocked." )); }
int GetNoOfCalls() { DWORD dwNumCalls;
LockCallTable(); dwNumCalls = m_H323CallTable.GetSize(); UnlockCallTable(); return dwNumCalls; }
//!!must be always called after locking the call table.
int GetCallTableSize() { return m_H323CallTable.GetAllocSize(); }
//!This function should not be called while holding a lock on a call object
//!When called from shutdown the calltable object is locked before the call object, so its OK.
void RemoveCallFromTable( HDRVCALL hdCall ) { m_H323CallTable.RemoveAt( LOWORD(hdCall) ); }
//!This function should not be called while holding a lock on a call object
int AddCallToTable( PH323_CALL pCall ) { return m_H323CallTable.Add( pCall ); } void DisableCallForwarding() { H323DBG(( DEBUG_LEVEL_TRACE, "DisableCallForwarding -Entered" ));
if( m_pCallForwardParams != NULL ) { FreeCallForwardParams( m_pCallForwardParams ); m_pCallForwardParams = NULL; }
H323DBG(( DEBUG_LEVEL_TRACE, "DisableCallForwarding -Exited" )); }
//!This function should not be called while holding a lock on a call object
void LockCallTable() { H323DBG(( DEBUG_LEVEL_TRACE, "Waiting on call table lock - %p.", m_H323CallTable )); m_H323CallTable.Lock();
H323DBG(( DEBUG_LEVEL_TRACE, "Call table locked - %p.", m_H323CallTable )); }
void UnlockCallTable() { m_H323CallTable.Unlock(); H323DBG(( DEBUG_LEVEL_TRACE, "Call table lock released - %p.", m_H323CallTable )); }
H323_LINESTATE GetState() { return m_nState; }
void SetState( H323_LINESTATE nState ) { m_nState = nState; }
DWORD GetMediaModes() { return m_dwMediaModes; }
void SetMediaModes( DWORD dwMediaModes ) { m_dwMediaModes = dwMediaModes; }
BOOL IsMediaDetectionEnabled() { return (m_dwMediaModes != 0) && (m_dwMediaModes != LINEMEDIAMODE_UNKNOWN); }
LONG Open ( IN DWORD DeviceID, IN HTAPILINE TapiLine, IN DWORD TspiVersion, OUT HDRVLINE * ReturnDriverLine);
};
//
// Address capabilities
//
#define H323_NUMRINGS_LO 4
#define H323_NUMRINGS_NOANSWER 8
#define H323_NUMRINGS_HI 12
#define H323_ADDR_ADDRESSSHARING LINEADDRESSSHARING_PRIVATE
#define H323_ADDR_ADDRFEATURES (LINEADDRFEATURE_MAKECALL | LINEADDRFEATURE_FORWARD)
#define H323_ADDR_CALLFEATURES (LINECALLFEATURE_ACCEPT | \
LINECALLFEATURE_ANSWER | \ LINECALLFEATURE_DROP | \ LINECALLFEATURE_RELEASEUSERUSERINFO | \ LINECALLFEATURE_SENDUSERUSER | \ LINECALLFEATURE_MONITORDIGITS | \ LINECALLFEATURE_GENERATEDIGITS) #define H323_ADDR_CALLINFOSTATES LINECALLINFOSTATE_MEDIAMODE
#define H323_ADDR_CALLPARTYIDFLAGS LINECALLPARTYID_NAME
#define H323_ADDR_CALLSTATES (H323_CALL_INBOUNDSTATES | \
H323_CALL_OUTBOUNDSTATES) #define H323_ADDR_CAPFLAGS (LINEADDRCAPFLAGS_DIALED | \
LINEADDRCAPFLAGS_ORIGOFFHOOK) /*LINEADDRCAPFLAGS_FWDCONSULT )*/ #define H323_ADDR_DISCONNECTMODES (LINEDISCONNECTMODE_BADADDRESS | \
LINEDISCONNECTMODE_BUSY | \ LINEDISCONNECTMODE_NOANSWER | \ LINEDISCONNECTMODE_NORMAL | \ LINEDISCONNECTMODE_REJECT | \ LINEDISCONNECTMODE_UNAVAIL)
extern CH323Line g_H323Line; #define g_pH323Line (&g_H323Line)
BOOL QueueTAPILineRequest( IN DWORD EventID, IN HDRVCALL hdCall1, IN HDRVCALL hdCall2, IN DWORD dwDisconnectMode, IN WORD wCallReference);
static DWORD ProcessTAPILineRequestFre( IN PVOID ContextParam );
#endif // _LINE_H_
|