| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- /*
- ** Command & Conquer Red Alert(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : Command & Conquer/ WW Library *
- * *
- * File Name : WINCOMM.H *
- * *
- * Programmer : Steve Tall *
- * *
- * Start Date : 1/10/96 *
- * *
- * Last Update : January 10th 1996 [ST] *
- * *
- *---------------------------------------------------------------------------------------------*
- * Overview: *
- * *
- * These classes was created to replace the greenleaf comms functions used in C&C DOS with *
- * WIN32 API calls. *
- * *
- *---------------------------------------------------------------------------------------------*
- * *
- * Functions: *
- * *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #ifndef WIN32
- #define WIN32
- #define _WIN32
- #endif //WIN32
- #include <windows.h>
- typedef enum WinCommDialMethodType {
- WC_TOUCH_TONE = 0,
- WC_PULSE
- } WinCommDialMethodType;
- #define COMMSUCCESS 0
- #define ASTIMEOUT -10
- #define COMMUSERABORT -16
- /*
- ** The size of our serial buffer within the class.
- **
- ** !!!!!! THIS MUST BE A POWER OF 2 !!!!!!
- **
- */
- #define SIZE_OF_WINDOWS_SERIAL_BUFFER 2048
- /*
- ** WinModemClass.
- **
- ** This class provides access to modems under Win95. The functions are designed to be more or less
- ** drop in replacements for the Grenleaf comms functions.
- */
- class WinModemClass
- {
- public:
- WinModemClass (void); //WinModemClass Contructor
- virtual ~WinModemClass (void); //WinModemClass Destructor
- /*
- ** Serial port open should be called to get a handle to the COM port
- ** This needs to be called first as other class members rely on the handle
- **
- ** Replacement for Greenleaf function: PortOpenGreenleafFast
- */
- //virtual HANDLE Serial_Port_Open (int port, int baud, int parity, int wordlen, int stopbits);
- virtual HANDLE Serial_Port_Open (char *device_name, int baud, int parity, int wordlen, int stopbits, int flowcontrol);
- /*
- ** This function releases the COM port handle and should be called after
- ** communications have finished
- **
- ** Replacement for Greenleaf function: PortClose
- */
- void Serial_Port_Close (void);
- /*
- ** This member copies any bytes from the internal class serial buffer
- ** into your user buffer.
- **
- ** Replacement for Greenleaf function: ReadBuffer
- */
- int Read_From_Serial_Port (unsigned char *dest_ptr, int buffer_len);
- /*
- ** Write chars to the serial port
- **
- ** Replacement for Greenleaf function: WriteBuffer
- */
- void Write_To_Serial_Port (unsigned char *buffer, int length);
- /*
- ** Wait for the outgoing buffer to empty
- */
- void Wait_For_Serial_Write (void);
- /*
- ** Set the dial type to DIAL_TOUCH_TONE or DIAL_PULSE
- **
- ** Replacement for Greenleaf function: HMSetDiallingMethod
- */
- virtual void Set_Modem_Dial_Type (WinCommDialMethodType method);
- /*
- ** Get the status of the modem control lines
- ** Possible flags are: CTS_SET DSR_SET RI_SET & CD_SET
- **
- ** Replacement for Greenleaf function: GetModemStatus
- */
- virtual unsigned Get_Modem_Status (void);
- /*
- ** Set the DTR line to the given state
- **
- ** Replacement for Greenleaf function: SetDtr
- */
- virtual void Set_Serial_DTR (BOOL state);
- /*
- ** Get the result code from the modem after issuing an 'AT' command
- **
- ** Replacement for Greenleaf function: HMInputLine
- */
- virtual int Get_Modem_Result (int delay, char *buffer, int buffer_len);
- /*
- ** Issue a dial command to the modem.
- ** Use Set_Modem_Dial_Type to select pulse or tone dial
- **
- ** Replacement for Greenleaf function: HMDial
- */
- virtual void Dial_Modem (char *dial_number);
- /*
- ** Send a command to the modem. This is usually an 'AT' command.
- ** Function will optionally retry until 'OK' is received.
- */
- virtual int Send_Command_To_Modem (char *command, char terminator, char *buffer, int buflen, int delay, int retries);
- /*
- ** Sets a pointer to a function that will be called for each incoming serial char
- **
- ** Replacement for Greenleaf function: HMSetUpEchoRoutine
- */
- virtual void Set_Echo_Function (void(*func)(char c));
- /*
- ** Sets a pointer to a function that will be called if ESC is pressed during a dial
- **
- ** Replacement for Greenleaf function: HMSetUpAbortKey
- */
- virtual void Set_Abort_Function (int (*func)(void));
- /*
- ** Member to allow access to the serial port handle
- */
- HANDLE Get_Port_Handle(void);
- /*
- ** Status vars for debugging purposes
- */
- int FramingErrors;
- int IOErrors;
- int BufferOverruns;
- int InBufferOverflows;
- int ParityErrors;
- int OutBufferOverflows;
- int InQueue;
- int OutQueue;
- /*
- ** Modem send result codes
- */
- enum SendModemEnum {
- MODEM_CMD_TIMEOUT = 0,
- MODEM_CMD_OK,
- MODEM_CMD_0,
- MODEM_CMD_ERROR
- };
- /*
- ** Enums for modem status flags
- */
- enum {
- CTS_SET = 0x10,
- DSR_SET = 0x20,
- RI_SET = 0x40,
- CD_SET = 0x80
- };
- protected:
- /*
- ** Copy incoming data from the windows file buffer into the internal class buffer
- */
- BOOL Read_Serial_Chars(void);
- /*
- ** Pointer to the internal class circular buffer for incoming data
- */
- unsigned char *SerialBuffer;
- /*
- ** Overlap object for asyncronous reads from the serial port
- */
- OVERLAPPED ReadOverlap;
- /*
- ** Overlap object for asyncronous writes to the serial port
- */
- OVERLAPPED WriteOverlap;
- /*
- ** Flag that there is no outstanding incoming data in the windows buffer
- */
- BOOL WaitingForSerialCharRead;
- /*
- ** Flag that we are waiting for the last write to port operation to complete
- */
- BOOL WaitingForSerialCharWrite;
- /*
- ** Head and Tail pointers for our internal serial buffer
- */
- int SerialBufferReadPtr;
- int SerialBufferWritePtr;
- /*
- ** Windows handle to the COM port device
- */
- HANDLE PortHandle;
- /*
- ** Dialing method - DIAL_TOUCH_TONE or DIAL_PULSE
- */
- WinCommDialMethodType DialingMethod;
- /*
- ** Pointer to function for echoing incoming data - can be NULL
- */
- void (*EchoFunction)(char c);
- /*
- ** Pointer to function for aborting when ESC pressed - can be NULL
- */
- int (*AbortFunction)(void);
- /*
- ** Serial buffer for asyncronous reads
- */
- char TempSerialBuffer[SIZE_OF_WINDOWS_SERIAL_BUFFER];
- };
- /*
- ** WinNullModemClass.
- **
- ** This class provides access to serial ports under Win95. The functions are designed to be more or less
- ** drop in replacements for the Grenleaf comms functions.
- **
- ** This class just overloads the WinModemClass members that arent required for direct serial communications
- ** via a 'null modem' cable.
- */
- class WinNullModemClass : public WinModemClass
- {
- public:
- virtual inline void Set_Modem_Dial_Type (int){};
- virtual inline unsigned Get_Modem_Status (void){return (0);};
- virtual inline void Set_Serial_DTR (BOOL){};
- virtual inline int Get_Modem_Result (int, char*, int){return(0);};
- virtual inline void Dial_Modem (char*){};
- virtual inline int Send_Command_To_Modem (char*, char, char*, int, int, int){return (0);};
- virtual inline void Set_Echo_Function (void(*)(char)){};
- virtual inline void Set_Abort_Function (int(*)(void)){};
- };
- extern WinModemClass *SerialPort;
- //
- //
- // This bit swiped from the SDK because its not in the Watcom headers yet
- //
- //
- /************************************************************************
- * *
- * mcx.h -- This module defines the 32-Bit Windows MCX APIs *
- * *
- * Copyright (c) 1990-1995, Microsoft Corp. All rights reserved. *
- * *
- ************************************************************************/
- #ifndef _MCX_H_
- #define _MCX_H_
- typedef struct _MODEMDEVCAPS {
- DWORD dwActualSize;
- DWORD dwRequiredSize;
- DWORD dwDevSpecificOffset;
- DWORD dwDevSpecificSize;
- // product and version identification
- DWORD dwModemProviderVersion;
- DWORD dwModemManufacturerOffset;
- DWORD dwModemManufacturerSize;
- DWORD dwModemModelOffset;
- DWORD dwModemModelSize;
- DWORD dwModemVersionOffset;
- DWORD dwModemVersionSize;
- // local option capabilities
- DWORD dwDialOptions; // bitmap of supported values
- DWORD dwCallSetupFailTimer; // maximum in seconds
- DWORD dwInactivityTimeout; // maximum in seconds
- DWORD dwSpeakerVolume; // bitmap of supported values
- DWORD dwSpeakerMode; // bitmap of supported values
- DWORD dwModemOptions; // bitmap of supported values
- DWORD dwMaxDTERate; // maximum value in bit/s
- DWORD dwMaxDCERate; // maximum value in bit/s
- // Variable portion for proprietary expansion
- BYTE abVariablePortion [1];
- } MODEMDEVCAPS, *PMODEMDEVCAPS, *LPMODEMDEVCAPS;
- typedef struct _MODEMSETTINGS {
- DWORD dwActualSize;
- DWORD dwRequiredSize;
- DWORD dwDevSpecificOffset;
- DWORD dwDevSpecificSize;
- // static local options (read/write)
- DWORD dwCallSetupFailTimer; // seconds
- DWORD dwInactivityTimeout; // seconds
- DWORD dwSpeakerVolume; // level
- DWORD dwSpeakerMode; // mode
- DWORD dwPreferredModemOptions; // bitmap
- // negotiated options (read only) for current or last call
- DWORD dwNegotiatedModemOptions; // bitmap
- DWORD dwNegotiatedDCERate; // bit/s
- // Variable portion for proprietary expansion
- BYTE abVariablePortion [1];
- } MODEMSETTINGS, *PMODEMSETTINGS, *LPMODEMSETTINGS;
- // Dial Options
- #define DIALOPTION_BILLING 0x00000040 // Supports wait for bong "$"
- #define DIALOPTION_QUIET 0x00000080 // Supports wait for quiet "@"
- #define DIALOPTION_DIALTONE 0x00000100 // Supports wait for dial tone "W"
- // SpeakerVolume for MODEMDEVCAPS
- #define MDMVOLFLAG_LOW 0x00000001
- #define MDMVOLFLAG_MEDIUM 0x00000002
- #define MDMVOLFLAG_HIGH 0x00000004
- // SpeakerVolume for MODEMSETTINGS
- #define MDMVOL_LOW 0x00000000
- #define MDMVOL_MEDIUM 0x00000001
- #define MDMVOL_HIGH 0x00000002
- // SpeakerMode for MODEMDEVCAPS
- #define MDMSPKRFLAG_OFF 0x00000001
- #define MDMSPKRFLAG_DIAL 0x00000002
- #define MDMSPKRFLAG_ON 0x00000004
- #define MDMSPKRFLAG_CALLSETUP 0x00000008
- // SpeakerMode for MODEMSETTINGS
- #define MDMSPKR_OFF 0x00000000
- #define MDMSPKR_DIAL 0x00000001
- #define MDMSPKR_ON 0x00000002
- #define MDMSPKR_CALLSETUP 0x00000003
- // Modem Options
- #define MDM_COMPRESSION 0x00000001
- #define MDM_ERROR_CONTROL 0x00000002
- #define MDM_FORCED_EC 0x00000004
- #define MDM_CELLULAR 0x00000008
- #define MDM_FLOWCONTROL_HARD 0x00000010
- #define MDM_FLOWCONTROL_SOFT 0x00000020
- #define MDM_CCITT_OVERRIDE 0x00000040
- #define MDM_SPEED_ADJUST 0x00000080
- #define MDM_TONE_DIAL 0x00000100
- #define MDM_BLIND_DIAL 0x00000200
- #define MDM_V23_OVERRIDE 0x00000400
- #endif /* _MCX_H_ */
|