/////////////////////////////////////////////////////////////////////////////// // // Header defining Null Modem structures and prototypes // // Copyright(c) Microsoft 1999 // /////////////////////////////////////////////////////////////////////////////// #ifndef _NULL_MODEM_H_ #define _NULL_MODEM_H_ /****************************************************************************/ /* These are valid return codes from TPhys API functions */ /* */ /* TPHYS_SUCCESS */ /* The function executed properly, without error. */ /* TPHYS_RESULT_INUSE */ /* The TPhysInitialize() function failed because the transport */ /* is already initialized */ /* TPHYS_RESULT_FAIL */ /* A general failure, such as a memory allocation error has */ /* caused the function to fail */ /* TPHYS_RESULT_NOT_INITIALIZED */ /* The user is attempting to use a function even though the */ /* TPhysInitialize() function failed. */ /* TPHYS_RESULT_CONNECT_FAILED */ /* The TPhysConnectRequest() function failed. */ /* TPHYS_CONNECT_RESPONSE_FAILED */ /* The TPhysConnectResponse() function failed. */ /* TPHYS_RESULT_NOT_LISTENING */ /* The transport is not currently in a listening state */ /* TPHYS_RESULT_INVALID_CONNECTION */ /* The disconnect references an invalid connection handle */ /* TPHYS_RESULT_INVALID_ADDRESS */ /* The supplied address is invalid */ /* TPHYS_RESULT_CONNECT_REJECTED */ /* The node controller has successfully rejected ain incoming */ /* connection request. */ /* TPHYS_RESULT_SUCCESS_ALTERNATE */ /* The TPHYSICAL driver has connected, but with an alternate */ /* ADDRESS_TYPE as indicated in the connect_info in the response */ /****************************************************************************/ typedef enum tagTPhysicalError { TPHYS_SUCCESS = 0, TPHYS_RESULT_INUSE = 100, TPHYS_RESULT_FAIL = 101, TPHYS_RESULT_NOT_INITIALIZED = 102, TPHYS_RESULT_CONNECT_FAILED = 103, TPHYS_CONNECT_RESPONSE_FAILED = 104, TPHYS_RESULT_NOT_LISTENING = 105, TPHYS_RESULT_INVALID_CONNECTION = 106, TPHYS_RESULT_INVALID_ADDRESS = 107, TPHYS_RESULT_CONNECT_REJECTED = 108, TPHYS_RESULT_SUCCESS_ALTERNATE = 109, TPHYS_RESULT_COMM_PORT_BUSY = 110, TPHYS_RESULT_WAITING_FOR_CONNECTION = 111, } TPhysicalError; /****************************************************************************/ /* Structure TPHYS_CALLBACK_INFO */ /* */ /* This structure is passed back as the second parameter to */ /* TPhysCallback for CONNECT notifications. It contains all the */ /* information necessary for the node controller to establish a logical */ /* connection over the physical connection */ /* */ /* It is the responsibility of the node controller to format and present */ /* this information to the transport driver during the in-band portion of */ /* the physical connection establishment. */ /* */ /****************************************************************************/ #define TPHYS_MAX_ADDRESS_INFO 64 typedef struct tphys_connect_info { UINT connectionID; UINT resultCode; } TPHYS_CONNECT_INFO, * PTPHYS_CONNECT_INFO; typedef UINT PHYSICAL_HANDLE; typedef void (CALLBACK *TPhysCallback) (WORD, PTPHYS_CONNECT_INFO, UINT); // OOB compatible #define WM_TPHYS_CONNECT_CONFIRM (WM_APP + 1) #define WM_TPHYS_CONNECT_INDICATION (WM_APP + 2) #define WM_TPHYS_DISCONNECT_CONFIRM (WM_APP + 3) #define WM_TPHYS_DISCONNECT_INDICATION (WM_APP + 4) #define WM_TPHYS_STATUS_INDICATION (WM_APP + 5) /////////////////////////////////////////////////////////////////////////////// // Structure containing state information for each NULLMODEM line /////////////////////////////////////////////////////////////////////////////// typedef enum tagCALL_STATE { CALL_STATE_IDLE = 0, // Call is idle CALL_STATE_MAKE = 1, // Establishing phone connection CALL_STATE_ANSWER = 2, // Answering a new call CALL_STATE_DROP = 3, // Dropping the phone connection CALL_STATE_CONNECTED = 4, // Phone connection established and passed onto TDD. } CALL_STATE; typedef struct tagLINE_INFO { HANDLE hevtCall; // handle to the call HANDLE hCommLink; // handle to COM device - call BOOL fCaller; // FALSE = incoming call CALL_STATE eCallState; // one of the following states PHYSICAL_HANDLE pstnHandle; TPHYS_CONNECT_INFO connInfo; } LINE_INFO; #define MAX_NULLMODEM_LINES 4 class CNullModem { public: CNullModem(HINSTANCE); ~CNullModem(void); TPhysicalError TPhysInitialize(TPhysCallback callback, UINT transport_id); TPhysicalError TPhysTerminate(void); TPhysicalError TPhysListen(void); TPhysicalError TPhysUnlisten(void); TPhysicalError TPhysConnectRequest(LPSTR pszComPort); TPhysicalError TPhysDisconnect(void); DWORD WorkerThreadProc(void); HWND GetHwnd(void) { return m_hwnd; } LRESULT TPhysProcessMessage(UINT uMsg, LPARAM lParam); HANDLE GetCommLink(void) { return m_Line.hCommLink; } void SetBuffers(void); void SetTimeouts(void); private: void DropCall(void); BOOL WaitForConnection(void); void SetConnectedPort(void); private: BOOL m_fInitialized; HINSTANCE m_hDllInst; TPhysCallback m_pfnCallback; BOOL m_fListening; HWND m_hwnd; UINT m_nTransportID; // ID required by RNC UINT m_nConnectionID; // next conn ID to allocate LINE_INFO m_Line; HANDLE m_hThread; DWORD m_dwThreadID; HANDLE m_hevtOverlapped; DWORD m_dwEventMask; BOOL m_fCommPortInUse; OVERLAPPED m_Overlapped; COMMTIMEOUTS m_DefaultTimeouts; }; LRESULT CALLBACK TPhysWndProc(HWND, UINT, WPARAM, LPARAM); TPhysicalError CALLBACK TPhysDriverCallback(USHORT msg, ULONG parm, void *userData); #define COMM_PORT_TIMEOUT 60000 // 60 seconds #endif // _NULL_MODEM_H_