1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc. 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful, 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details. 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// net_vcr.c 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h" 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "net_vcr.h" 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichextern int vcrFile; 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// This is the playback portion of the VCR. It reads the file produced 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// by the recorder and plays it back to the host. The recording contains 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// everything necessary (events, timestamps, and data) to duplicate the game 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// from the viewpoint of everything above the network layer. 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic struct 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich double time; 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int op; 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich long session; 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} next; 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint VCR_Init (void) 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].Init = VCR_Init; 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].SearchForHosts = VCR_SearchForHosts; 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].Connect = VCR_Connect; 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].CheckNewConnections = VCR_CheckNewConnections; 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].QGetMessage = VCR_GetMessage; 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].QSendMessage = VCR_SendMessage; 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].CanSendMessage = VCR_CanSendMessage; 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].Close = VCR_Close; 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich net_drivers[0].Shutdown = VCR_Shutdown; 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileRead(vcrFile, &next, sizeof(next)); 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return 0; 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VCR_ReadNext (void) 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (Sys_FileRead(vcrFile, &next, sizeof(next)) == 0) 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich next.op = 255; 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("=== END OF PLAYBACK===\n"); 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (next.op < 1 || next.op > VCR_MAX_MESSAGE) 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("VCR_ReadNext: bad op"); 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VCR_Listen (qboolean state) 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VCR_Shutdown (void) 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic long getDriverDataAsLong(qsocket_t *sock) { 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich long driverDataAsLong; 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memcpy(&driverDataAsLong, &sock->driverdata, sizeof(long)); 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return driverDataAsLong; 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint VCR_GetMessage (qsocket_t *sock) 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int ret; 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host_time != next.time || next.op != VCR_OP_GETMESSAGE || next.session != getDriverDataAsLong(sock)) 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("VCR missmatch"); 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileRead(vcrFile, &ret, sizeof(int)); 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (ret != 1) 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VCR_ReadNext (); 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return ret; 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileRead(vcrFile, &net_message.cursize, sizeof(int)); 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileRead(vcrFile, net_message.data, net_message.cursize); 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VCR_ReadNext (); 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return 1; 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint VCR_SendMessage (qsocket_t *sock, sizebuf_t *data) 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int ret; 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host_time != next.time || next.op != VCR_OP_SENDMESSAGE || next.session != getDriverDataAsLong(sock)) 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("VCR missmatch"); 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileRead(vcrFile, &ret, sizeof(int)); 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VCR_ReadNext (); 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return ret; 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqboolean VCR_CanSendMessage (qsocket_t *sock) 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qboolean ret; 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host_time != next.time || next.op != VCR_OP_CANSENDMESSAGE || next.session != getDriverDataAsLong(sock)) 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("VCR missmatch"); 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileRead(vcrFile, &ret, sizeof(int)); 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VCR_ReadNext (); 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return ret; 133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VCR_Close (qsocket_t *sock) 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid VCR_SearchForHosts (qboolean xmit) 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqsocket_t *VCR_Connect (const char *host) 147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqsocket_t *VCR_CheckNewConnections (void) 153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich qsocket_t *sock; 155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (host_time != next.time || next.op != VCR_OP_CONNECT) 157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_Error ("VCR missmatch"); 158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!next.session) 160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VCR_ReadNext (); 162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return NULL; 163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich sock = NET_NewQSocket (); 166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memcpy(&sock->driverdata, &next.session, sizeof(long)); 167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Sys_FileRead (vcrFile, sock->address, NET_NAMELEN); 169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich VCR_ReadNext (); 170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return sock; 172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 173