CnC_Remastered_Collection/REDALERT/NULLCONN.CPP

285 lines
13 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/NULLCONN.CPP 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 : 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"
#ifdef WIN32
#include "wincomm.h"
#endif //WIN32
#include <stdio.h>
//#include <mem.h>
#include "nullconn.h"
/***************************************************************************
* 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) :
ConnectionClass (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
------------------------------------------------------------------------*/
#ifdef WIN32
PortHandle = NULL;
#else //WIN32
Port = NULL;
#endif //WIN32
/*------------------------------------------------------------------------
Allocate the Send Buffer; the parent constructor has set MaxPacketLen,
so we can use it in our computation.
------------------------------------------------------------------------*/
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. *
*=========================================================================*/
#ifdef WIN32
void NullModemConnClass::Init (HANDLE port_handle)
{
ConnectionClass::Init();
PortHandle = port_handle;
}
#else //WIN32
void NullModemConnClass::Init (PORT *port)
{
ConnectionClass::Init();
Port = port;
} /* end of Init */
#endif //WIN32
/***************************************************************************
* NullModemConnClass::Send -- hardware-dependent packet sending *
* *
* INPUT: *
* buf buffer to send *
* buflen length of buffer to send *
* extrabuf (not used by this class) *
* extralen (not used by this class) *
* *
* OUTPUT: *
* none. *
* *
* WARNINGS: *
* 1 = OK, 0 = error *
* *
* HISTORY: *
* 12/20/1994 BR : Created. *
*=========================================================================*/
int NullModemConnClass::Send (char *buf, int buflen, void *, int )
{
return 0;
#if (0)//PG
int *ibuf;
SerialHeaderType *header;
unsigned long sendlen;
/*------------------------------------------------------------------------
Error if we haven't been properly initialized
------------------------------------------------------------------------*/
#ifdef WIN32
if ( PortHandle == NULL ) return(false);
#else //WIN32
int status;
if ( Port == NULL ) {
return(0);
}
#endif //WIN32
/*------------------------------------------------------------------------
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
------------------------------------------------------------------------*/
#ifdef WIN32
SerialPort->Write_To_Serial_Port((unsigned char *)SendBuf, (int)sendlen );
return (true);
#else //WIN32
status = WriteBuffer( Port, SendBuf, sendlen );
if ( status == ASSUCCESS ) {
return(1);
}
else {
return(0);
}
#endif //WIN32
#endif//PG
} /* end of Send */
/***************************************************************************
* 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);
} /* end of Compute_CRC */
/***************************************************************************
* 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 */
/************************** end of nullconn.cpp ****************************/