From d2a80ed1b2ca7687c92aa655418322333c9b26eb Mon Sep 17 00:00:00 2001 From: Volker Fischer Date: Sat, 2 Apr 2011 20:12:55 +0000 Subject: [PATCH] finished server list message --- src/protocol.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++++- src/protocol.h | 2 ++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/protocol.cpp b/src/protocol.cpp index 63273990..ebdfd6e8 100755 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -902,6 +902,7 @@ bool CProtocol::EvaluatePingMes ( const CVector& vecData ) return true; // return error code } + // invoke message action emit PingReceived ( static_cast ( GetValFromStream ( vecData, iPos, 4 ) ) ); return false; // no error @@ -1112,6 +1113,7 @@ bool CProtocol::EvaluateCLPingMes ( const CHostAddress& InetAddr, return true; // return error code } + // invoke message action emit CLPingReceived ( InetAddr, static_cast ( GetValFromStream ( vecData, iPos, 4 ) ) ); @@ -1243,6 +1245,7 @@ bool CProtocol::EvaluateCLRegisterServerMes ( const CHostAddress& InetAddr, return true; // return error code } + // invoke message action emit CLRegisterServerReceived ( InetAddr, RecServerInfo ); return false; // no error @@ -1317,7 +1320,92 @@ void CProtocol::CreateCLServerListMes ( const CHostAddress& InetAddr, bool CProtocol::EvaluateCLServerListMes ( const CHostAddress& InetAddr, const CVector& vecData ) { - // TODO + int iPos = 0; // init position pointer + const int iDataLen = vecData.Size(); + CVector vecServerInfo ( 0 ); + + while ( iPos < iDataLen ) + { + // check size (the next 11 bytes) + if ( ( iDataLen - iPos ) < 11 ) + { + return true; // return error code + } + + // IP address (4 bytes) + const quint32 iIpAddr = + static_cast ( GetValFromStream ( vecData, iPos, 4 ) ); + + // port number (2 bytes) + const quint16 iPort = + static_cast ( GetValFromStream ( vecData, iPos, 2 ) ); + + // country (2 bytes) + const QLocale::Country eCountry = + static_cast ( GetValFromStream ( vecData, iPos, 2 ) ); + + // number of connected clients (1 byte) + const int iNumClients = + static_cast ( GetValFromStream ( vecData, iPos, 1 ) ); + + // maximum number of connected clients (1 byte) + const int iMaxNumClients = + static_cast ( GetValFromStream ( vecData, iPos, 1 ) ); + + // "is permanent" flag (1 byte) + const bool bPermanentOnline = + static_cast ( GetValFromStream ( vecData, iPos, 1 ) ); + + // server name + QString strName; + if ( GetStringFromStream ( vecData, + iPos, + MAX_LEN_SERVER_NAME, + strName ) ) + { + return true; // return error code + } + + // server topic + QString strTopic; + if ( GetStringFromStream ( vecData, + iPos, + MAX_LEN_SERVER_TOPIC, + strTopic ) ) + { + return true; // return error code + } + + // server city + QString strCity; + if ( GetStringFromStream ( vecData, + iPos, + MAX_LEN_SERVER_CITY, + strCity ) ) + { + return true; // return error code + } + + // add server information to vector + vecServerInfo.Add ( + CServerInfo ( CHostAddress ( QHostAddress ( iIpAddr ), iPort ), + strName, + strTopic, + eCountry, + strCity, + iNumClients, + iMaxNumClients, + bPermanentOnline ) ); + } + + // check size: all data is read, the position must now be at the end + if ( iPos != iDataLen ) + { + return true; // return error code + } + + // invoke message action + emit CLServerListReceived ( InetAddr, vecServerInfo ); return false; // no error } diff --git a/src/protocol.h b/src/protocol.h index 223b89cd..d5b1a0b5 100755 --- a/src/protocol.h +++ b/src/protocol.h @@ -244,6 +244,8 @@ signals: void CLPingReceived ( CHostAddress InetAddr, int iMs ); void CLRegisterServerReceived ( CHostAddress InetAddr, CServerCoreInfo ServerInfo ); + void CLServerListReceived ( CHostAddress InetAddr, + CVector vecServerInfo ); }; #endif /* !defined ( PROTOCOL_H__3B123453_4344_BB2392354455IUHF1912__INCLUDED_ ) */