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