CnC_Remastered_Collection/TIBERIANDAWN/NULLCONN.CPP

267 lines
12 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: F:\projects\c&c\vcs\code\nullconn.cpv 1.10 16 Oct 1995 16:51:36 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 : NULLCONN.CPP *
* *
* Programmer : Bill Randolph *
* *
* Start Date : April 5, 1995 *
* *
* Last Update : April 20, 1995 [DRD] *
* *
*-------------------------------------------------------------------------*
* Functions: *
* NullModemConnClass::NullModemConnClass -- class constructor *
* NullModemConnClass::~NullModemConnClass -- class destructor *
* NullModemConnClass::Init -- hardware-dependent initialization *
* NullModemConnClass::Send -- hardware-dependent packet sending *
* NullModemConnClass::Compute_CRC -- computes CRC for given buffer *
* NullModemConnClass::Packet_Overhead_Size -- number of extra bytes *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "function.h"
#include "wincomm.h"
#include "tcpip.h"
//PG_TO_FIX
#if (0)
/***************************************************************************
* NullModemConnClass::NullModemConnClass -- class constructor *
* *
* INPUT: *
* numsend desired # send queue entries *
* numreceive desired # send receive entries *
* maxlen max length of application's packets *
* magicnum application-defined magic # for the packets *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 12/20/1994 BR : Created. *
*=========================================================================*/
NullModemConnClass::NullModemConnClass (int numsend, int numreceive,
int maxlen, unsigned short magicnum) :
NonSequencedConnClass (numsend, numreceive, maxlen, magicnum,
60, // Retry Delta Time
-1, // Max Retries (-1 means ignore this timeout parameter)
1200) // Timeout: 20 seconds
{
/*------------------------------------------------------------------------
Pre-set the port value to NULL, so Send won't send until we've been Init'd
------------------------------------------------------------------------*/
PortHandle = NULL;
/*------------------------------------------------------------------------
Allocate the Send Buffer; the parent constructor has set MaxPacketLen,
so we can use it in our computation.
------------------------------------------------------------------------*/
// SendBuf = new char [MaxPacketLen + sizeof(int) * 3];
SendBuf = new char [ Actual_Max_Packet() ];
} /* end of NullModemConnClass */
/***************************************************************************
* NullModemConnClass::~NullModemConnClass -- class destructor *
* *
* INPUT: *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 12/20/1994 BR : Created. *
*=========================================================================*/
NullModemConnClass::~NullModemConnClass ()
{
delete [] SendBuf;
} /* end of ~NullModemConnClass */
/***************************************************************************
* NullModemConnClass::Init -- hardware-dependent initialization *
* *
* INPUT: *
* port GreenLeaf port handle *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 12/20/1994 BR : Created. *
*=========================================================================*/
void NullModemConnClass::Init (HANDLE port_handle)
{
NonSequencedConnClass::Init();
PortHandle = port_handle;
} /* end of Init */
/***************************************************************************
* NullModemConnClass::Send -- hardware-dependent packet sending *
* *
* INPUT: *
* port GreenLeaf port handle *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* 1 = OK, 0 = error *
* *
* HISTORY: *
* 12/20/1994 BR : Created. *
*=========================================================================*/
int NullModemConnClass::Send (char *buf, int buflen)
{
//int status;
int *ibuf;
SerialHeaderType *header;
unsigned long sendlen;
/*------------------------------------------------------------------------
Error if we haven't been properly initialized
------------------------------------------------------------------------*/
if ( PortHandle == NULL )
return(false);
/*------------------------------------------------------------------------
Package the data into the Send Buffer
------------------------------------------------------------------------*/
header = (SerialHeaderType *) SendBuf;
header->MagicNumber = PACKET_SERIAL_START;
header->Length = (short) buflen;
header->MagicNumber2 = PACKET_SERIAL_VERIFY;
sendlen = sizeof( SerialHeaderType );
memcpy (SendBuf + sendlen, buf, buflen);
sendlen += buflen;
ibuf = (int *)(SendBuf + sendlen);
*ibuf = Compute_CRC( buf, buflen );
sendlen += sizeof( int );
*(SendBuf + sendlen) = '\r';
sendlen += 1;
/*------------------------------------------------------------------------
Send the data
------------------------------------------------------------------------*/
//status =
#ifdef FORCE_WINSOCK
if (Winsock.Get_Connected() || GameToPlay == GAME_INTERNET){
Winsock.Write(SendBuf, (int)sendlen);
}else{
SerialPort->Write_To_Serial_Port((unsigned char *)SendBuf, (int)sendlen );
}
#else
SerialPort->Write_To_Serial_Port((unsigned char *)SendBuf, (int)sendlen );
#endif //WINSOCK
//if ( status == ASSUCCESS ) {
return(true);
//} else {
// Smart_Printf( "Write Buffer status %d, Port->status %d, sendlen %d \n", status, Port->status, sendlen );
// return(false);
//}
}
/***************************************************************************
* NullModemConnClass::Compute_CRC -- computes CRC for given buffer *
* *
* INPUT: *
* buf buffer to compute CRC for *
* buflen length of buffer in bytes *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 12/20/1994 BR : Created. *
*=========================================================================*/
int NullModemConnClass::Compute_CRC (char *buf, int buflen)
{
unsigned int sum, hibit;
sum = 0;
for (int i = 0; i < buflen; i++) {
if ( sum & 0x80000000 ) { // check hi bit to rotate into low bit
hibit = 1;
} else {
hibit = 0;
}
sum <<= 1;
sum += (hibit + (unsigned char)buf[i]);
}
return((int)sum);
}
/***************************************************************************
* NullModemConnClass::Packet_Overhead_Size -- number of extra bytes *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* number of bytes used for communications only. *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 04/20/1995 DRD : Created. *
*=========================================================================*/
int NullModemConnClass::Packet_Overhead_Size ( void )
{
//
// short for Null Modem Magic Number
// short for Null Modem length of packet
// int for Null Modem CRC check
// CommHeaderType for Queued packets
//
return( (PACKET_SERIAL_OVERHEAD_SIZE + sizeof(CommHeaderType)) );
} /* end of Packet_Overhead_Size */
#endif