185 lines
7.8 KiB
C++
185 lines
7.8 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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_
|
|
|