--- deliantra/server/socket/lowlevel.C 2007/07/30 02:03:03 1.56
+++ deliantra/server/socket/lowlevel.C 2008/05/06 16:55:26 1.64
@@ -1,10 +1,10 @@
/*
- * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
- * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
+ * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
* Copyright (©) 1992,2007 Frank Tore Johansen
*
- * Crossfire TRT is free software: you can redistribute it and/or modify
+ * Deliantra is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
@@ -17,7 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
- * The authors can be reached via e-mail to
+ * The authors can be reached via e-mail to
*/
using namespace std;
@@ -64,7 +64,7 @@
return;
}
- if (socket_ev.poll () & PE_W)
+ if (socket_ev.poll () & EV_WRITE)
return;
last_send = NOW;
@@ -101,7 +101,7 @@
else if (errno == EAGAIN)
{
// delay till ready
- socket_ev.poll (socket_ev.poll () | PE_W);
+ socket_ev.poll (socket_ev.poll () | EV_WRITE);
socket_ev.start ();
return;
}
@@ -113,7 +113,7 @@
}
}
- socket_ev.poll (socket_ev.poll () & ~PE_W);
+ socket_ev.poll (socket_ev.poll () & ~EV_WRITE);
}
/******************************************************************************
@@ -218,10 +218,11 @@
len -= 6;
}
- if (len > 4 && !strncmp (data, "say " , 4))
- return true;
- if (len > 5 && !strncmp (data, "chat ", 5))
- return true;
+ if (len > 4 && data [3] == ' ' && !strncmp (data, "say " , 4)) return true;
+ if (len > 5 && data [4] == ' ' && !strncmp (data, "chat " , 5)) return true;
+ if (len > 6 && data [5] == ' ' && !strncmp (data, "shout ", 6)) return true;
+
+ if (len == 7 && !strcmp (data, "suicide")) return true;
return false;
}
@@ -294,14 +295,14 @@
skip_packet (pkt_len);
// input buffer has space again
- socket_ev.poll (socket_ev.poll () | PE_R);
+ socket_ev.poll (socket_ev.poll () | EV_READ);
return true;
}
// callback called when socket is either readable or writable
void
-client::socket_cb (iow &w, int got)
+client::socket_cb (iow &w, int revents)
{
//TODO remove when we have better socket cleanup logic
if (destroyed ())
@@ -310,15 +311,15 @@
return;
}
- if (got & PE_W)
+ if (revents & EV_WRITE)
{
write_outputbuffer ();
if (!outputbuffer.len)
- socket_ev.poll (socket_ev.poll () & ~PE_W);
+ socket_ev.poll (socket_ev.poll () & ~EV_WRITE);
}
- if (got & PE_R)
+ if (revents & EV_READ)
{
//TODO: rate-limit tcp connection in better ways, important
@@ -327,7 +328,7 @@
if (!amount)
{
// input buffer full
- socket_ev.poll (socket_ev.poll () & ~PE_R);
+ socket_ev.poll (socket_ev.poll () & ~EV_READ);
return;
}
@@ -353,21 +354,17 @@
{
inbuf_len += amount;
- cmd_ev.start ();
+ if (handle_packet ())
+ {
+ while (handle_packet ())
+ ;
+
+ flush ();
+ }
}
}
}
-// called whenever we have additional commands to process
-void
-client::cmd_cb (iw &w)
-{
- if (handle_packet ())
- w.start ();
- else
- flush ();
-}
-
/*******************************************************************************
*
* Start of write related routines.
@@ -489,7 +486,15 @@
void
client::send_msg (int color, const char *type, const char *msg)
{
- if (msg_is_special (msg))
+ if (!msg || !type) // it can happen (for example, missing attack messages cause this)
+ {
+ LOG (logBacktrace | llevError, "send_msg(%d,%p,%p) called with NULL msg or type.\n", color, type, msg);
+ return;
+ }
+
+ int len = strlen (msg);
+
+ if (msg_is_special (msg) || (type [0] == 'c' && type [1] == '/') || len > (MAXSOCKBUF - 128))
cfperl_send_msg (this, color, type, msg);
else if (can_msg)
send_packet_printf ("msg %d %s %s", color & NDI_CLIENT_MASK, type, msg);