CnC_Remastered_Collection/REDALERT/TCPIP.H

198 lines
7.5 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
/* $Header: /CounterStrike/TCPIP.H 1 3/03/97 10:25a Joe_bostic $ */
/***************************************************************************
** 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 *
* *
* File Name : TCPIP.CPP *
* *
* Programmer : Steve Tall *
* *
* Start Date : March 11th, 1996 *
* *
* Last Update : March 11th, 1996 [ST] *
* *
*-------------------------------------------------------------------------*
* *
* *
* *
*-------------------------------------------------------------------------*
* Functions: *
* *
* *
* *
* *
* *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifdef WIN32
#ifndef WOLAPI_INTEGRATION
extern bool Server;
#endif
#define FORCE_WINSOCK 1
#define WINSOCK_MINOR_VER 1
#define WINSOCK_MAJOR_VER 1
#define PORTNUM 0x1000
#define UDP_PORT 0x1001
#define WS_INTERNET_BUFFER_LEN 1024
#define WS_NUM_TX_BUFFERS 16 //Must be a power of 2
#define WS_NUM_RX_BUFFERS 16 //MUst be a power of 2
#define WS_RECEIVE_BUFFER_LEN 1024
//#define WS_IN_BUFFER_LEN 8192
//#define WS_OUT_BUFFER_LEN 8192
#define PLANET_WESTWOOD_HANDLE_MAX 20
#define PLANET_WESTWOOD_PASSWORD_MAX 20
#define IP_ADDRESS_MAX 40
#define PORT_NUMBER_MAX 6
//...........................................................................
// Custom messages: WM_USER + 1 to WM_USER + 100
// These will be sent to the dialog procedure, for display only.
//...........................................................................
#define WM_UPDATE_STATUS (WM_USER + 1) // update status text
#define WM_UPDATE_CLIENTS (WM_USER + 2) // update client list box
#define WM_UPDATE_MESSAGE (WM_USER + 3) // update received message list
//...........................................................................
// Messages for Async processing.
//...........................................................................
#define WM_ACCEPT (WM_USER + 101) // client wants to connect
#define WM_HOSTBYADDRESS (WM_USER + 102) // async get host by address
#define WM_HOSTBYNAME (WM_USER + 103) // async get host by name
#define WM_ASYNCEVENT (WM_USER + 104) // other Async event
#define WM_UDPASYNCEVENT (WM_USER + 105) // UDP socket Async event
class TcpipManagerClass {
public:
TcpipManagerClass(void);
~TcpipManagerClass(void);
BOOL Init(void);
void Start_Server(void);
void Start_Client(void);
void Close_Socket(SOCKET s);
void Message_Handler(HWND window, UINT message, UINT wParam, LONG lParam);
void Copy_To_In_Buffer(int bytes);
int Read(void *buffer, int buffer_len);
void Write(void *buffer, int buffer_len);
BOOL Add_Client(void);
void Close(void);
void Set_Host_Address(char *address);
void Set_Protocol_UDP(BOOL state);
void Clear_Socket_Error(SOCKET socket);
inline BOOL Get_Connected(void) {return (Connected);}
typedef enum ConnectStatusEnum {
CONNECTED_OK = 0,
NOT_CONNECTING,
CONNECTING,
UNABLE_TO_CONNECT_TO_SERVER,
CONTACTING_SERVER,
SERVER_ADDRESS_LOOKUP_FAILED,
RESOLVING_HOST_ADDRESS,
UNABLE_TO_ACCEPT_CLIENT,
UNABLE_TO_CONNECT,
CONNECTION_LOST
} ConnectStatusEnum;
inline ConnectStatusEnum Get_Connection_Status(void) {return (ConnectStatus);}
private:
//...........................................................................
// This structure defines all the info we need about a host
//...........................................................................
typedef struct {
struct in_addr Addr; // address
char DotAddr[16]; // decimal-dot address string
char Name[255]; // character-string name
} HostType;
typedef struct {
char Buffer[WS_INTERNET_BUFFER_LEN];
int DataLength;
bool InUse:1;
} InternetBufferType;
BOOL WinsockInitialised;
WSADATA WinsockInfo;
SOCKET ListenSocket;
SOCKET ConnectSocket;
SOCKET UDPSocket;
IN_ADDR ClientIPAddress;
HANDLE Async;
char HostBuff[MAXGETHOSTSTRUCT];
char ClientName[128];
char ReceiveBuffer[WS_RECEIVE_BUFFER_LEN];
//char InBuffer[WS_IN_BUFFER_LEN];
//int InBufferHead;
//int InBufferTail;
//char OutBuffer[WS_OUT_BUFFER_LEN];
//int OutBufferHead;
//int OutBufferTail;
BOOL IsServer;
BOOL Connected;
HostType Server;
char HostAddress[IP_ADDRESS_MAX];
ConnectStatusEnum ConnectStatus;
BOOL UseUDP;
IN_ADDR UDPIPAddress;
int SocketReceiveBuffer;
int SocketSendBuffer;
InternetBufferType ReceiveBuffers[WS_NUM_TX_BUFFERS];
InternetBufferType TransmitBuffers[WS_NUM_RX_BUFFERS];
int TXBufferHead;
int TXBufferTail;
int RXBufferHead;
int RXBufferTail;
};
extern TcpipManagerClass Winsock;
extern char PlanetWestwoodIPAddress[IP_ADDRESS_MAX];
extern long PlanetWestwoodPortNumber;
extern bool PlanetWestwoodIsHost;
extern int Read_Game_Options(char *);
#define TXT_WINSOCK_CONNECTING 4567+13
#define TXT_WINSOCK_NOT_CONNECTING 4567+14
#define TXT_WINSOCK_UNABLE_TO_CONNECT_TO_SERVER 4567+15
#define TXT_WINSOCK_CONTACTING_SERVER 4567+16
#define TXT_WINSOCK_SERVER_ADDRESS_LOOKUP_FAILED 4567+17
#define TXT_WINSOCK_UNABLE_TO_ACCEPT_CLIENT 4567+18
#define TXT_WINSOCK_UNABLE_TO_CONNECT 4567+19
#define TXT_WINSOCK_CONNECTION_LOST 4567+20
#define TXT_WINSOCK_RESOLVING_HOST_ADDRESS 4567+21
#endif //WIN32