network_data.c
author Darkvater
Sat, 02 Apr 2005 23:05:09 +0000
changeset 1632 10c391e108b7
parent 1299 39c06aba09aa
child 1820 d03c56850dc2
permissions -rw-r--r--
(svn r2136) - Fix: [ 1174313 ] terrain hotkeys nonfunctional in scenario editor (D,Q,W,E,R,T,Y,U fltr)
- Fix: 'L' no longer opens ingame terraform bar in scenario editor bar, but the land generator one
- Feature: [ 1095110 ] Create Lake and draggable Create Desert tools (initial implementation GoneWacko), also added sticky buttons to land generator and town generator
- CodeChange: moved around some of the draggable tools, demystifying them
- CodeChange: change CmdBuildCanal to allow for XANDY dragging not only X or Y (only scenario editor)
- CodeChange: add some more enums to sprites.
- TODO: merge most of the ingame and scenario editor land terraform code. This can only be done after OnClickButton function is changed so it also includes the backreference to the widget being clicked, postponed to after 0.4.0
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     1
#include "stdafx.h"
1299
39c06aba09aa (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1095
diff changeset
     2
#include "debug.h"
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     3
#include "network_data.h"
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     4
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     5
// Is the network enabled?
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     6
#ifdef ENABLE_NETWORK
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     7
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     8
#include "table/strings.h"
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
     9
#include "network_client.h"
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    10
#include "command.h"
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    11
#include "callback_table.h"
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    12
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    13
// This files handles the send/receive of all packets
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    14
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    15
// Create a packet for sending
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    16
Packet *NetworkSend_Init(PacketType type)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    17
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    18
	Packet *packet = malloc(sizeof(Packet));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    19
	// An error is inplace here, because it simply means we ran out of memory.
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    20
	if (packet == NULL) error("Failed to allocate Packet");
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    21
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    22
	// Skip the size so we can write that in before sending the packet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    23
	packet->size = sizeof(packet->size);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    24
	packet->buffer[packet->size++] = type;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    25
	packet->pos = 0;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    26
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    27
	return packet;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    28
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    29
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    30
// The next couple of functions make sure we can send
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    31
//  uint8, uint16, uint32 and uint64 endian-safe
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    32
//  over the network. The order it uses is:
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    33
//
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    34
//  1 2 3 4
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    35
//
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    36
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    37
void NetworkSend_uint8(Packet *packet, uint8 data)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    38
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    39
	assert(packet->size < sizeof(packet->buffer) - sizeof(data));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    40
	packet->buffer[packet->size++] = data & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    41
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    42
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    43
void NetworkSend_uint16(Packet *packet, uint16 data)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    44
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    45
	assert(packet->size < sizeof(packet->buffer) - sizeof(data));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    46
	packet->buffer[packet->size++] = data & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    47
	packet->buffer[packet->size++] = (data >> 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    48
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    49
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    50
void NetworkSend_uint32(Packet *packet, uint32 data)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    51
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    52
	assert(packet->size < sizeof(packet->buffer) - sizeof(data));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    53
	packet->buffer[packet->size++] = data & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    54
	packet->buffer[packet->size++] = (data >>= 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    55
	packet->buffer[packet->size++] = (data >>= 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    56
	packet->buffer[packet->size++] = (data >> 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    57
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    58
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    59
void NetworkSend_uint64(Packet *packet, uint64 data)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    60
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    61
	assert(packet->size < sizeof(packet->buffer) - sizeof(data));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    62
	packet->buffer[packet->size++] = data & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    63
	packet->buffer[packet->size++] = (data >>= 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    64
	packet->buffer[packet->size++] = (data >>= 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    65
	packet->buffer[packet->size++] = (data >>= 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    66
	packet->buffer[packet->size++] = (data >>= 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    67
	packet->buffer[packet->size++] = (data >>= 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    68
	packet->buffer[packet->size++] = (data >>= 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    69
	packet->buffer[packet->size++] = (data >> 8) & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    70
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    71
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    72
// Sends a string over the network. It sends out
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    73
//  the string + '\0'. No size-byte or something.
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    74
void NetworkSend_string(Packet *packet, const char* data)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    75
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    76
	assert(data != NULL);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    77
	assert(packet->size < sizeof(packet->buffer) - strlen(data) - 1);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    78
	while ((packet->buffer[packet->size++] = *data++) != '\0') {}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    79
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    80
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    81
// If PacketSize changes of size, you have to change the 2 packet->size
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    82
//   lines below matching the size of packet->size/PacketSize!
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    83
// (line 'packet->buffer[0] = packet->size & 0xFF;'  and below)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    84
assert_compile(sizeof(PacketSize) == 2);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    85
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    86
// This function puts the packet in the send-queue and it is send
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    87
//  as soon as possible
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    88
// (that is: the next tick, or maybe one tick later if the
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    89
//   OS-network-buffer is full)
716
8af847728d5b (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 543
diff changeset
    90
void NetworkSend_Packet(Packet *packet, NetworkClientState *cs)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    91
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    92
	Packet *p;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    93
	assert(packet != NULL);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    94
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    95
	packet->pos = 0;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    96
	packet->next = NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    97
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    98
	packet->buffer[0] = packet->size & 0xFF;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
    99
	packet->buffer[1] = packet->size >> 8;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   100
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   101
	// Locate last packet buffered for the client
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   102
	p = cs->packet_queue;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   103
	if (p == NULL) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   104
		// No packets yet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   105
		cs->packet_queue = packet;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   106
	} else {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   107
		// Skip to the last packet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   108
		while (p->next != NULL) p = p->next;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   109
		p->next = packet;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   110
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   111
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   112
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   113
// Functions to help NetworkRecv_Packet/NetworkSend_Packet a bit
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   114
//  A socket can make errors. When that happens
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   115
//  this handles what to do.
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   116
// For clients: close connection and drop back to main-menu
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   117
// For servers: close connection and that is it
1095
b59632d9df1b (svn r1596) Add some more statics
tron
parents: 903
diff changeset
   118
static NetworkRecvStatus CloseConnection(NetworkClientState *cs)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   119
{
716
8af847728d5b (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 543
diff changeset
   120
	NetworkCloseClient(cs);
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   121
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   122
	// Clients drop back to the main menu
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   123
	if (!_network_server) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   124
		_switch_mode = SM_MENU;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   125
		_networking = false;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   126
		_switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   127
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   128
		return NETWORK_RECV_STATUS_CONN_LOST;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   129
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   130
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   131
	return NETWORK_RECV_STATUS_OKAY;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   132
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   133
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   134
// Sends all the buffered packets out for this client
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   135
//  it stops when:
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   136
//   1) all packets are send (queue is empty)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   137
//   2) the OS reports back that it can not send any more
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   138
//        data right now (full network-buffer, it happens ;))
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   139
//   3) sending took too long
716
8af847728d5b (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 543
diff changeset
   140
bool NetworkSend_Packets(NetworkClientState *cs)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   141
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   142
	ssize_t res;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   143
	Packet *p;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   144
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   145
	// We can not write to this socket!!
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   146
	if (!cs->writable) return false;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   147
	if (cs->socket == INVALID_SOCKET) return false;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   148
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   149
	p = cs->packet_queue;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   150
	while (p != NULL) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   151
		res = send(cs->socket, p->buffer + p->pos, p->size - p->pos, 0);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   152
		if (res == -1) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   153
			int err = GET_LAST_ERROR();
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   154
			if (err != EWOULDBLOCK) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   155
				// Something went wrong.. close client!
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   156
				DEBUG(net, 0) ("[NET] send() failed with error %d", err);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   157
				CloseConnection(cs);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   158
				return false;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   159
			}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   160
			return true;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   161
		}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   162
		if (res == 0) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   163
			// Client/server has left us :(
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   164
			CloseConnection(cs);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   165
			return false;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   166
		}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   167
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   168
		p->pos += res;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   169
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   170
		// Is this packet sent?
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   171
		if (p->pos == p->size) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   172
			// Go to the next packet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   173
			cs->packet_queue = p->next;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   174
			free(p);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   175
			p = cs->packet_queue;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   176
		} else
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   177
			return true;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   178
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   179
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   180
	return true;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   181
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   182
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   183
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   184
// Receiving commands
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   185
// Again, the next couple of functions are endian-safe
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   186
//  see the comment around NetworkSend_uint8 for more info.
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   187
uint8 NetworkRecv_uint8(NetworkClientState *cs, Packet *packet)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   188
{
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   189
	/* Don't allow reading from a closed socket */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   190
	if (cs->quited)
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   191
		return 0;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   192
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   193
	/* Check if variable is within packet-size */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   194
	if (packet->pos + 1 > packet->size) {
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   195
		CloseConnection(cs);
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   196
		return 0;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   197
	}
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   198
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   199
	return packet->buffer[packet->pos++];
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   200
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   201
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   202
uint16 NetworkRecv_uint16(NetworkClientState *cs, Packet *packet)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   203
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   204
	uint16 n;
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   205
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   206
	/* Don't allow reading from a closed socket */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   207
	if (cs->quited)
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   208
		return 0;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   209
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   210
	/* Check if variable is within packet-size */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   211
	if (packet->pos + 2 > packet->size) {
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   212
		CloseConnection(cs);
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   213
		return 0;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   214
	}
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   215
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   216
	n  = (uint16)packet->buffer[packet->pos++];
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   217
	n += (uint16)packet->buffer[packet->pos++] << 8;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   218
	return n;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   219
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   220
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   221
uint32 NetworkRecv_uint32(NetworkClientState *cs, Packet *packet)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   222
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   223
	uint32 n;
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   224
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   225
	/* Don't allow reading from a closed socket */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   226
	if (cs->quited)
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   227
		return 0;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   228
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   229
	/* Check if variable is within packet-size */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   230
	if (packet->pos + 4 > packet->size) {
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   231
		CloseConnection(cs);
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   232
		return 0;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   233
	}
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   234
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   235
	n  = (uint32)packet->buffer[packet->pos++];
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   236
	n += (uint32)packet->buffer[packet->pos++] << 8;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   237
	n += (uint32)packet->buffer[packet->pos++] << 16;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   238
	n += (uint32)packet->buffer[packet->pos++] << 24;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   239
	return n;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   240
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   241
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   242
uint64 NetworkRecv_uint64(NetworkClientState *cs, Packet *packet)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   243
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   244
	uint64 n;
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   245
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   246
	/* Don't allow reading from a closed socket */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   247
	if (cs->quited)
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   248
		return 0;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   249
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   250
	/* Check if variable is within packet-size */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   251
	if (packet->pos + 8 > packet->size) {
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   252
		CloseConnection(cs);
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   253
		return 0;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   254
	}
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   255
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   256
	n  = (uint64)packet->buffer[packet->pos++];
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   257
	n += (uint64)packet->buffer[packet->pos++] << 8;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   258
	n += (uint64)packet->buffer[packet->pos++] << 16;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   259
	n += (uint64)packet->buffer[packet->pos++] << 24;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   260
	n += (uint64)packet->buffer[packet->pos++] << 32;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   261
	n += (uint64)packet->buffer[packet->pos++] << 40;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   262
	n += (uint64)packet->buffer[packet->pos++] << 48;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   263
	n += (uint64)packet->buffer[packet->pos++] << 56;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   264
	return n;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   265
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   266
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   267
// Reads a string till it finds a '\0' in the stream
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   268
void NetworkRecv_string(NetworkClientState *cs, Packet *p, char* buffer, size_t size)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   269
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   270
	int pos;
903
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   271
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   272
	/* Don't allow reading from a closed socket */
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   273
	if (cs->quited)
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   274
		return;
a301a264e0fc (svn r1389) -Add: [Network] Added packet protection. No longer a client or server
truelight
parents: 826
diff changeset
   275
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   276
	pos = p->pos;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   277
	while (--size > 0 && pos < p->size && (*buffer++ = p->buffer[pos++]) != '\0') {}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   278
	if (size == 0 || pos == p->size)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   279
	{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   280
		*buffer = '\0';
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   281
		// If size was sooner to zero then the string in the stream
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   282
		//  skip till the \0, so the packet can be read out correctly for the rest
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   283
		while (pos < p->size && p->buffer[pos] != '\0') ++pos;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   284
		++pos;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   285
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   286
	p->pos = pos;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   287
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   288
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   289
// If PacketSize changes of size, you have to change the 2 packet->size
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   290
//   lines below matching the size of packet->size/PacketSize!
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   291
// (the line: 'p->size = (uint16)p->buffer[0];' and below)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   292
assert_compile(sizeof(PacketSize) == 2);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   293
716
8af847728d5b (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 543
diff changeset
   294
Packet *NetworkRecv_Packet(NetworkClientState *cs, NetworkRecvStatus *status)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   295
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   296
	ssize_t res;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   297
	Packet *p;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   298
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   299
	*status = NETWORK_RECV_STATUS_OKAY;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   300
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   301
	if (cs->socket == INVALID_SOCKET) return NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   302
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   303
	if (cs->packet_recv == NULL) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   304
		cs->packet_recv = malloc(sizeof(Packet));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   305
		if (cs->packet_recv == NULL) error("Failed to allocate packet");
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   306
		// Set pos to zero!
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   307
		cs->packet_recv->pos = 0;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   308
		cs->packet_recv->size = 0; // Can be ommited, just for safety reasons
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   309
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   310
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   311
	p = cs->packet_recv;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   312
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   313
	// Read packet size
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   314
	if (p->pos < sizeof(PacketSize)) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   315
		while (p->pos < sizeof(PacketSize)) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   316
			// Read the size of the packet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   317
			res = recv(cs->socket, p->buffer + p->pos, sizeof(PacketSize) - p->pos, 0);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   318
			if (res == -1) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   319
				int err = GET_LAST_ERROR();
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   320
				if (err != EWOULDBLOCK) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   321
					// Something went wrong..
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   322
					if (err != 104) // 104 is Connection Reset by Peer
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   323
						DEBUG(net, 0) ("[NET] recv() failed with error %d", err);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   324
					*status = CloseConnection(cs);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   325
					return NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   326
				}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   327
				// Connection would block, so stop for now
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   328
				return NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   329
			}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   330
			if (res == 0) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   331
				// Client/server has left us :(
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   332
				*status = CloseConnection(cs);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   333
				return NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   334
			}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   335
			p->pos += res;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   336
		}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   337
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   338
		p->size = (uint16)p->buffer[0];
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   339
		p->size += (uint16)p->buffer[1] << 8;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   340
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   341
		if (p->size > SEND_MTU) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   342
			*status = CloseConnection(cs);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   343
			return NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   344
		}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   345
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   346
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   347
	// Read rest of packet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   348
	while (p->pos < p->size) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   349
		res = recv(cs->socket, p->buffer + p->pos, p->size - p->pos, 0);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   350
		if (res == -1) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   351
			int err = GET_LAST_ERROR();
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   352
			if (err != EWOULDBLOCK) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   353
				// Something went wrong..
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   354
				if (err != 104) // 104 is Connection Reset by Peer
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   355
					DEBUG(net, 0) ("[NET] recv() failed with error %d", err);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   356
				*status = CloseConnection(cs);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   357
				return NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   358
			}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   359
			// Connection would block
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   360
			return NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   361
		}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   362
		if (res == 0) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   363
			// Client/server has left us :(
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   364
			*status = CloseConnection(cs);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   365
			return NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   366
		}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   367
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   368
		p->pos += res;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   369
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   370
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   371
	// We have a complete packet, return it!
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   372
	p->pos = 2;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   373
	p->next = NULL; // Should not be needed, but who knows...
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   374
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   375
	// Prepare for receiving a new packet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   376
	cs->packet_recv = NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   377
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   378
	return p;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   379
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   380
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   381
// Add a command to the local command queue
716
8af847728d5b (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 543
diff changeset
   382
void NetworkAddCommandQueue(NetworkClientState *cs, CommandPacket *cp)
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   383
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   384
	CommandPacket *new_cp = malloc(sizeof(CommandPacket));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   385
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   386
	*new_cp = *cp;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   387
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   388
	if (cs->command_queue == NULL)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   389
		cs->command_queue = new_cp;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   390
	else {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   391
		CommandPacket *c = cs->command_queue;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   392
		while (c->next != NULL) c = c->next;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   393
		c->next = new_cp;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   394
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   395
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   396
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   397
// If this fails, make sure you change the following line below:
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   398
//   'memcpy(qp->dp, _decode_parameters, 10 * sizeof(uint32));'
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   399
// Also, in network_data.h, change the size of CommandPacket->dp!
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   400
// (this protection is there to make sure in network.h dp is of the right size!)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   401
assert_compile(sizeof(_decode_parameters) == 20 * sizeof(uint32));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   402
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   403
// Prepare a DoCommand to be send over the network
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   404
void NetworkSend_Command(uint32 tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   405
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   406
	CommandPacket *c = malloc(sizeof(CommandPacket));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   407
	byte temp_callback;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   408
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   409
	c->player = _local_player;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   410
	c->next = NULL;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   411
	c->tile = tile;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   412
	c->p1 = p1;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   413
	c->p2 = p2;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   414
	c->cmd = cmd;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   415
	c->callback = 0;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   416
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   417
	temp_callback = 0;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   418
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   419
	while (temp_callback < _callback_table_count && _callback_table[temp_callback] != callback)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   420
		temp_callback++;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   421
	if (temp_callback == _callback_table_count) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   422
		DEBUG(net, 0) ("[NET] Unknown callback. (Pointer: %p) No callback sent.", callback);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   423
		temp_callback = 0; /* _callback_table[0] == NULL */
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   424
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   425
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   426
	if (_network_server) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   427
		// We are the server, so set the command to be executed next possible frame
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   428
		c->frame = _frame_counter_max + 1;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   429
	} else {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   430
		c->frame = 0; // The client can't tell which frame, so just make it 0
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   431
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   432
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   433
	// Copy the _decode_parameters to dp
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   434
	memcpy(c->dp, _decode_parameters, 20 * sizeof(uint32));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   435
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   436
	if (_network_server) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   437
		// If we are the server, we queue the command in our 'special' queue.
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   438
		//   In theory, we could execute the command right away, but then the
826
fff56bbc3606 (svn r1297) Language fixes in the source.. (ln-)
miham
parents: 716
diff changeset
   439
		//   client on the server can do everything 1 tick faster than others.
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   440
		//   So to keep the game fair, we delay the command with 1 tick
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   441
		//   which gives about the same speed as most clients.
716
8af847728d5b (svn r1168) -Cleanup: [Network] Cleaned the network code a bit. Added 'const'
truelight
parents: 543
diff changeset
   442
		NetworkClientState *cs;
543
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   443
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   444
		// And we queue it for delivery to the clients
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   445
		FOR_ALL_CLIENTS(cs) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   446
			if (cs->status > STATUS_AUTH) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   447
				NetworkAddCommandQueue(cs, c);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   448
			}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   449
		}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   450
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   451
		// Only the server gets the callback, because clients should not get them
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   452
		c->callback = temp_callback;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   453
		if (_local_command_queue == NULL) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   454
			_local_command_queue = c;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   455
		} else {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   456
			// Find last packet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   457
			CommandPacket *cp = _local_command_queue;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   458
			while (cp->next != NULL) cp = cp->next;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   459
			cp->next = c;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   460
		}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   461
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   462
		return;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   463
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   464
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   465
	// Clients send their command to the server and forget all about the packet
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   466
	c->callback = temp_callback;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   467
	SEND_COMMAND(PACKET_CLIENT_COMMAND)(c);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   468
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   469
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   470
// Execute a DoCommand we received from the network
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   471
void NetworkExecuteCommand(CommandPacket *cp)
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   472
{
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   473
	_current_player = cp->player;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   474
	memcpy(_decode_parameters, cp->dp, sizeof(cp->dp));
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   475
	/* cp->callback is unsigned. so we don't need to do lower bounds checking. */
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   476
	if (cp->callback > _callback_table_count) {
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   477
		DEBUG(net,0) ("[NET] Received out-of-bounds callback! (%d)", cp->callback);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   478
		cp->callback = 0;
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   479
	}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   480
	DoCommandP(cp->tile, cp->p1, cp->p2, _callback_table[cp->callback], cp->cmd | CMD_NETWORK_COMMAND);
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   481
}
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   482
946badd71033 (svn r942) -Merged branch/network back into the trunk
truelight
parents:
diff changeset
   483
#endif /* ENABLE_NETWORK */