Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

439 lines
13 KiB

/*++
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_