CnC_Remastered_Collection/REDALERT/WIN32LIB/WINCOMM.H

455 lines
14 KiB
C++

//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code 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.
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
// in the hope that it will be useful, but with permitted additional restrictions
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
// distributed with this program. You should have received a copy of the
// GNU General Public License along with permitted additional restrictions
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
/***********************************************************************************************
*** 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_ */