WindowsXP-SP1/enduser/netmeeting/ui/msconfft/nullmdm.h
2020-09-30 16:53:49 +02:00

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_