/*++ Copyright (c) 1997 Microsoft Corporation Module Name: line.h Abstract: Definitions for H.323 TAPI Service Provider line device. Environment: User Mode - Win32 Revision History: --*/ #ifndef _INC_LINE #define _INC_LINE /////////////////////////////////////////////////////////////////////////////// // // // Header files // // // /////////////////////////////////////////////////////////////////////////////// #include "call.h" /////////////////////////////////////////////////////////////////////////////// // // // Line device GUID // // // /////////////////////////////////////////////////////////////////////////////// DEFINE_GUID(LINE_H323, 0xe41e1898, 0x7292, 0x11d2, 0xba, 0xd6, 0x00, 0xc0, 0x4f, 0x8e, 0xf6, 0xe3); /////////////////////////////////////////////////////////////////////////////// // // // Type definitions // // // /////////////////////////////////////////////////////////////////////////////// typedef enum _H323_LINESTATE { H323_LINESTATE_ALLOCATED = 0, H323_LINESTATE_WAITING_FOR_ID, H323_LINESTATE_CLOSED, H323_LINESTATE_OPENED, H323_LINESTATE_CLOSING, H323_LINESTATE_LISTENING } H323_LINESTATE, *PH323_LINESTATE; typedef struct _H323_LINE { CRITICAL_SECTION Lock; // synchronization object H323_LINESTATE nState; // state of line object BOOL fIsMarkedForDeletion; // additional state // DWORD dwIPAddr; // network interface ip address // DWORD dwIPPort; // network interface ip port DWORD dwNextPort; // next rtp/rtcp port HDRVLINE hdLine; // tspi line handle HTAPILINE htLine; // tapi line handle DWORD dwDeviceID; // tapi line device id DWORD dwTSPIVersion; // tapi selected version DWORD dwMediaModes; // tapi selected media modes DWORD dwNextMSPHandle; // bogus msp handle count CC_HLISTEN hccListen; // intelcc listen handle PH323_CALL_TABLE pCallTable; // table of allocated calls WCHAR wszAddr[H323_MAXADDRNAMELEN+1]; // line address } H323_LINE, *PH323_LINE; typedef struct _H323_LINE_TABLE { DWORD dwNumSlots; // number of entries DWORD dwNumInUse; // number of entries in use DWORD dwNumAllocated; // number of entries allocated DWORD dwNextAvailable; // next available table index PH323_LINE pLines[ANYSIZE]; // array of object pointers } H323_LINE_TABLE, *PH323_LINE_TABLE; /////////////////////////////////////////////////////////////////////////////// // // // Global variables // // // /////////////////////////////////////////////////////////////////////////////// extern PH323_LINE_TABLE g_pLineTable; /////////////////////////////////////////////////////////////////////////////// // // // Line capabilities // // // /////////////////////////////////////////////////////////////////////////////// #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) #define H323_LINE_DEVSTATUSFLAGS (LINEDEVSTATUSFLAGS_CONNECTED | \ LINEDEVSTATUSFLAGS_INSERVICE) #define H323_LINE_MAXRATE 1048576 #define H323_LINE_MEDIAMODES (H323_LINE_DEFMEDIAMODES | \ LINEMEDIAMODE_INTERACTIVEVOICE | \ LINEMEDIAMODE_VIDEO) #define H323_LINE_LINEFEATURES LINEFEATURE_MAKECALL /////////////////////////////////////////////////////////////////////////////// // // // Address capabilities // // // /////////////////////////////////////////////////////////////////////////////// #define H323_ADDR_ADDRESSSHARING LINEADDRESSSHARING_PRIVATE #define H323_ADDR_ADDRFEATURES LINEADDRFEATURE_MAKECALL #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_CALLERIDFLAGS (LINECALLPARTYID_NAME | \ LINECALLPARTYID_ADDRESS) #define H323_ADDR_CALLEDIDFLAGS LINECALLPARTYID_NAME #define H323_ADDR_CALLSTATES (H323_CALL_INBOUNDSTATES | \ H323_CALL_OUTBOUNDSTATES) #define H323_ADDR_CAPFLAGS (LINEADDRCAPFLAGS_DIALED | \ LINEADDRCAPFLAGS_ORIGOFFHOOK) #define H323_ADDR_DISCONNECTMODES (LINEDISCONNECTMODE_BADADDRESS | \ LINEDISCONNECTMODE_BUSY | \ LINEDISCONNECTMODE_NOANSWER | \ LINEDISCONNECTMODE_NORMAL | \ LINEDISCONNECTMODE_REJECT | \ LINEDISCONNECTMODE_UNAVAIL) /////////////////////////////////////////////////////////////////////////////// // // // Macros // // // /////////////////////////////////////////////////////////////////////////////// #define H323IsLineAllocated(_pLine_) \ ((_pLine_) != NULL) #define H323IsLineInUse(_pLine_) \ (H323IsLineAllocated(_pLine_) && \ ((_pLine_)->nState > H323_LINESTATE_ALLOCATED)) #define H323IsLineEqual(_pLine_,_hdLine_) \ (H323IsLineInUse(_pLine_) && \ ((_pLine_)->hdLine == (_hdLine_))) #define H323IsLineEqualIP(_pLine_,_dwIPAddr_) \ (H323IsLineInUse(_pLine_) && \ ((_pLine_)->dwIPAddr == (_dwIPAddr_))) #define H323IsLineClosed(_pLine_) \ ((_pLine_)->nState == H323_LINESTATE_CLOSED) #define H323IsLineOpen(_pLine_) \ ((_pLine_)->nState >= H323_LINESTATE_OPENED) #define H323IsLineAvailable(_pLine_) \ ((_pLine_)->pCallTable->dwNumInUse < H323_MAXCALLSPERLINE) #define H323IsValidAddressID(_dwID_) \ ((_dwID_) == 0) #define H323IsTapiControlCode(_wch_) \ (((_wch_) == L'T') || ((_wch_) == L'P')) #define H323IsSeparator(_wch_) \ ((_wch_) == L'/') #define H323IsListening(_pLine_) \ ((_pLine_)->nState == H323_LINESTATE_LISTENING) #define H323IsClosing(_pLine_) \ ((_pLine_)->nState == H323_LINESTATE_CLOSING) #define H323IsMediaDetectionEnabled(_pLine_) \ (((_pLine_)->dwMediaModes != 0) && \ ((_pLine_)->dwMediaModes != LINEMEDIAMODE_UNKNOWN)) #define H323IsVideoDetectionEnabled(_pLine_) \ ((_pLine_)->dwMediaModes & LINEMEDIAMODE_VIDEO) #define H323IsAudioDetectionEnabled(_pLine_) \ (H323IsVideoDetectionEnabled(_pLine_) || \ ((_pLine_)->dwMediaModes & LINEMEDIAMODE_AUTOMATEDVOICE) || \ ((_pLine_)->dwMediaModes & LINEMEDIAMODE_INTERACTIVEVOICE)) #define H323IsValidInterface(_dwAddr_) \ (((_dwAddr_) != 0) && \ ((_dwAddr_) != htonl(INADDR_LOOPBACK))) #define H323GetLineTableIndex(_hdLine_) \ ((DWORD)(_hdLine_)) #define H323CreateLineHandle(_i_) \ ((HDRVLINE)(DWORD)(_i_)) /////////////////////////////////////////////////////////////////////////////// // // // Public prototypes // // // /////////////////////////////////////////////////////////////////////////////// BOOL H323GetLineAndLock( PH323_LINE * ppLine, HDRVLINE hdLine ); BOOL H323GetLineFromIDAndLock( PH323_LINE * ppLine, DWORD dwDeviceID ); BOOL H323InitializeLine( PH323_LINE pLine, DWORD dwDeviceID ); BOOL H323CallListen( PH323_LINE pLine ); BOOL H323StartListening( PH323_LINE pLine ); BOOL H323StopListening( PH323_LINE pLine ); BOOL H323AllocLineTable( PH323_LINE_TABLE * ppLineTable ); BOOL H323FreeLineTable( PH323_LINE_TABLE pLineTable ); BOOL H323CloseLineTable( PH323_LINE_TABLE pLineTable ); BOOL H323InitializeLineTable( PH323_LINE_TABLE pLineTable, DWORD dwLineDeviceIDBase ); BOOL H323AllocLineFromTable( PH323_LINE * ppLine, PH323_LINE_TABLE * ppLineTable ); BOOL H323FreeLineFromTable( PH323_LINE pLine, PH323_LINE_TABLE pLineTable ); BOOL H323ProcessCloseChannelCommand( PH323_CALL pCall, PH323MSG_CLOSE_CHANNEL_COMMAND pCommand ); BOOL H323ProcessAcceptChannelResponse( PH323_CALL pCall, PH323MSG_ACCEPT_CHANNEL_RESPONSE pResponse ); BOOL H323ProcessOpenChannelRequest( PH323_CALL pCall, PH323MSG_OPEN_CHANNEL_REQUEST pRequest ); BOOL H323ProcessFlowControlCommand( PH323_CALL pCall, PH323MSG_FLOW_CONTROL_COMMAND pCommand ); BOOL H323ProcessVideoFastUpdatePictureCommand( PH323_CALL pCall, PH323MSG_VIDEO_FAST_UPDATE_PICTURE_COMMAND pCommand ); BOOL H323ProcessQoSEventIndication( PH323_CALL pCall, PH323MSG_QOS_EVENT pCommand ); BOOL H323ProcessConfigT120Command( PH323MSG_CONFIG_T120_COMMAND pCommand ); BOOL H323ProcessConfigCapabilityCommand( PH323MSG_CONFIG_CAPABILITY_COMMAND pCommand ); #if defined(USE_PROVIDER_LOCK) #define H323LockLine(_pLine_) H323LockProvider(); #define H323UnlockLine(_pLine_) H323UnlockProvider(); #elif defined(DBG) && defined(DEBUG_CRITICAL_SECTIONS) VOID H323LockLine( PH323_LINE pLine ); VOID H323UnlockLine( PH323_LINE pLine ); #else #define H323LockLine(_pLine_) \ {EnterCriticalSection(&(_pLine_)->Lock);} #define H323UnlockLine(_pLine_) \ {LeaveCriticalSection(&(_pLine_)->Lock);} #endif #endif // _INC_LINE