2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\r
7 GtkRadiant is free software; you can redistribute it and/or modify
\r
8 it under the terms of the GNU General Public License as published by
\r
9 the Free Software Foundation; either version 2 of the License, or
\r
10 (at your option) any later version.
\r
12 GtkRadiant is distributed in the hope that it will be useful,
\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 GNU General Public License for more details.
\r
17 You should have received a copy of the GNU General Public License
\r
18 along with GtkRadiant; if not, write to the Free Software
\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\r
22 //====================================================================
\r
26 // Programmer: MrElusive
\r
30 //====================================================================
\r
37 #include "l_net_wins.h"
\r
39 #define GetMemory malloc
\r
40 #define FreeMemory free
\r
46 void WinPrint(char *str, ...)
\r
51 va_start (argptr,str);
\r
52 vsprintf (text, str, argptr);
\r
58 void WinPrint(char *str, ...)
\r
63 //===========================================================================
\r
67 // Changes Globals: -
\r
68 //===========================================================================
\r
69 void Net_SetAddressPort(address_t *address, int port)
\r
73 WINS_StringToAddr(address->ip, &addr);
\r
74 WINS_SetSocketPort(&addr, port);
\r
75 strcpy(address->ip, WINS_AddrToString(&addr));
\r
76 } //end of the function Net_SetAddressPort
\r
77 //===========================================================================
\r
81 // Changes Globals: -
\r
82 //===========================================================================
\r
83 int Net_AddressCompare(address_t *addr1, address_t *addr2)
\r
86 return stricmp(addr1->ip, addr2->ip);
\r
89 return strcasecmp(addr1->ip, addr2->ip);
\r
91 } //end of the function Net_AddressCompare
\r
92 //===========================================================================
\r
96 // Changes Globals: -
\r
97 //===========================================================================
\r
98 void Net_SocketToAddress(socket_t *sock, address_t *address)
\r
100 strcpy(address->ip, WINS_AddrToString(&sock->addr));
\r
101 } //end of the function Net_SocketToAddress
\r
102 //===========================================================================
\r
106 // Changes Globals: -
\r
107 //===========================================================================
\r
108 int Net_Send(socket_t *sock, netmessage_t *msg)
\r
114 NMSG_WriteLong(msg, size-4);
\r
116 //WinPrint("Net_Send: message of size %d\n", sendmsg.size);
\r
117 return WINS_Write(sock->socket, msg->data, msg->size, NULL);
\r
118 } //end of the function Net_SendSocketReliable
\r
119 //===========================================================================
\r
120 // returns the number of bytes recieved
\r
125 // Changes Globals: -
\r
126 //===========================================================================
\r
127 int Net_Receive(socket_t *sock, netmessage_t *msg)
\r
131 if (sock->remaining > 0)
\r
133 curread = WINS_Read(sock->socket, &sock->msg.data[sock->msg.size], sock->remaining, NULL);
\r
136 WinPrint("Net_Receive: read error\n");
\r
139 sock->remaining -= curread;
\r
140 sock->msg.size += curread;
\r
141 if (sock->remaining <= 0)
\r
143 sock->remaining = 0;
\r
144 memcpy(msg, &sock->msg, sizeof(netmessage_t));
\r
145 sock->msg.size = 0;
\r
146 return msg->size - 4;
\r
150 sock->msg.size = WINS_Read(sock->socket, sock->msg.data, 4, NULL);
\r
151 if (sock->msg.size == 0) return 0;
\r
152 if (sock->msg.size == -1)
\r
154 WinPrint("Net_Receive: size header read error\n");
\r
157 //WinPrint("Net_Receive: message size header %d\n", msg->size);
\r
158 sock->msg.read = 0;
\r
159 sock->remaining = NMSG_ReadLong(&sock->msg);
\r
160 if (sock->remaining == 0) return 0;
\r
161 if (sock->remaining < 0 || sock->remaining > MAX_NETMESSAGE)
\r
163 WinPrint("Net_Receive: invalid message size %d\n", sock->remaining);
\r
166 //try to read the message
\r
167 curread = WINS_Read(sock->socket, &sock->msg.data[sock->msg.size], sock->remaining, NULL);
\r
170 WinPrint("Net_Receive: read error\n");
\r
173 sock->remaining -= curread;
\r
174 sock->msg.size += curread;
\r
175 if (sock->remaining <= 0)
\r
177 sock->remaining = 0;
\r
178 memcpy(msg, &sock->msg, sizeof(netmessage_t));
\r
179 sock->msg.size = 0;
\r
180 return msg->size - 4;
\r
182 //the message has not been completely read yet
\r
184 printf("++timo TODO: debug the Net_Receive on big size messages\n");
\r
187 } //end of the function Net_Receive
\r
188 //===========================================================================
\r
192 // Changes Globals: -
\r
193 //===========================================================================
\r
194 socket_t *Net_AllocSocket(void)
\r
198 sock = (socket_t *) GetMemory(sizeof(socket_t));
\r
199 memset(sock, 0, sizeof(socket_t));
\r
201 } //end of the function Net_AllocSocket
\r
202 //===========================================================================
\r
206 // Changes Globals: -
\r
207 //===========================================================================
\r
208 void Net_FreeSocket(socket_t *sock)
\r
211 } //end of the function Net_FreeSocket
\r
212 //===========================================================================
\r
216 // Changes Globals: -
\r
217 //===========================================================================
\r
218 socket_t *Net_Connect(address_t *address, int port)
\r
222 sockaddr_t sendaddr;
\r
224 // see if we can resolve the host name
\r
225 WINS_StringToAddr(address->ip, &sendaddr);
\r
227 newsock = WINS_OpenReliableSocket(port);
\r
228 if (newsock == -1) return NULL;
\r
230 sock = Net_AllocSocket();
\r
233 WINS_CloseSocket(newsock);
\r
236 sock->socket = newsock;
\r
238 //connect to the host
\r
239 if (WINS_Connect(newsock, &sendaddr) == -1)
\r
241 Net_FreeSocket(sock);
\r
242 WINS_CloseSocket(newsock);
\r
243 WinPrint("Net_Connect: error connecting\n");
\r
247 memcpy(&sock->addr, &sendaddr, sizeof(sockaddr_t));
\r
248 //now we can send messages
\r
251 } //end of the function Net_Connect
\r
253 //===========================================================================
\r
257 // Changes Globals: -
\r
258 //===========================================================================
\r
259 socket_t *Net_ListenSocket(int port)
\r
264 newsock = WINS_OpenReliableSocket(port);
\r
265 if (newsock == -1) return NULL;
\r
267 if (WINS_Listen(newsock) == -1)
\r
269 WINS_CloseSocket(newsock);
\r
272 sock = Net_AllocSocket();
\r
275 WINS_CloseSocket(newsock);
\r
278 sock->socket = newsock;
\r
279 WINS_GetSocketAddr(newsock, &sock->addr);
\r
280 WinPrint("listen socket opened at %s\n", WINS_AddrToString(&sock->addr));
\r
283 } //end of the function Net_ListenSocket
\r
284 //===========================================================================
\r
288 // Changes Globals: -
\r
289 //===========================================================================
\r
290 socket_t *Net_Accept(socket_t *sock)
\r
293 sockaddr_t sendaddr;
\r
296 newsocket = WINS_Accept(sock->socket, &sendaddr);
\r
297 if (newsocket == -1) return NULL;
\r
299 newsock = Net_AllocSocket();
\r
300 if (newsock == NULL)
\r
302 WINS_CloseSocket(newsocket);
\r
305 newsock->socket = newsocket;
\r
306 memcpy(&newsock->addr, &sendaddr, sizeof(sockaddr_t));
\r
309 } //end of the function Net_Accept
\r
310 //===========================================================================
\r
314 // Changes Globals: -
\r
315 //===========================================================================
\r
316 void Net_Disconnect(socket_t *sock)
\r
318 WINS_CloseSocket(sock->socket);
\r
319 Net_FreeSocket(sock);
\r
320 } //end of the function Net_Disconnect
\r
321 //===========================================================================
\r
325 // Changes Globals: -
\r
326 //===========================================================================
\r
327 void Net_StringToAddress(char *string, address_t *address)
\r
329 strcpy(address->ip, string);
\r
330 } //end of the function Net_StringToAddress
\r
331 //===========================================================================
\r
335 // Changes Globals: -
\r
336 //===========================================================================
\r
337 void Net_MyAddress(address_t *address)
\r
339 strcpy(address->ip, WINS_MyAddress());
\r
340 } //end of the function Net_MyAddress
\r
341 //===========================================================================
\r
345 // Changes Globals: -
\r
346 //===========================================================================
\r
347 int Net_Setup(void)
\r
351 WinPrint("my address is %s\n", WINS_MyAddress());
\r
354 } //end of the function Net_Setup
\r
355 //===========================================================================
\r
359 // Changes Globals: -
\r
360 //===========================================================================
\r
361 void Net_Shutdown(void)
\r
364 } //end of the function Net_Shutdown
\r
365 //===========================================================================
\r
369 // Changes Globals: -
\r
370 //===========================================================================
\r
371 void NMSG_Clear(netmessage_t *msg)
\r
374 } //end of the function NMSG_Clear
\r
375 //===========================================================================
\r
379 // Changes Globals: -
\r
380 //===========================================================================
\r
381 void NMSG_WriteChar (netmessage_t *msg, int c)
\r
383 if (c < -128 || c > 127)
\r
384 WinPrint("NMSG_WriteChar: range error\n");
\r
386 if (msg->size >= MAX_NETMESSAGE)
\r
388 WinPrint("NMSG_WriteChar: overflow\n");
\r
391 msg->data[msg->size] = c;
\r
393 } //end of the function NMSG_WriteChar
\r
394 //===========================================================================
\r
398 // Changes Globals: -
\r
399 //===========================================================================
\r
400 void NMSG_WriteByte(netmessage_t *msg, int c)
\r
402 if (c < -128 || c > 127)
\r
403 WinPrint("NMSG_WriteByte: range error\n");
\r
405 if (msg->size + 1 >= MAX_NETMESSAGE)
\r
407 WinPrint("NMSG_WriteByte: overflow\n");
\r
410 msg->data[msg->size] = c;
\r
412 } //end of the function NMSG_WriteByte
\r
413 //===========================================================================
\r
417 // Changes Globals: -
\r
418 //===========================================================================
\r
419 void NMSG_WriteShort(netmessage_t *msg, int c)
\r
421 if (c < ((short)0x8000) || c > (short)0x7fff)
\r
422 WinPrint("NMSG_WriteShort: range error");
\r
424 if (msg->size + 2 >= MAX_NETMESSAGE)
\r
426 WinPrint("NMSG_WriteShort: overflow\n");
\r
429 msg->data[msg->size] = c&0xff;
\r
430 msg->data[msg->size+1] = c>>8;
\r
432 } //end of the function NMSG_WriteShort
\r
433 //===========================================================================
\r
437 // Changes Globals: -
\r
438 //===========================================================================
\r
439 void NMSG_WriteLong(netmessage_t *msg, int c)
\r
441 if (msg->size + 4 >= MAX_NETMESSAGE)
\r
443 WinPrint("NMSG_WriteLong: overflow\n");
\r
446 msg->data[msg->size] = c&0xff;
\r
447 msg->data[msg->size+1] = (c>>8)&0xff;
\r
448 msg->data[msg->size+2] = (c>>16)&0xff;
\r
449 msg->data[msg->size+3] = c>>24;
\r
451 } //end of the function NMSG_WriteLong
\r
452 //===========================================================================
\r
456 // Changes Globals: -
\r
457 //===========================================================================
\r
458 void NMSG_WriteFloat(netmessage_t *msg, float c)
\r
460 if (msg->size + 4 >= MAX_NETMESSAGE)
\r
462 WinPrint("NMSG_WriteLong: overflow\n");
\r
465 msg->data[msg->size] = *((int *)&c)&0xff;
\r
466 msg->data[msg->size+1] = (*((int *)&c)>>8)&0xff;
\r
467 msg->data[msg->size+2] = (*((int *)&c)>>16)&0xff;
\r
468 msg->data[msg->size+3] = *((int *)&c)>>24;
\r
470 } //end of the function NMSG_WriteFloat
\r
471 //===========================================================================
\r
475 // Changes Globals: -
\r
476 //===========================================================================
\r
477 void NMSG_WriteString(netmessage_t *msg, char *string)
\r
479 if (msg->size + strlen(string) + 1 >= MAX_NETMESSAGE)
\r
481 WinPrint("NMSG_WriteString: overflow\n");
\r
484 strcpy(&msg->data[msg->size], string);
\r
485 msg->size += strlen(string) + 1;
\r
486 } //end of the function NMSG_WriteString
\r
487 //===========================================================================
\r
491 // Changes Globals: -
\r
492 //===========================================================================
\r
493 void NMSG_ReadStart(netmessage_t *msg)
\r
495 msg->readoverflow = qfalse;
\r
497 } //end of the function NMSG_ReadStart
\r
498 //===========================================================================
\r
502 // Changes Globals: -
\r
503 //===========================================================================
\r
504 int NMSG_ReadChar(netmessage_t *msg)
\r
506 if (msg->size + 1 > msg->size)
\r
508 msg->readoverflow = qtrue;
\r
509 WinPrint("NMSG_ReadChar: read overflow\n");
\r
513 return msg->data[msg->read-1];
\r
514 } //end of the function NMSG_ReadChar
\r
515 //===========================================================================
\r
519 // Changes Globals: -
\r
520 //===========================================================================
\r
521 int NMSG_ReadByte(netmessage_t *msg)
\r
523 if (msg->read + 1 > msg->size)
\r
525 msg->readoverflow = qtrue;
\r
526 WinPrint("NMSG_ReadByte: read overflow\n");
\r
530 return msg->data[msg->read-1];
\r
531 } //end of the function NMSG_ReadByte
\r
532 //===========================================================================
\r
536 // Changes Globals: -
\r
537 //===========================================================================
\r
538 int NMSG_ReadShort(netmessage_t *msg)
\r
542 if (msg->read + 2 > msg->size)
\r
544 msg->readoverflow = qtrue;
\r
545 WinPrint("NMSG_ReadShort: read overflow\n");
\r
548 c = (short)(msg->data[msg->read] + (msg->data[msg->read+1]<<8));
\r
551 } //end of the function NMSG_ReadShort
\r
552 //===========================================================================
\r
556 // Changes Globals: -
\r
557 //===========================================================================
\r
558 int NMSG_ReadLong(netmessage_t *msg)
\r
562 if (msg->read + 4 > msg->size)
\r
564 msg->readoverflow = qtrue;
\r
565 WinPrint("NMSG_ReadLong: read overflow\n");
\r
568 c = msg->data[msg->read]
\r
569 + (msg->data[msg->read+1]<<8)
\r
570 + (msg->data[msg->read+2]<<16)
\r
571 + (msg->data[msg->read+3]<<24);
\r
574 } //end of the function NMSG_ReadLong
\r
575 //===========================================================================
\r
579 // Changes Globals: -
\r
580 //===========================================================================
\r
581 float NMSG_ReadFloat(netmessage_t *msg)
\r
585 if (msg->read + 4 > msg->size)
\r
587 msg->readoverflow = qtrue;
\r
588 WinPrint("NMSG_ReadLong: read overflow\n");
\r
591 c = msg->data[msg->read]
\r
592 + (msg->data[msg->read+1]<<8)
\r
593 + (msg->data[msg->read+2]<<16)
\r
594 + (msg->data[msg->read+3]<<24);
\r
596 return *(float *)&c;
\r
597 } //end of the function NMSG_ReadFloat
\r
598 //===========================================================================
\r
602 // Changes Globals: -
\r
603 //===========================================================================
\r
604 char *NMSG_ReadString(netmessage_t *msg)
\r
606 static char string[2048];
\r
612 if (msg->read + 1 > msg->size)
\r
614 msg->readoverflow = qtrue;
\r
615 WinPrint("NMSG_ReadString: read overflow\n");
\r
619 c = msg->data[msg->read];
\r
624 } while (l < sizeof(string)-1);
\r
627 } //end of the function NMSG_ReadString
\r