#ifndef _T120_TRANSPORT_H_ #define _T120_TRANSPORT_H_ #include "iplgxprt.h" #include "it120xprt.h" #include "socket.h" #include "mcattprt.h" #include "imst123.h" #define MAX_PLUGGABLE_OUT_BUF_SIZE 32 #define MAX_PLUGXPRT_CONNECTIONS 16 #define MAX_PLUGXPRT_EVENTS 5 // read, write, close, pending read, and pending write #define MAKE_PLUGXPRT_WPARAM(id,type) (MAKELONG(id,type)) #define PLUGXPRT_WPARAM_TO_ID(wParam) (LOWORD(wParam)) #define PLUGXPRT_WPARAM_TO_TYPE(wParam) (HIWORD(wParam)) #define MAKE_PLUGXPRT_LPARAM(evt,err) (MAKELONG(evt,err)) #define PLUGXPRT_LPARAM_TO_EVENT(lParam) (LOWORD(lParam)) #define PLUGXPRT_LPARAM_TO_ERROR(lParam) (HIWORD(lParam)) enum { PLUGXPRT_PENDING_EVENT = 0, PLUGXPRT_EVENT_READ = 1, PLUGXPRT_EVENT_WRITE = 2, PLUGXPRT_EVENT_CLOSE = 3, PLUGXPRT_EVENT_ACCEPT = 4, PLUGXPRT_EVENT_CONNECT = 5, PLUGXPRT_HIGH_LEVEL_READ = 6, PLUGXPRT_HIGH_LEVEL_WRITE = 7, }; class CPluggableOutBufQueue2 : public CQueue2 { DEFINE_CQUEUE2(CPluggableOutBufQueue2, LPBYTE, int) }; class CPluggableConnection : public CRefCount { public: CPluggableConnection(PLUGXPRT_CALL_TYPE eCaller, HANDLE hCommLink, HANDLE hevtRead, HANDLE hevtWrite, HANDLE hevtClose, PLUGXPRT_FRAMING eFraming, PLUGXPRT_PARAMETERS *pParams, T120Error *); ~CPluggableConnection(void); LPSTR GetConnString(void) { return &m_szConnID[0]; } UINT GetConnID(void) { return m_nConnID; } HANDLE GetCommLink(void) { return m_hCommLink; } HANDLE GetReadEvent(void) { return m_hevtRead; } HANDLE GetWriteEvent(void) { return m_hevtWrite; } HANDLE GetCloseEvent(void) { return m_hevtClose; } void SetSocket(PSocket pSocket) { m_pSocket = pSocket; } PSocket GetSocket(void) { return m_pSocket; } TransportType GetType(void) { return m_eType; } BOOL IsCaller(void) { return (PLUGXPRT_CALLER == m_eCaller); } BOOL IsCallee(void) { return (PLUGXPRT_CALLEE == m_eCaller); } HANDLE GetPendingReadEvent(void) { return m_hevtPendingRead; } HANDLE GetPendingWriteEvent(void) { return m_hevtPendingWrite; } T120Error UpdateCommLink(HANDLE hCommLink); int Read(LPBYTE buffer, int length, PLUGXPRT_RESULT *); BOOL OnPendingRead(void); int Write(LPBYTE buffer, int length, PLUGXPRT_RESULT *); BOOL OnPendingWrite(void); void WriteTheFirst(void); void NotifyHighLevelRead(void); void NotifyReadFailure(void); void NotifyHighLevelWrite(void); void NotifyWriteFailure(void); void NotifyWriteEvent(void); BOOL SetupReadState(int length); void CleanupReadState(void); void CleanupWriteState(void); void Shutdown(void); // // Legacy PSTN transport // LEGACY_HANDLE GetLegacyHandle(void) { return m_nLegacyLogicalHandle; } void SetLegacyHandle(LEGACY_HANDLE logical_handle) { m_nLegacyLogicalHandle = logical_handle; } TransportError TConnectRequest(void); TransportError TDisconnectRequest(void); int TDataRequest(LPBYTE pbData, ULONG cbDataSize, PLUGXPRT_RESULT *); TransportError TPurgeRequest(void); private: PLUGXPRT_STATE m_eState; PLUGXPRT_CALL_TYPE m_eCaller; HANDLE m_hCommLink; HANDLE m_hevtRead; HANDLE m_hevtWrite; HANDLE m_hevtClose; TransportType m_eType; PSocket m_pSocket; UINT m_nConnID; char m_szConnID[T120_CONNECTION_ID_LENGTH]; // // Legacy PSTN transport // LEGACY_HANDLE m_nLegacyLogicalHandle; // // X.224 framing // HANDLE m_hevtPendingRead; // for asynchronous ReadFile() HANDLE m_hevtPendingWrite; // for asynchronous WriteFile() // IO queue management for X.224 BOOL m_fPendingReadDone; int m_cbPendingRead; LPBYTE m_pbPendingRead; OVERLAPPED m_OverlappedRead; int m_cbPendingWrite; LPBYTE m_pbPendingWrite; OVERLAPPED m_OverlappedWrite; CPluggableOutBufQueue2 m_OutBufQueue2; }; class CPluggableConnectionList : public CList { DEFINE_CLIST(CPluggableConnectionList, CPluggableConnection *) }; class CPluggableTransport : public IT120PluggableTransport, public CRefCount { public: CPluggableTransport(void); ~CPluggableTransport(void); STDMETHOD_(void, ReleaseInterface) (THIS); STDMETHOD_(T120Error, CreateConnection) (THIS_ char szConnID[], PLUGXPRT_CALL_TYPE eCaller, HANDLE hCommLink, HANDLE hevtRead, HANDLE hevtWrite, HANDLE hevtClose, PLUGXPRT_FRAMING eFraming, PLUGXPRT_PARAMETERS *pParams); STDMETHOD_(T120Error, UpdateConnection) (THIS_ LPSTR pszConnID, HANDLE hCommLink); STDMETHOD_(T120Error, CloseConnection) (THIS_ LPSTR pszConnID); STDMETHOD_(T120Error, EnableWinsock) (THIS); STDMETHOD_(T120Error, DisableWinsock) (THIS); STDMETHOD_(void, Advise) (THIS_ LPFN_PLUGXPRT_CB, LPVOID pContext); STDMETHOD_(void, UnAdvise) (THIS); STDMETHOD_(void, ResetConnCounter) (THIS); void OnProtocolControl(TransportConnection, PLUGXPRT_STATE, PLUGXPRT_RESULT); ULONG UpdateEvents(HANDLE *aHandles); void OnEventSignaled(HANDLE hevtSignaled); void OnEventAbandoned(HANDLE hevtSignaled); CPluggableConnection * GetPluggableConnection(PSocket pSocket); CPluggableConnection * GetPluggableConnection(UINT_PTR nConnID); CPluggableConnection * GetPluggableConnection(HANDLE hCommLink); CPluggableConnection * GetPluggableConnectionByLegacyHandle(LEGACY_HANDLE); // // legacy tranport // BOOL EnsureLegacyTransportLoaded(void); private: LPFN_PLUGXPRT_CB m_pfnNotify; LPVOID m_pContext; CPluggableConnectionList m_PluggableConnectionList; }; void OnProtocolControl(TransportConnection, PLUGXPRT_STATE, PLUGXPRT_RESULT eResult = PLUGXPRT_RESULT_SUCCESSFUL); ULONG CreateConnString(int nConnID, char szConnID[]); BOOL IsValidPluggableTransportName(LPCSTR pcszNodeAddress); UINT GetPluggableTransportConnID(LPCSTR pcszNodeAddress); CPluggableConnection * GetPluggableConnection(PSocket pSocket); CPluggableConnection * GetPluggableConnection(UINT_PTR nConnID); CPluggableConnection * GetPluggableConnection(HANDLE hCommLink); CPluggableConnection * GetPluggableConnectionByLegacyHandle(LEGACY_HANDLE); int SubmitPluggableRead(PSocket, LPBYTE buffer, int length, PLUGXPRT_RESULT *); int SubmitPluggableWrite(PSocket, LPBYTE buffer, int length, PLUGXPRT_RESULT *); void PluggableWriteTheFirst(TransportConnection); void PluggableShutdown(TransportConnection); // // PSTN framing // TransportError TReceiveBufferAvailable(void); extern ILegacyTransport *g_pLegacyTransport; extern BOOL g_fWinsockDisabled; extern CRITICAL_SECTION g_csTransport; #if defined(TEST_PLUGGABLE) && defined(_DEBUG) LPCSTR FakeNodeAddress(LPCSTR pcszNodeAddress); #endif #endif // _T120_TRANSPORT_H_