123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- //
- // 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: F:\projects\c&c\vcs\code\connect.cpv 1.9 16 Oct 1995 16:48:56 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 : CONNECT.CPP *
- * *
- * Programmer : Bill Randolph *
- * *
- * Start Date : December 20, 1994 *
- * *
- * Last Update : May 31, 1995 [BRR] *
- *-------------------------------------------------------------------------*
- * Functions: *
- * ConnectionClass::ConnectionClass -- class constructor *
- * ConnectionClass::~ConnectionClass -- class destructor *
- * ConnectionClass::Service -- main polling routine; services packets *
- * ConnectionClass::Time -- gets current time *
- * ConnectionClass::Command_Name -- returns name for a packet command *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "function.h"
- #ifdef WWLIB32_H
- #include "TIMER.H"
- #else
- #include <sys\timeb.h>
- #endif
- /*
- ********************************* Globals ***********************************
- */
- char *ConnectionClass::Commands[PACKET_COUNT] = {
- "ADATA",
- "NDATA",
- "ACK"
- };
- /***************************************************************************
- * ConnectionClass::ConnectionClass -- class constructor *
- * *
- * If either max_retries or timeout is -1, that parameter is ignored in *
- * timeout computations. If both are -1, the connection will just keep *
- * retrying forever. *
- * *
- * INPUT: *
- * numsend desired # of entries for the send queue *
- * numreceive desired # of entries for the recieve queue *
- * maxlen max length of an application packet *
- * magicnum the packet "magic number" for this connection *
- * retry_delta the time to wait between sends *
- * max_retries the max # of retries allowed for a packet *
- * (-1 means retry forever, based on this parameter) *
- * timeout the max amount of time before we give up on a packet *
- * (-1 means retry forever, based on this parameter) *
- * *
- * OUTPUT: *
- * none. *
- * *
- * WARNINGS: *
- * none. *
- * *
- * HISTORY: *
- * 12/20/1994 BR : Created. *
- *=========================================================================*/
- ConnectionClass::ConnectionClass (int maxlen, unsigned short magicnum,
- unsigned long retry_delta, unsigned long max_retries, unsigned long timeout)
- {
- /*------------------------------------------------------------------------
- Compute our maximum packet length
- ------------------------------------------------------------------------*/
- MaxPacketLen = maxlen + sizeof(CommHeaderType);
- /*------------------------------------------------------------------------
- Assign the magic number
- ------------------------------------------------------------------------*/
- MagicNum = magicnum;
- /*------------------------------------------------------------------------
- Initialize the retry time. This is the time that t2 - t1 must be greater
- than before a retry will occur.
- ------------------------------------------------------------------------*/
- RetryDelta = retry_delta;
- /*------------------------------------------------------------------------
- Set the maximum allowable retries.
- ------------------------------------------------------------------------*/
- MaxRetries = max_retries;
- /*------------------------------------------------------------------------
- Set the timeout for this connection.
- ------------------------------------------------------------------------*/
- Timeout = timeout;
- /*------------------------------------------------------------------------
- Allocate the packet staging buffer. This will be used to
- ------------------------------------------------------------------------*/
- PacketBuf = new char[ MaxPacketLen ];
- } /* end of ConnectionClass */
- /***************************************************************************
- * ConnectionClass::~ConnectionClass -- class destructor *
- * *
- * INPUT: *
- * none. *
- * *
- * OUTPUT: *
- * none. *
- * *
- * WARNINGS: *
- * none. *
- * *
- * HISTORY: *
- * 12/20/1994 BR : Created. *
- *=========================================================================*/
- ConnectionClass::~ConnectionClass ()
- {
- /*------------------------------------------------------------------------
- Free memory.
- ------------------------------------------------------------------------*/
- delete [] PacketBuf;
- } /* end of ~ConnectionClass */
- /***************************************************************************
- * ConnectionClass::Service -- main polling routine; services packets *
- * *
- * INPUT: *
- * none. *
- * *
- * OUTPUT: *
- * 1 = OK, 0 = error (connection is broken!) *
- * *
- * WARNINGS: *
- * none. *
- * *
- * HISTORY: *
- * 12/20/1994 BR : Created. *
- *=========================================================================*/
- int ConnectionClass::Service (void)
- {
- /*------------------------------------------------------------------------
- Service the Send Queue. This [re]sends packets in the Send Queue which
- haven't been ACK'd yet, and if their retry timeout has expired, and
- updates the FirstTime, LastTime & SendCount values in the Queue entry.
- Entries that have been ACK'd should be removed.
- ------------------------------------------------------------------------*/
- // if (!Service_Send_Queue())
- // return(0);
- /*------------------------------------------------------------------------
- Service the Receive Queue. This sends ACKs for packets that haven't
- been ACK'd yet. Entries that the app has read, and have been ACK'd,
- should be removed.
- ------------------------------------------------------------------------*/
- // if (!Service_Receive_Queue())
- // return(0);
- // return(1);
- if ( Service_Send_Queue() && Service_Receive_Queue() ) {
- return(1);
- } else {
- return(0);
- }
- } /* end of Service */
- // ST = 12/17/2018 5:44PM
- #ifndef TickCount
- extern TimerClass TickCount;
- #endif
- /***************************************************************************
- * ConnectionClass::Time -- gets current time *
- * *
- * INPUT: *
- * *
- * OUTPUT: *
- * none. *
- * *
- * WARNINGS: *
- * none. *
- * *
- * HISTORY: *
- * 12/20/1994 BR : Created. *
- *=========================================================================*/
- unsigned long ConnectionClass::Time (void)
- {
- #ifdef WWLIB32_H
- return(TickCount.Time()); // Westwood Library time
- #else
- static struct timeb mytime; // DOS time
- unsigned long msec;
- ftime(&mytime);
- msec = (unsigned long)mytime.time * 1000L + (unsigned long)mytime.millitm;
- return((msec / 100) * 6);
- #endif
- } /* end of Time */
- /***************************************************************************
- * ConnectionClass::Command_Name -- returns name for given packet command *
- * *
- * INPUT: *
- * command packet Command value to get name for *
- * *
- * OUTPUT: *
- * ptr to command name, NULL if invalid *
- * *
- * WARNINGS: *
- * none. *
- * *
- * HISTORY: *
- * 05/31/1995 BRR : Created. *
- *=========================================================================*/
- char *ConnectionClass::Command_Name(int command)
- {
- if (command >= 0 && command < PACKET_COUNT) {
- return(Commands[command]);
- } else {
- return(NULL);
- }
- }
|