CnC_Remastered_Collection/REDALERT/IPXGCONN.H

204 lines
10 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/IPXGCONN.H 1 3/03/97 10:24a 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 : IPXGCONN.H *
* *
* Programmer : Bill Randolph *
* *
* Start Date : December 19, 1994 *
* *
* Last Update : April 11, 1995 [BR] *
* *
*-------------------------------------------------------------------------*
* *
* This class is a special type of IPX Connection. It can talk to more *
* than one system at a time. It can Broadcast packets to all systems, *
* or send a packet to one individual system. The packets it sends to *
* individual systems can be DATA_NOACK or DATA_ACK packets, but the *
* packets broadcast have to be DATA_NOACK packets. This class is for *
* only the crudest "Who-are-you" type of network communications. Once *
* the IPX Address of another system is identified, a "real" IPX *
* Connection should be created, & further communications done through it. *
* *
* This means that the packet ID field no longer can be used to detect *
* resends, since the receive queue may receive a lot more packets than *
* we send out. So, re-sends cannot be detected; the application must be *
* designed so that it can handle multiple copies of the same packet. *
* *
* The class uses a slightly different header from the normal Connections; *
* this header includes the ProductID of the sender, so multiple *
* applications can share the same socket, but by using different product *
* ID's, can distinguish between their own packets & others. *
* *
* Because of this additional header, and because Receive ACK/Retry logic *
* is different (we can't detect resends), the following routines are *
* overloaded: *
* Send_Packet: must embed the product ID into the packet header *
* Receive_Packet: must detect resends via the LastAddress & *
* LastPacketID arrays. This class doesn't ACK *
* packets until Service_Receive_Queue is called; *
* the parent classes ACK the packet when it's *
* received. *
* Get_Packet: extracts the product ID from the header; *
* doesn't care about reading packets in order *
* Send is capable of broadcasting the packet, or sending *
* to a specific address *
* *
* This class also has the ability to cross a Novell Network Bridge. *
* You provide the class with the bridge address, and subsequent *
* broadcasts are sent across the bridge as well as to the local network. *
* Address-specific sends contain the destination network's address, *
* so they cross a bridge automatically; it's just the broadcasts *
* that need to know the bridge address. *
* *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef IPXGLOBALCONN_H
#define IPXGLOBALCONN_H
#include "ipxconn.h"
/*
********************************** Defines **********************************
*/
//---------------------------------------------------------------------------
// This is the header for Global Connection messages. It includes the usual
// "standard" header that the other connections do; but it also includes an
// IPX address field, so the application can get the address of the sender
// of this message. This address field must be provided in by the IPX
// Connection Manager class, when it calls this class's Receive_Packet
// function.
//---------------------------------------------------------------------------
typedef struct {
CommHeaderType Header;
unsigned short ProductID;
} GlobalHeaderType;
/*
***************************** Class Declaration *****************************
*/
class IPXGlobalConnClass : public IPXConnClass
{
//------------------------------------------------------------------------
// Public Interface
//------------------------------------------------------------------------
public:
//.....................................................................
// Some useful enums:
//.....................................................................
enum GlobalConnectionEnum {
//..................................................................
// This is the magic number for all Global Connections. Having the
// same magic number across products lets us ID different products
// on the net. If you change the fundamental connection protocol,
// you must use a different magic number.
//..................................................................
//GLOBAL_MAGICNUM = 0x1234, // used for C&C 1
GLOBAL_MAGICNUM = 0x1235, // used for C&C 0
//..................................................................
// These are the values used for the ProductID field in the Global
// Message structure. It also should be the Magic Number used for
// the private connections within that product.
// This list should be continually updated & kept current. Never
// ever ever use an old product ID for your product!
//..................................................................
COMMAND_AND_CONQUER = 0xaa01,
COMMAND_AND_CONQUER0 = 0xaa00
};
//.....................................................................
// Constructor/destructor.
//.....................................................................
IPXGlobalConnClass (int numsend, int numrecieve, int maxlen,
unsigned short product_id);
virtual ~IPXGlobalConnClass () {};
//.....................................................................
// Send/Receive routines.
//.....................................................................
virtual int Send_Packet (void * buf, int buflen,
IPXAddressClass *address, int ack_req);
virtual int Receive_Packet (void * buf, int buflen,
IPXAddressClass *address);
virtual int Get_Packet (void * buf, int *buflen,
IPXAddressClass *address, unsigned short *product_id);
//.....................................................................
// This is for telling the connection it can cross a bridge.
//.....................................................................
void Set_Bridge (NetNumType bridge);
//.....................................................................
// The Product ID for this product.
//.....................................................................
unsigned short ProductID;
//.....................................................................
// This describes the address of a bridge we have to cross. This class
// supports crossing only one bridge. Storing the bridge's network
// number allows us to obtain its local target address only once, then
// re-use it.
//.....................................................................
NetNumType BridgeNet;
NetNodeType BridgeNode;
int IsBridge;
//------------------------------------------------------------------------
// Protected Interface
//------------------------------------------------------------------------
protected:
//.....................................................................
// This is the overloaded Send routine declared in ConnectionClass, and
// used in SequencedConnClass. This special version sends to the address
// stored in the extra buffer within the Queue.
//.....................................................................
virtual int Send (char *buf, int buflen, void *extrabuf, int extralen);
//.....................................................................
// This routine is overloaded from SequencedConnClass, because the
// Global Connection needs to ACK its packets differently from the
// other connections.
//.....................................................................
virtual int Service_Receive_Queue (void);
private:
//.....................................................................
// Since we can't detect resends by using the PacketID (since we're
// receiving packets from a variety of sources, all using different
// ID's), we'll have to remember the last 'n' packet addresses & id's
// for comparison purposes.
// Note that, if network traffic is heavy, it's still possible for an
// app to receive the same packet twice!
//.....................................................................
IPXAddressClass LastAddress[4]; // array of last 4 addresses
unsigned long LastPacketID[4]; // array of last 4 packet ID's
int LastRXIndex; // index of next avail pos
};
#endif
/*************************** end of ipxgconn.h *****************************/