/* comstd.hh -- Private header file for stdcom communications driver module * * Copyright 1994 by Hilgraeve Inc. -- Monroe, MI * All rights reserved * * $Revision: 6 $ * $Date: 1/18/02 4:59p $ */ // -=-=-=-=-=-=-=-=-=-=-=-=-=- DEBUG CONTROL -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // These constants are used to turn on various types of debug display //#define DEBUG_THREAD // Thread startup and shutdown //#define DEBUG_READ // Read operations, main & thread //#define DEBUG_WRITE // Write operations, main & thread //#define DEBUG_EVENTS // Com Events handled in thread //#define DEBUG_AD // Auto Detect #if defined(DEBUG_THREAD) #define DEBUGSTR #define DBG_THREAD(s,a1,a2,a3,a4,a5) DbgOutStr(s,a1,a2,a3,a4,a5) #else #define DBG_THREAD(s,a1,a2,a3,a4,a5) #endif #if defined(DEBUG_READ) #define DEBUGSTR #define DBG_READ(s,a1,a2,a3,a4,a5) DbgOutStr(s,a1,a2,a3,a4,a5) #else #define DBG_READ(s,a1,a2,a3,a4,a5) #endif #if defined(DEBUG_WRITE) #define DEBUGSTR #define DBG_WRITE(s,a1,a2,a3,a4,a5) DbgOutStr(s,a1,a2,a3,a4,a5) #else #define DBG_WRITE(s,a1,a2,a3,a4,a5) #endif #if defined(DEBUG_EVENTS) #define DEBUGSTR #define DBG_EVENTS(s,a1,a2,a3,a4,a5) DbgOutStr(s,a1,a2,a3,a4,a5) #else #define DBG_EVENTS(s,a1,a2,a3,a4,a5) #endif #if defined(DEBUG_AD) #define DEBUGSTR #define DBG_AD(s,a1,a2,a3,a4,a5) DbgOutStr(s,a1,a2,a3,a4,a5) #else #define DBG_AD(s,a1,a2,a3,a4,a5) #endif // -=-=-=-=-=-=-=-=-=-=-=-=-=- DEFINITIONS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #define SIZE_INQ 1152 #define SIZE_OUTQ 2048 #define MAX_READSIZE 80L // Set these values to make auto detection work #define MIN_AD_TOTAL 15 #define MIN_AD_MIX 6 // Values for nBestGuess #define AD_DONT_KNOW 0 #define AD_8N1 1 #define AD_7O1 2 #define AD_7E1 3 // Flag values in afHandshake #define HANDSHAKE_RCV_X 0x0001 #define HANDSHAKE_RCV_DTR 0x0002 #define HANDSHAKE_RCV_RTS 0x0004 #define HANDSHAKE_SND_X 0x0008 #define HANDSHAKE_SND_CTS 0x0010 #define HANDSHAKE_SND_DSR 0x0020 #define HANDSHAKE_SND_DCD 0x0040 #define MDMSTAT_CTS 0x10 #define MDMSTAT_DSR 0x20 #define MDMSTAT_DCD 0x80 #define STDCOM struct s_stdcom * // System value item IDs #define SFID_COMSTD_BAUD 0x1011 #define SFID_COMSTD_DATABITS 0x1012 #define SFID_COMSTD_STOPBITS 0x1013 #define SFID_COMSTD_PARITY 0x1014 #define SFID_COMSTD_HANDSHAKING 0x1015 #define SFID_COMSTD_XON 0x1016 #define SFID_COMSTD_XOFF 0x1017 #define SFID_COMSTD_BREAK 0x1018 #define SFID_COMSTD_AUTODETECT 0x1019 // Identifiers for events in ahEvents #define EVENT_COMEVENT 0 #define EVENT_READ 1 #define EVENT_WRITE 2 #define EVENT_COUNT 3 #if defined(INCL_WINSOCK) // Size of receive circular buffer #define WSOCK_SIZE_INQ 1500 // Size of send circular bufffer. Don't make too big or status displays // during file transfers will act oddly. #define WSOCK_SIZE_OUTQ 3000 #define WSOCK_MAX_READSIZE 1500L #define IP_ADDR_LEN 128 // Note: This was once "HA/WinSock" however this would cause HyperTerminal // to crash if HAWin16 was running and using WinSock. Since this was an // obvious cut-and-paste job, I have changed this to be unique for // HyperTerminal. - cab:12/06/96 // #define WINSOCK_EVENT_WINDOW_CLASS "HyperTrm/WinSock" #define WM_WINSOCK_NOTIFY (WM_USER+133) #define WM_WINSOCK_RESOLVE (WM_USER+134) #define WM_WINSOCK_STARTUP (WM_USER+135) #define MODE_MAX 5 #endif // defined(INCL_WINSOCK) // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-= TYPES =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- typedef struct s_stdcom_settings { long lBaud; int nDataBits; int nStopBits; int nParity; unsigned afHandshake; TCHAR chXON; TCHAR chXOFF; int nBreakDuration; int fAutoDetect; } ST_STDCOM_SETTINGS; #if defined(INCL_WINSOCK) struct stOptionStateData { int option; int us; int usq; int him; int himq; }; typedef struct stOptionStateData STOPT; typedef STOPT FAR * PSTOPT; #endif // defined(INCL_WINSOCK) typedef struct s_stdcom { // Configuration details ST_STDCOM_SETTINGS stFileSettings; ST_STDCOM_SETTINGS stWorkSettings; // These are control variables private to the stdcom driver HCOM hCom; // access to com routines HANDLE hWinComm; // handle to windows comm device HTIMER hTmrBreak; // Timer to control break duration int fBreakSignalOn; // TRUE while sending break signal int fNotifyRcv; // TRUE if driver should send notification DWORD dwEventMask; // Mask used in Set/GetCommEventmask int fSending; // TRUE if we've sent a buffer of data long lSndTimer; // started when we issue a WriteComm long lSndLimit; // amt. of time to wait for send long lSndStuck; // amt. of time we've been waiting for // handshaking HWND hwndEvents; // window to process event messages // generate messages for us BYTE bLastMdmStat; OVERLAPPED stWriteOv; // Control fields for receiving int nRBufrSize; // Size of receive buffer BYTE *pbBufrStart; // Address of receive buffer BYTE *pbBufrEnd; BYTE *pbReadEnd; // Where read thread left off BYTE *pbComStart; // Marks area being unloaded by main Com BYTE *pbComEnd; int fBufrFull; // True when driver buffers are full int fBufrEmpty; // True when driver buffers are empty // Control fields for sending DWORD dwBytesToSend; // Number of bytes pending for write DWORD dwSndOffset; // Offset into send buffer for write BYTE *pbSndBufr; // Buffer used by pending write calls // Error counts int nParityErrors; int nFramingErrors; int nOverrunErrors; int nOverflowErrors; // Auto detection fields int fADRunning; int nADTotal; int nADMix; int nAD7o1; int nADHighBits; int nADBestGuess; char chADLastChar; int fADToggleParity; int fADReconfigure; HANDLE hComstdThread; // Thread to handle ongoing activity int fHaltThread; // To control when thread shuts down // Data access control CRITICAL_SECTION csect; // To synchronize access to driver vars. HANDLE ahEvent[EVENT_COUNT]; // To control scheduling #if defined(INCL_WINSOCK) // Configuration details // These are control variables private to the tcpip comm driver SOCKET hSocket; // connected socket int fConnected; // COM_PORT_UNINITIALIZED initially, // COM_PORT_NOT_OPEN if init'd, // COM_PORT_OPEN connected TCHAR szRemoteAddr[IP_ADDR_LEN];// IP address short nPort; // Port number unsigned long ulCompatibility; // to pass flags into dialogs ULONG ulAddr; // These are control variables private to the stdcom driver int fSndBreak; // emulate a break sequence // Control fields for receiving BYTE *pbSendBufr; // Pointer to data passed to SndBufrSend int nSendBufrLen; // Amount of data to send BYTE abSndBufr[WSOCK_SIZE_OUTQ*2]; // Buffer to send when Winsock is ready BYTE *pbSndPtrEnd; // Current offset in auchSndBufr HANDLE hComReadThread; // Thread to handle reading from network HANDLE hComWriteThread; // Thread to handle writing to network HANDLE hComConnectThread; // Thread to handle connecting to host int fClearSendBufr; // flag to signal send buffer to be cleared int fEscapeFF; // We are escaping FF characters (by doubling) int fSeenFF; // We have just encountered and FF character union { // JYF: 29-Sep-2000, fix alignment fault HOSTENT stHostBuf; // used by WSAGetHostByName BYTE pcharHostBuf[MAXGETHOSTSTRUCT]; // for allocating MAXGETHOSTSTRUCT bytes }; struct sockaddr_in stHost; // Pointers to socket library functions (porting note: these are just pasted in from winsock.h // with the function pointer declaration fixed up) int (PASCAL * FAR accept)( int, struct sockaddr *, int * ); int (PASCAL * FAR bind)( int, struct sockaddr *, int ); int (PASCAL * FAR connect)( int, struct sockaddr *, int ); int (PASCAL * FAR gethostid)(void); int (PASCAL * FAR listen)( int, int); int (PASCAL * FAR recv)( int, char *, int, int ); int (PASCAL * FAR send)( int, char *, int, int ); int (PASCAL * FAR sock_init)( void ); int (PASCAL * FAR sock_errno)( void ); int (PASCAL * FAR socket)( int, int, int ); int (PASCAL * FAR soclose)( int ); int (PASCAL * FAR shutdown)(int, int); int (PASCAL * FAR setsockopt)( int, int, int, char *, int ); // from netdb.h struct hostent * (PASCAL * FAR gethostbyname)( char * ); // from netinet/in.h unsigned long (PASCAL * FAR inet_addr)(char *); // from utils.h unsigned short (PASCAL * FAR bswap)(unsigned short); // Telnet emulation data int NVTstate; // Current state of Network Virtual Terminal STOPT stMode[MODE_MAX]; #ifdef INCL_CALL_ANSWERING // Answer mode variables - cab:11/19/96 // int fAnswer; // Are we waiting for a call? #endif #endif // defined(INCL_WINSOCK) } ST_STDCOM; // -=-=-=-=-=-=-=-=-=-=-=- Globals -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- extern HINSTANCE hinstDLL; // -=-=-=-=-=-=-=-=-=-=-=- EXPORTED PROTOTYPES -=-=-=-=-=-=-=-=-=-=-=-=-=-=- int WINAPI DeviceInitialize(HCOM hCom, unsigned usInterfaceVersion, void **ppvDriverData); int WINAPI DeviceClose(ST_STDCOM *pstPrivate); int WINAPI DeviceDialog(ST_STDCOM *pstPrivate, HWND hwndParent); int WINAPI DeviceGetCommon(ST_STDCOM *pstPrivate, ST_COMMON *pstCommon); int WINAPI DeviceSetCommon(ST_STDCOM *pstPrivate, ST_COMMON *pstCommon); int WINAPI DeviceSpecial(ST_STDCOM *pstPrivate, const TCHAR *pszInstructions, TCHAR *pszResult, int nBufrSize); int WINAPI DeviceLoadHdl(ST_STDCOM *pstPrivate, SF_HANDLE sfHdl); int WINAPI DeviceSaveHdl(ST_STDCOM *pstPrivate, SF_HANDLE sfHdl); int WINAPI PortConfigure(ST_STDCOM *pstPrivate); int WINAPI PortActivate(ST_STDCOM *pstPrivate, TCHAR *pszPortName, DWORD_PTR dwMediaHdl); int WINAPI PortDeactivate(ST_STDCOM *pstPrivate); int WINAPI PortConnected(ST_STDCOM *pstPrivate); int PortExtractSettings(ST_STDCOM *pstPrivate); int PortDefaultSettings(ST_STDCOM *pstPrivate); int WINAPI RcvRefill(ST_STDCOM *pstPrivate); int WINAPI RcvClear(ST_STDCOM *pstPrivate); int WINAPI SndBufrSend(ST_STDCOM *pstPrivate, void *pvBufr, int nSize); int WINAPI SndBufrIsBusy(ST_STDCOM *pstPrivate); int WINAPI SndBufrQuery(ST_STDCOM *pstPrivate, unsigned *pafStatus, long *plHandshakeDelay); int WINAPI SndBufrClear(ST_STDCOM *pstPrivate); DWORD WINAPI ComstdThread(void *pvData); void AutoDetectAnalyze(ST_STDCOM *pstPrivate, int nBytes, char *pchBufr); void AutoDetectOutput(ST_STDCOM *pstPrivate, void *pvBufr, int nSize); void AutoDetectStart(ST_STDCOM *pstPrivate); void AutoDetectStop(ST_STDCOM *pstPrivate); void ComstdSettingsToDCB(ST_STDCOM_SETTINGS *pstSettings, DCB *pstDcb); void ComstdDCBToSettings(DCB *pstDcb, ST_STDCOM_SETTINGS *pstSettings); // Temporary til TAPI lets us change media handle settings correctly int ComstdGetAutoDetectResults(void *pvData, BYTE *bByteSize, BYTE *bParity, BYTE *bStopBits);